Docker Remote API 사용하기

이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20

기타 예제 및 함수

attach 함수: 컨테이너에 연결합니다.

  • container: 연결할 컨테이너의 객체 또는 이름입니다.
  • stdout: 표준 출력(stdout)을 연결합니다.
  • stderr: 표준 에러(stderr)를 연결합니다.
  • stream: 결과 값을 받을 때 HTTP 1.1 Chunked transfer encoding을 사용합니다.
  • logs: 로그를 출력합니다.
c.attach(container, stdout=True, stderr=True, stream=False, logs=False)

Python으로 입출력을 구현하려면 dockerpty를 사용하면 됩니다.

~$ git clone https://github.com/d11wtq/dockerpty.git
~$ cd dockerpty
~/dockerpty$ sudo python setup.py install

다음은 dockerpty를 사용하여 터미널에서 입출력을 하는 예제입니다.

docker-attach.py

import docker
import dockerpty

c = docker.Client(base_url='unix://var/run/docker.sock')
container_id = c.create_container(
  image='ubuntu:14.04',
  stdin_open=True,
  tty=True,
  command='/bin/bash'
)

dockerpty.start(c, container_id)

commit 함수: 컨테이너를 이미지로 저장합니다.

  • container: 커밋 기능을 사용할 컨테이너의 객체 또는 이름입니다.
  • repository: 생성할 이미지 이름이며 ’<Docker Hub 사용자 계정>/<이미지 이름>‘ 또는 ’<이미지 이름>‘ 형식입니다.
  • tag: 생성할 이미지의 태그입니다.
  • message: 커밋 로그 메시지입니다.
  • author: 이미지를 생성한 사람의 정보입니다. 예) ‘Hong, Gildong gd@yuldo.com
  • conf: 이미지를 생성할 때 필요한 설정 값입니다.
c.commit(container, repository=None, tag=None, message=None, author=None,
         conf=None)

docker-commit.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
c.pull(repository='nginx', tag='latest')
container_id = c.create_container(
  image='nginx:latest',
  ports=[80],
  volumes=['/data']
)
c.commit(
  container_id,
  repository='hello',
  tag='0.1',
  message='example message',
  author='Hong, Gildong <gd@yuldo.com>',
  conf={
    'Hostname':'',
    'User':'',
    'Memory':0,
    'MemorySwap':0,
    'AttachStdin':False,
    'AttachStdout':False,
    'AttachStderr':True,
    'PortSpecs':None,
    'Tty':False,
    'OpenStdin':False,
    'StdinOnce':False,
    'Env':None,
    'Cmd':[
      '/bin/bash'
    ],
    'Volumes':{
      '/data':{}
    },
    'WorkingDir':'',
    'DisableNetwork':False,
    'ExposedPorts':{
      '80/tcp':{}
    }
  }
)

copy 함수: 컨테이너에서 파일을 가져옵니다.

  • container: 파일을 가져올 컨테이너의 객체 또는 이름입니다.
  • resource: 컨테이너 안의 파일 경로입니다.
  • 리턴값은 urllib3.response.HTTPResponse이며 .data에 tar 형식으로 데이터가 저장되어 있습니다.
c.copy(container, resource)

docker-cp.py

import docker
import tarfile
import io

c = docker.Client(base_url='unix://var/run/docker.sock')
container_id = c.create_container(
  image='nginx:latest',
  ports=[80],
  volumes=['/data']
)
c.start(container_id)
response = c.copy(container_id, '/etc/nginx.conf')
t = tarfile.open(fileobj=io.BytesIO(response.data))
t.extractall();

diff 함수: 이미지와 컨테이너 간의 바뀐 부분을 출력합니다.

  • container: 비교할 컨테이너의 객체 또는 이름입니다.
c.diff(container)

docker-diff.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
container_id = c.create_container(
  image='nginx:latest',
  ports=[80],
  volumes=['/data']
)
c.start(container_id)
print c.diff(container_id)

export 함수: 컨테이너를 tar 파일로 저장합니다.

  • container: tar 파일로 저장할 컨테이너의 객체 또는 이름입니다.
c.export(container)

docker-export.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
container_id = c.create_container(
  image='nginx:latest',
  ports=[80],
  volumes=['/data']
)
c.start(container_id)
response = c.export(container_id)
with open('./nginx.tar', 'wb') as f:
  f.write(response.data)

history 함수: 이미지의 히스토리를 출력합니다.

  • image: 히스토리를 출력할 이미지 이름이며 ’<이미지 이름>:<태그>‘ 또는 ’<이미지 이름>‘ 입니다.
c.history(image)

docker-history.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
print c.history('nginx:latest')

import_image 함수: tar 파일을 사용하여 이미지를 생성합니다.

  • src: tar 파일의 경로입니다.
  • repository: 생성할 이미지 이름이며 ’<Docker Hub 사용자 계정>/<이미지 이름>‘ 또는 ’<이미지 이름> 형식입니다.
  • tag: 생성할 이미지의 태그입니다.
  • image: 기존에 있는 이미지를 가져옵니다. 예) ‘nginx:latest’
c.import_image(src=None, repository=None, tag=None, image=None)

docker-import.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
c.import_image(src='./nginx.tar', repository='hello', tag='0.1')

info 함수: 현재 Docker의 컨테이너, 이미지 개수, Execution Driver, Storage Driver, 커널 버전 등의 정보를 출력합니다.

c.info()

docker-info.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
print c.info()

inspect_container 함수: 컨테이너의 세부 정보를 출력합니다.

  • container: 세부 정보를 출력할 컨테이너의 객체 또는 이름입니다.
c.inspect_container(container)

docker-inspect-container.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
container_id = c.create_container(
  image='nginx:latest',
  ports=[80],
  volumes=['/data']
)
c.start(container_id)
print c.inspect_container(container_id)

inspect_image 함수: 이미지의 세부 정보를 출력합니다.

  • 세부 정보를 출력할 이미지 ID입니다.
c.inspect_image(image_id)

docker-inspect-image.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
print c.inspect_image('nginx:latest')

kill 함수: 컨테이너를 강제 종료합니다.

  • container: 종료할 컨테이너의 객체 또는 이름입니다.
  • signal: 컨테이너에 특정 시그널을 보냅니다. 예) ‘KILL’
c.kill(container, signal=None)

docker-kill.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
container_id = c.create_container(
  image='nginx:latest',
  ports=[80],
  volumes=['/data']
)
c.start(container_id)
c.kill(container_id)

login 함수: Docker Hub에 로그인합니다.

  • username: Docker Hub 계정입니다.
  • password: Docker Hub 계정의 비밀번호입니다.
  • email: Docker Hub에 가입할 때 사용한 이메일 주소입니다.
  • registry: 레지스트리 서버 주소입니다. 기본 값은 Docker Hub입니다.
c.login(username, password=None, email=None, registry=None)

docker-login.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
c.login(username='exampleuser',
        password='examplepassword',
        email='exampleuser@example.com')

logs 함수: 컨테이너의 표준 출력, 표준 에러를 출력합니다.

  • container: 로그를 출력할 컨테이너의 객체 또는 이름입니다.
  • stdout: 표준 출력을 출력합니다.
  • stderr: 표준 에러를 출력합니다.
  • stream: 결과 값을 받을 때 HTTP 1.1 Chunked transfer encoding을 사용합니다.
  • timestamps: 시간값을 출력합니다.
c.logs(container, stdout=True, stderr=True, stream=False, timestamps=False)

docker-logs.py

import docker
import time

c = docker.Client(base_url='unix://var/run/docker.sock')
c.pull('ubuntu', tag='14.04')
container_id = c.create_container(
  image='ubuntu:14.04',
  command='/bin/bash -c "while sleep 1; do echo 1; done"',
)
c.start(container_id)
time.sleep(5)
print c.logs(container_id)

port 함수: 컨테이너에서 호스트에 연결되고 외부에 노출된 포트를 조회합니다.

  • container: 조회할 컨테이너의 객체 또는 이름입니다.
  • private_port: 조회할 포트 번호입니다. 예) 80
c.port(container, private_port)

docker-port.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
container_id = c.create_container(
  image='nginx:latest',
  ports=[80],
  volumes=['/data']
)
c.start(
  container_id,
  port_bindings={80: ('0.0.0.0', 80)}
)
print c.port(container_id, 80)

push 함수: 이미지를 저장소에 올립니다.

  • repository: 이미지 이름이며 ’<Docker Hub 사용자 계정>/<이미지 이름>‘ 형식입니다.
  • tag: 이미지의 태그입니다.
  • stream: 결과 값을 받을 때 HTTP 1.1 Chunked transfer encoding을 사용합니다.
c.push(repository, tag=None, stream=False)

docker-push.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
#c.push(repository='localhost:5000/hello', tag='0.1') # 개인 저장소

c.login(username='exampleuser',
        password='examplepassword',
        email='exampleuser@example.com')
c.push(repository='exampleuser/hello', tag='0.1')     # Docker Hub

remove_container 함수: 컨테이너를 삭제합니다.

  • container: 삭제할 컨테이너의 객체 또는 이름입니다.
  • v: 컨테이너와 연결된 데이터 볼륨을 함께 삭제합니다.
  • link: docker run 명령의 --link 옵션으로 컨테이너를 연결했을 때 연결 상태만 삭제합니다. 예) ‘web/db’
c.remove_container(container, v=False, link=False)

docker-remove-container.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
c.remove_container('hello-nginx')

remove_image 함수: 이미지를 삭제합니다.

  • image: 삭제할 이미지 이름입니다. 예) ‘nginx:latest’
c.remove_image(image)
import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
c.remove_image('nginx:latest')

restart 함수: 컨테이너를 재시작합니다.

  • container: 재시작할 컨테이너의 객체 또는 이름입니다.
  • timeout: 컨테이너가 종료될 때까지 지정한 시간 동안 대기합니다. 초 단위입니다.
c.restart(container, timeout=10)

docker-restart.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
c.restart('hello-nginx')

search 함수: Docker Hub에서 이미지를 검색합니다.

  • term: 검색할 단어입니다.
c.search(term)

docker-search.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
print c.search('nginx')

stop 함수: 컨테이너를 정지합니다.

  • container: 정지할 컨테이너의 객체 또는 이름입니다.
  • timeout: 컨테이너가 종료될 때까지 지정한 시간 동안 대기합니다. 초 단위입니다.
c.stop(container, timeout=10)

docker-stop.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
c.stop('hello-nginx')

tag 함수: 이미지에 태그를 설정합니다.

  • image: 이미지 이름입니다. 예) ‘hello:0.1’
  • repository: 레지스트리 서버 주소와 이미지 이름입니다. 예) ‘192.168.0.10:5000/hello’
  • tag: 생성할 이미지의 태그입니다.
  • force: 강제로 태그를 설정합니다.
c.tag(image, repository, tag=None, force=False)

docker-tag.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
#c.tag('hello:0.1', 'localhost:5000/hello', '0.1')  # 개인 저장소
c.tag('hello:0.1', 'exampleuser/hello', '0.1')      # Docker Hub

top 함수: 컨테이너에서 현재 실행되고 있는 프로세스 목록을 출력합니다.

  • container: 프로세스 목록을 출력할 컨테이너의 객체 또는 이름입니다.
c.top(container)

docker-top.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
print c.top('hello-nginx')

version 함수: Docker 버전 정보를 출력합니다.

c.version()

docker-version.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
print c.version()

wait 함수: 컨테이너가 정지될 때까지 대기합니다. 컨테이너가 정지되면 Exit Code를 출력합니다.

  • container: 대기할 컨테이너의 객체 또는 이름입니다.
c.wait(container)

docker-wait.py

import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
container_id = c.create_container(
  image='nginx:latest',
  ports=[80],
  volumes=['/data']
)
c.start(container_id)
print c.wait(container_id)

저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

30 November 2014