1. Dockerfile
Dockerfile은 새로운 도커 이미지를 빌드할 때 사용하는 파일이다. Docker는 Dockerfile에 작성되어 있는 명령어를 읽어들여 자동으로 이미지를 빌드할 수 있다.
Dockerfile은 텍스트 문서로 사용자가 이미지를 빌드하기 위한 명령어 들로 구성되어있다. Dockerfile을 실행하기 위해서는 'docker build' 명령어를 사용하여 실행한다. docker build 명령어 실행 시, Dockerfile에 작성되어 있는 명령어들로 도커 이미지를 빌드한다.
2. Usage
'docker build' 명령어는 Dockerfile의 내용과 context를 통해 이미지를 빌드한다. 빌드 context는 해당 위치의 PATH 또는 url에 있는 파일들의 집합을 의미한다.
build context는 재귀적으로 동작하기 때문에 PATH의 하위 디렉토리나 url의 하위 저장소, 모듈 등을 모두 포함한다.
docker build는 CLI가 아닌 Docker daemon에 의해 실행된다. 빌드 과정의 첫번째는 전체 context를 daemon에게전송하는 것이다. 대부분의 경우 비어있는 디렉토리에 Dockerfile과 빌드에 필요한 파일들만을 위치시켜 실행하는 것이다.
build context를 사용하기 위해서는 해당 내용들이 명령어로 Dockerfile에 참조되고 있어야 한다. build의 성능을 올리기 위해서는 .dockerignore 파일에 외부 파일, 디렉토리 등을 포함하여 불필요한 파일들을 context 대상에서 제외해야 한다.
일반적으로 Dockerfile은 파일 이름을 'Dockerfile'로 하여 context의 root에 위치한다.
만약 다른 위치의 Dockerfile을 빌드하기 위해서는 -f 옵션을 사용하여 docker build 위치를 옵션으로 주어 현재 위치가 아닌 다른 위치에 있는 Dockerfile을 빌드할 수 있다.
$ docker build -f /path/to/a/Dockerfile .
-t 옵션을 사용하여 빌드하는 이미지에 태그를 추가할 수 있다.
빌드한 이미지를 여러 개로 저장하기 위해 -t 옵션을 여러번 사용할 수 있다.
$ docker build -t shykes/myapp .
$ docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
Docker daemon은 명령어를 실행하기 전에 Dockerfile에 대한 검증을 실행하여 문법이 잘못되어 있는 경우 에러를 발생시킨다.
Docker daemon은 Dockerfile의 명령어를 한 줄씩 실행하는데, 각 명령어는 독립적으로 수행되어 각 명령어가 다음 라인의 명령어에 영향을 미치지 않는다.
Docker는 가능한 경우 build-cache를 사용하여 빌드 과정의 속도를 높인다. cache 된 내용은 콘솔에 CACHED 메시지를 통해서 출력된다. 기본적으로 build cache는 빌드 중에 이전 빌드의 결과를 기반으로 한다. '--cache-from' 옵션은 이미지 저장소에 있는 특정한 cache source를 build-cache로 사용할 수 있도록 지정해준다.
3. Format
Dockerfile의 형식은 다음과 같다.
# comment
INSTRUCTION arguments
주석은 # 기호를 붙여서 작성한다.
명령어의 경우 INSTRUCTION을 작성하고, 그 뒤에 필요한 argument들을 작성한다.
4. .dockerignore file
docker CLI가 context를 docker daemon으로 전달하기 전에 context의 root directory에 있는 .dockerignore 파일을 확인한다. 만약 존재하는 경우 해당 파일
# comment | Ignored. |
*/temp* | Exclude files and directories whose names start with temp in any immediate subdirectory of the root. For example, the plain file /somedir/temporary.txt is excluded, as is the directory /somedir/temp. |
*/*/temp* | Exclude files and directories starting with temp from any subdirectory that is two levels below the root. For example, /somedir/subdir/temporary.txt is excluded. |
temp? | Exclude files and directories in the root directory whose names are a one-character extension of temp. For example, /tempa and /tempb are excluded. |
5. Dockerfile 작성 예시
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
# reference: http://pyrasis.com/Docker/Docker-HOWTO#dockerfile
- FROM: 어떤 이미지를 기반으로 할 지 설정. parent image
- MAINTAINER: maintainer, 유지보수하는 사람/조직의 정보
- RUN: shell 스크립트 혹은 명령을 실행
- VOLUME: 호스트와 공유할 디렉토리 목록. docker run 명령에서 -v 옵션으로 설정할 수 있다.
- CMD: 컨테이너가 시작되었을 때 실행할 실행 파일 또는 스크립트이다.
- WORKDIR: CMD에서 설정한 실행 파일이 실행될 location, 디렉토리 위치이다.
- EXPOSE: 호스트와 연결할 포트 번호
[reference]
- https://docs.docker.com/engine/reference/builder/
- github: https://github.com/rmk1075/Docker_Env
'Tech > Docker' 카테고리의 다른 글
[Docker] Docker Root Directory (도커 스토리지) 변경 (0) | 2023.12.14 |
---|---|
[Docker] Docker vs VM (0) | 2022.07.28 |
[Docker] Docker Compose (0) | 2021.09.05 |
[Docker] 도커 개념 정리 (0) | 2021.04.13 |