[Docker] Dockerfile에 대해
1. Dockerfile이란?
도커 명령어로 컨테이너를 구성하기 위해서는 컨테이너 생성, 컨테이너 안에서 OS설정, 미들웨어 설치, 파라미터 설정 등은 모두 직접 수행해야 한다. 이러한 일련의 작업을 자동으로 수행하도록 스크립트로 만든 것이 Dockerfile이다. 이러한 Dockerfile은 필요한 환경설정이 모두 세팅된 image를 만드는 데 목적이 있으며, 또한 자동화로써 사용할 수 있고 스크립트이므로 변경해서 재사용할 수도 있다.
Dockerfile의 내용은 아래와 같은 정보들을 기술한다:
- 베이스가 될 도커 이미지
- 도커 컨테이너 안에서의 수행할 명령, 조작 등
- 환경변수 등의 설정
- 도커 컨테이너 안에서 작동시킬 데몬 실행
2. Dockerfile의 기본 구문
Dockerfile은 텍스트 형식이며 확장자는 없다. 어떠한 에디터로든 작성해도 상관이 없다.
기본적으로 Dockerfile이라는 이름을 사용한다. 만약 이름을 변경하는 경우, 사용 시 따로 옵션을 줘서 해당 파일명을 명시해 주어야 한다.
기본 서식은 FROM centos:centos7와 같이 "명령 인수" 형식이다. 또한 명령은 대소문자를 가리지는 않지만, 가독성을 위해 관례적으로 대문자를 사용한다. 또한 주석은 맨 앞에 "#"을 붙이면 된다.
명령어와 각 용도는 아래 표를 참조하자.
명령 | 설명 | 상세 |
FROM | 베이스 이미지 지정 | docker 컨테이너를 어떤 docker 이미지로부터 생성할지 기술 |
RUN | 명령 실행 | from에서 지정한 베이스 이미지에 대해 수행하는 명령 |
CMD | 컨테이너 실행 명령 | from에서 지정한 베이스 이미지에 대해 데몬을 실행하는데 자주 사용 |
LABEL | 라벨 설정 | 도커파일에 기술할 기타정보들을 기록한다. 만든사람, 버전 등 |
EXPOSE | 포트 익스포트 | 포트를 오픈한다. |
ENV | 환경변수 | 도커파일 안에서 환경변수를 설정한다. |
ADD | 파일/디렉토리 추가 | |
COPY | 파일 복사 | |
ENTRYPOINT | 컨테이너 실행 명령 | cmd와 동일하나 컨테이너 생성명령 수행시 무조건 우선적이다. |
VOLUME | 볼륨 마운트 | |
USER | 사용자 지정 | 특정 명령을 수행할 때 사용할 사용자를 명시한다. |
WORKDIR | 작업 디렉토리 | 명령어가 실행될 경로를 지정 |
ARG | dockerfile 안의 변수 | 도커파일에서 변수를 만들 때 사용 |
ONBUILD | 빌드 완료 후 실행되는 명령 | 빌드한 후 나온 이미지를 다시 빌드할 때 실행되는 명령 |
STOPSIGNAL | 시스템 콜 시그널 설정 | 컨테이너 종료시 사용할 시그널 설정 |
HEALTHCHECK | 컨테이너의 헬스체크 | 일정 주기로 컨테이너의 헬스를 체크하여 결과를 inspect로 볼수있게 한다. |
SHELL | 기본 쉘 설정 | 도커파일에서 사용할 쉘 지정 |
3. Dockerfile build
docker build는 Dockerfile에 기술된 구성 정보를 바탕으로 도커 이미지를 생성한다.
즉 Dockerfile을 작성하고 container를 생성하는 프로세스는 다음과 같다.
Dockerfile 생성 -> docker build로 이미지 생성 -> 생성된 이미지로 docker container run 수행
dockerfile에 명시된 이미지가 없는 경우 자동으로 다운로드를 받으며, 그것이 베이스 이미지가 된다. 그리고 이후 명령어들을 모두 수행한 다음, 그 상태를 이미지로 만든다. 만들어진 이미지의 이름을 build 명령 수행 시 명시해야 한다.
만일 Dockerfile의 이름을 그대로 쓰지 않도 다른 파일명으로 쓰는 경우, "-f"옵션과 함께 파일명을 명시해주는데, 이럴 경우 Docker hub에서 이미지 자동 생성 기능을 사용할 수 없다.
사용법
$docker build -t [생성하고자하는이미지명]:[태그명] [dockerfile위치]
예시
$docker build -t sample:tag -f Dockerfile-base .
맨 뒤의 "."은 현재 경로를 의미한다. 현재 경로에 있는 Dockerfile을 가지고 Docker을 build한다.
# 주의사항1
Dockerfile을 빌드할 때, 내용을 검증하지 않기 때문에, 에러가 발생하지 않도록 직접 잘 검증하여 작성해야한다.
# 주의사항2
Dockerfile 빌드 시, 해당 Dockerfile이 있는 디렉토리 전체의 내용을 모두 docker daemon으로 전송한다. 예를 들어 루트 리렉토리에 Dockerfile을 놓고 build를 하면 불필요한 자원을 낭비할 것이다. 따라서 dockerfile은 따로 빈 디렉토리 안에 만들어 놓고 build를 수행하는것을 권장한다. (이런 이유때문에 .dockerignore파일이 존재한다.)
# 참고: .dockerignore파일이란?
도커에서 빌드하면 빌드를 실행한 디렉토리 아래에 있는 모든 파일이 docker 데몬으로 전송된다. 빌드에서 제외하고 싶은 파일이 있는 경우, 이를 ".dockerignore"라는 이름의 파일 안에 해당 파일명을 기술하면, 해당 파일은 대상에서 제외된다. 당연하게도 Dockerfile에 ADD등으로 사용할 파일인데 .dockerignore에 작성하게 되면 파일이 없다고 에러가 발생하니 주의하자.
#References
https://help.iwinv.kr/manual/read.html?idx=582