가장 빨리 만나는 Docker 14장 - 1.2. 이미지 생성하기

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

Docker Remote API 사용하기

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

이미지 생성하기

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

docker-build.py
import docker
import io

script = io.StringIO(u'\n'.join([
  'FROM ubuntu:14.04',
  'MAINTAINER Foo Bar <foo@bar.com>',
  'RUN apt-get update',
  'RUN apt-get install -y nginx',
  'RUN echo "\\ndaemon off;" >> /etc/nginx/nginx.conf',
  'RUN chown -R www-data:www-data /var/lib/nginx',
  'VOLUME ["/data", "/etc/nginx/site-enabled", "/var/log/nginx"]',
  'WORKDIR /etc/nginx',
  'CMD ["nginx"]',
  'EXPOSE 80',
  'EXPOSE 443'
]))

c = docker.Client(base_url='unix://var/run/docker.sock')
c.build(tag='hello:0.1', quiet=True, fileobj=script, rm=True)
  • io.StringIO 함수를 사용하여 Dockerfile의 내용을 생성합니다.
  • docker.Client 클래스를 생성합니다. base_url에는 Docker 데몬의 유닉스 소켓 경로를 설정합니다.
  • docker.Client 클래스로 생성한 인스턴스 cbuild 함수를 실행합니다. 이미지 이름과 태그를 설정합니다. 이미지를 생성하면서 출력되는 결과를 표시하지 않도록 quiet=True로 설정하고, 이미지 생성을 완료했을 때 임시 이미지를 삭제하도록 rm=True로 설정합니다. fileobj에는 앞에서 생성한 script를 설정합니다.

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

$ sudo python docker-build.py

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

$ sudo docker ps
REPOSITORY    TAG      IMAGE ID        CREATED              VIRTUAL SIZE
hello         0.1      8da15999194f    About an hour ago    263.8 MB
ubuntu        14.04    c4ff7513909d    2 weeks ago          225.4 MB

build 함수: 이미지를 생성합니다.

  • path: Dockerfile의 경로입니다. 디렉터리 경로뿐만 아니라 http://, https://, git://을 사용할 수 있습니다.
  • tag: 이미지 이름 및 태그입니다.
  • quiet: 이미지를 생성하면서 출력되는 결과를 표시하지 않습니다.
  • fileobj: Docker 파일을 객체 형식으로 설정합니다. fileobj를 설정하면 path는 무시됩니다.
  • nocache: 빌드 결과를 캐시하지 않습니다.
  • rm: 이미지 생성을 완료했을 때 임시 이미지를 삭제합니다.
  • stream: 결과 값을 받을 때 HTTP 1.1 Chunked transfer encoding을 사용합니다.
  • timeout: 접속 대기 시간이며 초 단위입니다.
  • custom_context: tar, tar.gz 등의 파일을 읽어서 사용할 때 True로 설정합니다. 파일 내용은 fileobj에 설정해야 합니다.
  • encoding: custom_context가 압축이 되어 있으면 압축 형식을 지정합니다. 예) 'gzip'
c.build(path=None, tag=None, quiet=False, fileobj=None, nocache=False,
        rm=False, stream=False, timeout=None,
        custom_context=False, encoding=None)

다음은 현재 디렉터리에 Dockerfile이 있을 때 이미지를 생성하는 예제입니다.

docker-build-local.py
import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
c.build(path='.', tag='hello:0.1', quiet=True, rm=True)

다음은 Dockerfile 및 필요한 파일을 hello.tar.gz로 압축했을 때 이미지를 생성하는 예제입니다.

docker-build-gzip.py
import docker

script = open('./hello.tar.gz', 'r')

c = docker.Client(base_url='unix://var/run/docker.sock')
c.build(tag='hello:0.1', quiet=True, fileobj=script, 
        rm=True, custom_context=True, encoding='gzip')

다음은 GitHub 또는 웹에서 Dockerfile을 받아서 이미지를 생성하는 예제입니다. 단 http://로 파일을 받을 때는 tar, tar.gz 파일은 사용할 수 없습니다.

docker-build-remote.py
import docker

c = docker.Client(base_url='unix://var/run/docker.sock')
c.build(
  path='github.com/pyrasis/dind.git',     # GitHub
  #path='http://example.com/Dockerfile',  # http
  tag='hello:0.1', quiet=True, rm=True
)

저작권 안내

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

Published

2014-11-30