Docker Dockerfile 작성하기

1. 폴더 생성

Plain Text

$ mkdir docker
$ cd docker

2. Dockerfile 생성

Plain Text

$ vi Dockerfile

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

FROM

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

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

Plain Text

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와 동일)
인자값을 사용해도 명령어가 변경되지 않는다.

Plain Text

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 번호 설정.

Plain Text

EXPOSE 80

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

docker run -p {port 번호}

USER

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

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

Plain Text

USER dico

VOLUME

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

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

Plain Text

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

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

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

Plain Text

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

COPY, ADD

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

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

주석 (Comments)

Plain Text

# 주석입니다.

참조

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

민갤

Back-End Developer

백엔드 개발자입니다.

Linux 서버 시간과 타임 서버 시간 동기화

Linux 서버 시간과 타임 서버 시간 동기화

Server

Docker Dockerfile 생성부터 Container 실행까지

Docker dockerfile build and run

Server

v5.0.0