Docker 이미지

도커 이미지는 분리된 환경이다.

도커에서 실제 실행되는 것은 이미지가 아니다. 도커 이미지는 도커 컨테이너를 만드는데 사용하는 템플릿이다.

이미지 생성

이미지를 생성하는 방법은 3가지가 있다.

  • docker pull
  • docker commit
  • Dockerfile
    • RUN : 쉘 명령어 실행
    • ENV : 환경 변수 설정
    • EXPOSE : 오픈 port
    • CMD : 실행 컨테이너에 제공할 기본 값

1. docker pull

기본 어법은 docker pull NAME[:TAG]이다. TAG가 없을 경우에 도커 엔진은 :latest를 기본값으로 사용한다.

$ docker pull python
$ docker pull python:3.6.0-slim

로컬에 있는 이미지를 확인하려면 docker images를 사용한다.

2. docker commit

컨테이너의 변경사항을 반영해 새로운 이미지를 만든다. 기본 어법은 docker commit CONTAINER [REPOSITORY[:TAG]]이다.

$ docker ps
CONTAINER ID  IMAGE         COMMAND   ...
c3f279d17e0a  ubuntu:12.04  /bin/bash ...

$ docker commit c3f279d17e0a pyubuntu:init
$ docker images

3. Dockerfile

도커는 Dockerfile의 명령들을 읽어 자동으로 이미지를 만든다. docker build를 사용해 여러 명령들을 실행하는 자동화된 빌드를 만들 수 있다.

$ l
-rw-r--r--   1 hmlim  staff   721B May  3 17:46 Dockerfile

# Dockerfile이 있는 위치에서 명령 실행
$ docker build .

-f 옵션을 사용해 Dockerfile의 위치를 지정하여 빌드할 수 있다.

$ docker build -f /path/to/a/Dockerfile .

# -t 옵션을 이용해 태그를 설정해 빌드
$ docker build -t pyubuntu:init -f /path/to/a/Dockerfile .

Dockerfile 형식

# Comment
INSTRUCTION arguments

명령(instruction)은 대소문자를 구별하지 않지만, 인수와 쉽게 구별하기 위해 대문자로 쓴다.

도커는 Dockerfile 명령을 순서대로 실행한다. 또한 DockerfileFROM 명령으로 시작해야 한다.

환경 대체

ENV 명령으로 선언한 환경 변수들은 특정 명령에서 변수로 사용할 수 있다. 환경변수는 Dockerfile$variable_name 또는 ${variable_name}으로 표시한다.

FROM

FROM <image>
FROM <image>[:<tag>]

# example
FROM ubuntu:16.04

FROM 명령은 새 빌드 단계를 초기화하고 다음 명령을 위한 기본 이미지(Base Image) 설정한다. 공개 저장소(Public Repositories) 에서 이미지를 가져와서 시작하는 것이 쉽다.

RUN

RUN <command>
RUN ["executable", "param1", "param2"]

# example
RUN echo "hello1"
RUN ["echo", "hello2"]

RUN 명령을 현재 이미지의 위에 새로운 레이어 실행하고 결과를 커밋한다. 커밋한 이미지를 다음 단계에 사용한다.

CMD

CMD ["executable", "param1", "param2"]  # exec 형식
CMD command param1 param2  # shell 형식

# example
CMD ["sh", "-c", "echo cmd1"]
CMD echo "cmd2"

Dockerfile에는 하나의 CMD 명령만 있다. 둘 이상의 CMD가 있다면, 마지막 CMD 명령만 적용된다. CMD주 목적은 실행중인 컨테이너에 기본값을 제공하는 것이다.

shell 또는 exec 형식을 사용하면, 이미지를 실행할 때 CMD 명령을 수행한다.

주의 : RUNCMD를 혼돈하지 말자. RUN은 실제로 명령을 수행하고 결과를 커밋한다. 빌드 시, CMD는 아무것도 실행하지 않지만 이미지에 의도한 명령을 지정한다.

이미지 삭제

이미지 삭제는 docker rmi 명령으로 할 수 있다.