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 하는 것을 권한다
      그러면, 어떤 파일이 바뀌었을 때 캐시-이미지를 활용할 가능성이 커진다


(이상)

Posted by ingeeC
,