가장 빨리 만나는 Docker 14장 - 1.1. 컨테이너 생성 및 시작하기

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

Docker Remote API 사용하기

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

컨테이너 생성 및 시작하기

다음 내용을 docker-run.py로 저장합니다. nginx 이미지를 받고 컨테이너로 실행하는 예제입니다.

docker-run.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'],
  name='hello'
)
c.start(
  container_id,
  port_bindings={80: ('0.0.0.0', 80)},
  binds={'/data': {'bind': '/data', 'ro': False}}
)
  • docker.Client 클래스를 생성합니다. base_url에는 Docker 데몬의 유닉스 소켓 경로를 설정합니다.
  • docker.Client 클래스로 생성한 인스턴스 cpull 함수를 실행합니다. 이미지 이름과 태그를 설정합니다.
  • c.create_container 함수로 컨테이너를 생성합니다. 이미지 이름, 호스트에 연결할 포트, 호스트와 연결할 디렉터리, 컨테이너 이름을 설정합니다.
  • c.start 함수로 컨테이너를 시작합니다. c.create_container 함수를 실행하고 받은 컨테이너 객체를 사용하고, 컨테이너 포트 번호와 외부에 노출할 포트 번호, 호스트 디렉터리와 연결할 컨테이너 디렉터리를 설정합니다.

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

$ sudo python docker-run.py

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

$ sudo docker ps
CONTAINER ID  IMAGE    COMMAND  CREATED    STATUS       PORTS               NAMES
fda50393ec9f  nginx:1  "nginx"  1 sec...   Up 1 sec...  0.0.0.0:80->80/tcp  hello

docker.Client 클래스: Docker 명령을 실행할 기본 객체를 생성합니다.

  • base_url: Docker 데몬 주소와 포트 번호입니다.
    • 유닉스 소켓: unix://
    • 일반 HTTP 프로토콜: tcp://, 포트 번호 4243
    • 인증서를 사용한 HTTPS 프로토콜(TLS): https://, 포트 번호 2376
  • version: Docker Remote API의 특정 버전을 사용합니다. Docker 실행 파일의 버전과는 다릅니다.
    https://docs.docker.com/reference/api/docker_remote_api/
  • timeout: 접속 대기 시간이며 초 단위입니다.
c = docker.Client(base_url='unix://var/run/docker.sock',
                  version='1.12',
                  timeout=10)

pull 함수: 저장소에서 이미지를 받아옵니다.

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

create_container 함수: 컨테이너를 생성합니다.

  • image: 컨테이너로 생성할 이미지 이름이며 '<Docker Hub 사용자 계정>/<이미지 이름>' 또는 '<이미지 이름>' 형식입니다.
  • command: 컨테이너가 시작했을 때 실행할 명령입니다. 예) '/bin/bash' 또는 ['node', 'app.js']
  • hostname: 컨테이너의 호스트 이름입니다.
  • user: command, entrypoint에 설정한 명령을 컨테이너 안의 특정 사용자로 실행합니다. 사용자명이나 UID를 설정할 수 있습니다.
  • detach: 데몬 모드로 실행합니다. docker run 명령의 -d 옵션입니다.
  • stdin_open: 기본 입력(stdin)을 연결합니다. docker run 명령의 -i 옵션입니다.
  • tty: pseudo tty를 할당합니다. docker run 명령의 -t 옵션입니다.
  • mem_limit: 메모리 한계를 설정합니다. 예) '100000b', '1000k', '128m', '1g'
  • ports: 호스트에 연결할 포트입니다.
    • 예) [80, 443]
    • 예) [(100, 'udp'), 200]
  • environment: 환경 변수입니다. 예) ['Hello=1', 'Workd=2'] 또는 {'Hello': '1', 'World': '2'}
  • volumes: 호스트와 연결할 디렉터리입니다(데이터 볼륨). 예) ['/data', '/www']
  • network_disabled: 네트워크를 비활성화합니다.
  • name: 컨테이너 이름입니다.
  • entrypoint: 컨테이너가 시작했을 때 실행할 명령입니다. command와 entrypoint의 차이점은 '7.6 ENTRYPOINT'를 참조하기 바랍니다. 예) '/bin/bash' 또는 ['node', 'app.js']
  • cpu_shares: CPU 자원을 할당할 때 가중치 설정이며 숫자 형식입니다..
  • working_dir: command, entrypoint에 설정한 명령이 실행될 디렉터리입니다.
  • memswap_limit: 메모리 스왑 한계 설정이며 숫자 형식입니다.
c.create_container(image, command=None, hostname=None, user=None,
                   detach=False, stdin_open=False, tty=False, mem_limit=0,
                   ports=None, environment=None, dns=None, volumes=None,
                   network_disabled=False, name=None, entrypoint=None,
                   cpu_shares=None, working_dir=None, memswap_limit=0)

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

  • container: 시작할 컨테이너의 객체 또는 이름입니다.
  • binds: 컨테이너의 디렉터리를 호스트의 특정 디렉터리에 연결합니다. create_container 함수에서 volumes를 설정해야 합니다. ro는 읽기 전용 옵션입니다.
    • 예) {'/data': {'bind': '/data', 'ro': False}, '/www': {'bind': '/www', 'ro': False}}
  • port_bindings: 호스트에 연결된 포트를 외부에 노출합니다.
    • 예) {80: ('0.0.0.0', 80), 443: ('0.0.0.0', 443)}
    • 예) {80: ('0.0.0.0',), 443: ('0.0.0.0',)}
    • 예) {'100/udp': 100, 200: None}
    • 예) {80: 80, 443: None}
  • lxc_conf: LXC 드라이버를 사용했을 때의 옵션 설정입니다.
  • publish_all_ports: 호스트에 연결된 모든 포트를 외부에 노출합니다. docker run 명령의 -P 옵션입니다.
  • links: 컨테이너를 연결하는 옵션입니다. 예) {'db': 'db', 'hello': 'hello'}
  • privileged: 호스트 커널의 기능을 모두 사용할 수 있도록 설정합니다.
  • dns: 추가 DNS 서버 설정입니다. 예) ['168.126.63.1', '192.168.0.100']
  • dns_search: 추가 검색 도메인 설정입니다. 예) ['hello.com', 'world.com']
  • volumes_from: 데이터 볼륨 컨테이너 설정입니다. 예) ['hello-volume', 'world-volume']
  • network_mode: 네트워크 모드 설정입니다. 예) 'bridge', 'none', 'host'
  • restart_policy: 컨테이너가 종료되었을 때 자동으로 재시작할지 설정합니다.
    • 종료되었을 때 항상 재시작: {'MaximumRetryCount': 0, 'Name': 'always'}
    • 종료되었을 때 10번까지 재시도: {'MaximumRetryCount': 10, 'Name': 'on-failure'}
c.start(container, binds=None, port_bindings=None, lxc_conf=None,
        publish_all_ports=False, links=None, privileged=False, dns=None, 
        dns_search=None, volumes_from=None, network_mode=None, restart_policy=None)

저작권 안내

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

Published

2014-11-30