Docker Remote API 사용하기

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

Python 라이브러리 사용하기

이제 Python 라이브러리로 인증서를 사용한 Docker 데몬(TLS)에 접속해보겠습니다.

다음 내용을 docker-run-tls.py로 저장합니다. 인증서를 사용한 Docker 데몬에 접속하여 nginx 이미지를 받고 컨테이너로 실행하는 예제입니다.

docker-run-tls.py

import docker
from os.path import expanduser
home = expanduser('~')

tls_config = docker.tls.TLSConfig(
  client_cert=(home + '/.docker/cert.pem', home + '/.docker/key.pem'),
  ca_cert=home + '/.docker/ca.pem',
  verify=True
)
c = docker.Client(base_url='https://docker.example.com:2376', tls=tls_config)
c.pull(repository='nginx', tag='latest')
container_id = c.create_container(
  image='nginx:latest',
  ports=[80],
  volumes=['/data'],
  name='hello'
)
c.start(
  container_id,
  port_bindings={80: ('0.0.0.0', 80)},
  binds={'/data': {'bind': '/data', 'ro': False}}
)
  • docker.tls.TLSConfig 클래스를 생성합니다. client_cert에는 cert.pem, key.pem 파일의 경로를 설정하고, ca_cert에는 ca.pem 파일의 경로를 설정합니다. 반드시 절대 경로로 설정해야 하고, expanduser 함수를 이용하여 현재 리눅스 계정의 홈 디렉터리를 구한 뒤 .docker 디렉터리를 설정합니다. 그리고 인증서를 이용하여 접속하도록 verify=True로 설정합니다.
  • docker.Client 클래스를 생성합니다. base_url에는 https://docker.example.com:2376과 같이 https 프로토콜에 인증서를 생성할 때 입력했던 도메인을 설정합니다. tls에는 앞에서 생성한 tls_config를 설정합니다.
  • docker.Client 클래스로 생성한 인스턴스 cpull 함수를 실행합니다. 이미지 이름과 태그를 설정합니다.
  • c.create_container 함수로 컨테이너를 생성합니다. 이미지 이름, 호스트에 연결할 포트, 호스트와 연결할 디렉터리, 컨테이너 이름을 설정합니다.
  • c.start 함수로 컨테이너를 시작합니다. c.create_container 함수를 실행하고 받은 컨테이너 객체를 사용하고, 컨테이너 포트 번호와 외부에 노출할 포트 번호, 호스트 디렉터리와 연결할 컨테이너 디렉터리를 설정합니다.

이제 docker-run-tls.py 파일을 실행합니다.

$ sudo python docker-run-tls.py

컨테이너 목록을 출력하면 Python 라이브러리로 생성한 컨테이너가 표시됩니다.

$ sudo docker --tlsverify -H docker.example.com:2376 ps
CONTAINER ID  IMAGE    COMMAND  CREATED    STATUS       PORTS               NAMES
18e2d04f8753  nginx:1  "nginx"  1 sec...   Up 1 sec...  0.0.0.0:80->80/tcp  hello

-H 옵션에는 docker.example.com:2376과 같이 반드시 인증서를 생성할 때 입력한 도메인을 설정합니다.


저작권 안내

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

Published

30 November 2014