Dockerfile을 쓰는 최고의 방법

Image credit: docker.com

Dockerfile을 쓰는 최고의 방법

Docker는 Dockerfile로 부터 이미지를 생성하는데 필요한 규약, 명령들을 포함한 지침을 읽어 자동으로 이미지를 빌드할 수 있다.
Dockerfile은 특정한 형식을 따르며 특정 명령어를 사용한다.
Dockerfile Reference 페이지에서 기초적인 사항을 배울 수 있다.
만일 Dockerfile 쓰는 것을 처음 시도한다면 Docker Reference 페이지를 참고하자!

권장 사항

1. 컨테이너는 임시적이어야 한다.

컨테이너는 가능한 한 임시적이어야한다.
여기서 임시란 말은 정지 및 소멸될 수 있으며 최소한의 설정만으로 새로운 생성과 변경이 가능해야한다는 것이다.

2. .dockerignore 파일을 사용해라.

대부분의 경우에는 각각의 Dockerfile은 빈 디렉토리에 두는 것이 가장 좋다.
그런 다음 Dockerfile을 빌드하는데 필요한 파일을 추가해야 한다.
빌드 성능을 높이려면, 해당 디렉토리에 .dockerignore 파일을 추가하여 다른 파일이나 디렉토리들을 제외시킬 수 있다.
사용법은 .gitignore 파일과 유사하다.

3. 불필요한 패키지 설치를 피하라.

복잡성, 의존성, 파일 수, 빌드 시간을 줄이기위해 불필요한 패키지 설치를 피해야한다.
예를 들어, database 이미지에는 텍스트 편집기를 포함할 필요가 없다.

4. 컨테이너당 한 프로세스를 실행해라.

거의 모든 경우에 컨테이너당 한 프로세스를 실행해야한다. 여러 컨테이너로 분리된 애플리케이션은 쉽게 확장이 가능하고 재사용이 가능하다.
만일, 어떤 서비스가 또다른 서비스에 의존성이 있다면
Container간 Link를 사용하는 것을 고려하자.

5. 레이어 수를 최소화하라.

Dockerfile의 가독성과 사용 계층 수의 최소화사이에서 균형을 유지해야한다.
사용하는 레이어의 수에 대해 전략적이고 신중해야한다.

6. 여러행의 인수를 정렬해라.

그렇게되면 패키지의 중복을 피하고, 높은 가독성을 유지할 수 있다.
또, 백 슬래시 앞에 공백을 추가해라.

예시

RUN apt-get update && apt-get install -y \
  bzr \
  cvs \
  git \
  mercurial \
  subversion
7. 빌드 시에는 캐시를 사용하라.

이미지를 생성하는 과정에서 Docker는 Dockerfile이 지정한 순서대로 명령을 실행한다.
각 명령을 검사 할 때 Docker는 새로운 이미지를 만드는 대신 캐시에서 기존 이미지를 찾아 재사용 할 수 있다.
캐시를 전혀 사용하지 않으려는 경우 docker 빌드 명령에서 --no-cache = true 옵션을 사용할 수 있다.

Docker가 따라야 할 기본 규칙
  • 이미 캐시에 있는 기본 이미지로 시작한 다음 명령은 그 기본 이미지에서 파생 된 모든 하위 이미지와 비교되며 동일한 instruction을 사용하여 빌드된 것이 있는지 확인한다.
  • 대부분의 경우 Dockerfile의 명령어를 하위 이미지 중 하나와 비교하는 것으로 충분하다.
  • ADD 및 COPY 명령의 경우 이미지의 파일 내용을 검사하고 각 파일에 대해 체크섬을 계산하며, 마지막으로 수정되거나 마지막으로 액세스 한 파일에 대해서는 체크섬에서 고려되지 않는다. 캐시를 조회하는 동안에, 체크섬은 기존 이미지의 체크섬과 비교된다. 만일, 파일의 내용이나 메타데이터가 변경되면 캐시가 타당하지 않는 것이 된다.
  • ADD 및 COPY 명령을 제외하고 캐시 검사는 컨테이너의 파일을 보고 캐시 일치를 판별하지 않는다. 예를 들어 RUN apt-get -y update 명령을 처리 할 때 컨테이너에서 업데이트 된 파일은 검사되지 않는다. 이 경우에는 단지 command string의 자체에 대한 일치만을 찾는데 사용된다.

캐시가 타당하지 않을 때, 이 후의 모든 Dockerfile 명령은 새로운 이미지를 생성하고 캐시는 사용되지 않는다.

위 글은 Docker 공식사이트에서 제공하는 문서기준으로 작성되었습니다.

comments powered by Disqus