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
명령을 순서대로 실행한다. 또한 Dockerfile
은 FROM
명령으로 시작해야 한다.
환경 대체
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
명령을 수행한다.
주의 :
RUN
과CMD
를 혼돈하지 말자.RUN
은 실제로 명령을 수행하고 결과를 커밋한다. 빌드 시,CMD
는 아무것도 실행하지 않지만 이미지에 의도한 명령을 지정한다.
이미지 삭제
이미지 삭제는 docker rmi
명령으로 할 수 있다.