Dockerfile 베스트 프랙티스
Dockerfile 베스트 프랙티스
https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices
* 컨테이너는 쉽게 죽고 살 수 있어야 한다 (Containers should be ephemeral )
수시로 파괴되고 생성되어도 정상 동작해야 한다
* .dockerignore 파일을 활용하라 (Use a .dockerignore file)
- docker build 디렉토리에 파일이 많아지면 안좋다
. build 된 이미지가 커진다
. biuld 작업이 느려진다
- .dockerignore 파일로 관련 없는 파일들을 무시하게 하라
* 컨테이너의 목적을 (하나만) 분명히 하라 (Each container should have only one concern)
- 하나의 어플리케이션을 여러개의 컨테이너로 나누는 편이
<horizontal-scaling>과 <컨테이너-이미지 재활용> 측면에서 좋다
* layer 수를 줄여라 (Minimize the number of layers)
- 이미지의 레이어 수를 줄이는 것이 좋다
- RUN, COPY, ADD 명령이 레이어를 만든다
* Dockerfile 명령어 관련 조언
- FROM
. 항상 공식 이미지를 base 이미지로 사용하라
- RUN
. apt-get update와 apt-get install은 항상 한줄로 묶어 사용하라
. apt-get install 시 패키지의 버전을 명시하면 잠재적인 오류를 줄일 수 있다
. RUN 명령 모범 사례
RUN apt-get update && apt-get install -y \
aufs-tools \
automake \
build-essential \
curl \
dpkg-sig \
libcap-dev \
libsqlite3-dev \
mercurial \
reprepro \
ruby1.9.1 \
ruby1.9.1-dev \
s3cmd=1.1.* \
&& rm -rf /var/lib/apt/lists/*
- EXPOSE
. 전통적인 포트 사용을 권한다
예를 들어, 아파치 웹서버는 EXPOSE 80,
MongoDB는 EXPOSE 27017
- ADD or COPY
. ADD 보다 COPY 를 권한다 (더 단순하다/직관적이다)
. 여러 파일들을 한꺼번에 COPY 하는 것보다 파일별로 COPY 하는 것을 권한다
그러면, 어떤 파일이 바뀌었을 때 캐시-이미지를 활용할 가능성이 커진다
(이상)