Dico

Docker Dockerfile 작성하기

1. 폴더 생성

$ mkdir docker
$ cd docker

2. Dockerfile 생성

$ vi Dockerfile

3. 작성 문법
명령어는 대소문자를 구분하지 않는다.

FROM

FROM {이미지명}
FROM {이미지명}:{태그}
FROM {이미지명}@{이미지 해시값(digest)}

어떤 이미지를 기반으로 생성할 것인지 베이스 이미지를 설정한다.
- 지정한 이미지가 로컬에 없으면 Docker Hub에서 받아온다.
- Docker Hub에서 제공하는 Official Images는 docker principle에 따라 최소한의 설치 요소로 구성되어 있다.
반드시 첫 번째 줄에 작성한다.

FROM ubuntu:latest
FROM ubuntu:18.04

RUN

RUN {command}

명령어, 쉘 스크립트를 실행한다.
베이스 이미지에 있는 /bin/sh 실행 파일을 사용하여 명령어를 실행한다.
주로 apt-get, yum이 사용된다.
실행된 결과는 이미지로 생성되며, 실행 내역은 이미지 히스토리에 기록된다.

CMD

exec 형식 : CMD ["executable", "param1", "param2", ...]
shell 형식 : CMD {command} {param1} {param2} ...

이미지가 생성되고 컨테이너가 시작되었을 때 첫번째로 실행될 명령어를 지정한다.
Dockerfile 작성 시 단 한번만 사용 가능하다.
docker run 으로 실행할 때 인자값을 주면 CMD 값 대신에 인자값으로 실행된다.
기본값 설정에 사용하면 좋다.
- ENTRYPOINT 와 함께 사용하면 ENTRYPOINT 명렁어에 매개변수를 전달하는 역할로만 사용된다.

ENTRYPOINT

exec 형식 : ENTRYPOINT ["executable", "param1", "param2", ...]
shell 형식 : ENTRYPOINT {command} {param1} {param2} ...

이미지가 생성되고 컨테이너가 시작되었을 때 첫번째로 실행될 명령어를 지정한다. (CMD와 동일)
인자값을 사용해도 명령어가 변경되지 않는다.

ENTRYPOINT yum install -y rdate
# ==
ENTRYPOINT ["yum","install","-y","rdate"]

* shell 형식은 /bin/sh 를 거친 후에 실행된다.
반면에 exec 형식은 script를 바로 실행하기 때문에 exec 형식을 추천한다.

WORKDIR

WORKDIR {절대경로|상대경로}

명령어 cd 와 동일.
명령어 RUN, CMD, ENTRYPOINT, COPY 등이 실행될 Directory를 지정

ENV

ENV {환경변수} {값}

환경변수 설정.
RUN, CMD, ENTRYPOINT에 적용된다.

EXPOSE

EXPOSE {port 번호}

port 번호 설정.

EXPOSE 80

여러 개 설정 가능.
port를 외부로 노출시켜야 외부에서 접근 가능

docker run -p {port 번호}

USER

USER user[:group]
USER UID[:GID]

컨테이너 내에서 명령어를 실행시키는 사용자를 설정한다.

USER dico

VOLUME

VOLUME {container directory}
VOLUME ["container directory1", "container directory2"]

폴더 내용을 컨테이너에 저장하지 않고 호스트에 저장하도록 설정한다.

VOLUME /data
VOLUME ["/data", "/var/log"]

해당 폴더를 호스트의 특정 폴더와 연결하려면 docker run 실행 시 -v 옵션을 사용해야 한다.

docker run -v {host directory}}:{container directory} dockerfile

$ docker run -v /host/data:/data dockerfile

COPY, ADD

COPY {호스트 내부 복사경로} {이미지 내부 저장경로}
ADD {호스트 내부 복사경로} {이미지 내부 저장경로}

호스트 내부에 있는 파일을 이미지 내부로 복사.
Dockerfile 파일이 존재하는 경로에서 하위에 있는 파일만 복사 가능.
따라서 Dockerfile을 작성할 때 별도의 폴더를 생성하고, 그 안에 이미지 생성에 필요한 파일들을 넣어둔다.
- ADD
압축 파일은 압축을 해제하여 복사한다.(Auto-extraction)
URL을 통해 파일을 복사할 수 있다. (Remote-URL)
ADD 보다 COPY가 직관성이 높다.

주석 (Comments)

# 주석입니다.

참조

Docker 공식 문서
렴소-docker file 작성법
LeafCat-올바른 Dockerfile 작성법
물과같이-Dockerfile Entrypoint 와 CMD의 올바른 사용 방법