42서울/Inception

best practices for writing Dockerfiles (과제 요구사항) [42 inception 과제 개념12]

뜨거운 개발자 2023. 6. 24. 17:59

시작하면서

Best practices for writing Dockerfiles
Hints, tips and guidelines for writing clean, reliable Dockerfiles
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
About storage drivers
Learn the technologies that support storage drivers.
https://docs.docker.com/storage/storagedriver/

과제에 best practices for writing Dockerfiles 를 꼭 읽어보라는 내용이 있습니다.

지금까지 42의 성향을 볼 때 이런 문항을 무시하고 넘어갔다가 평가에서 혼나는 경우가 많아 정리하고 가려고 합니다.

물론 그것만이 아니더라도 Dockerfile을 만드는데, 올바른 방법에 대해서 아는 것은 필요하다고 생각합니다.

🧑🏻‍💻
모든 내용을 정리하기 보다는 필요한 부분에 대해서 정리를 하는 식으로 진행하였으니 깊은 내용이 궁금하다면 공식 사이트를 참고하시고 제 내용은 한번 읽고 간다고 생각하시면 좋을 것 같습니다.

각 명령은 하나의 계층을 생성합니다.

이것은 이미지 layer부분에서 설명했 듯 도커파일의 한 명령은 하나의 layer를 생성합니다. 따라서, 필요한 경우에 명령을 사용하고 layer의 의미가 있을 때 사용하는 것이 좋습니다.

컨테이너 계층

이미지를 실행하고 컨테이너를 생성할 때 컨테이너 계층이라고도 하는 쓰기 가능한 새 계층을 기본 계층 위에 추가합니다. 새 파일 쓰기, 기존 파일 수정 및 파일 삭제와 같은 실행 중인 컨테이너의 모든 변경 내용은 이 쓰기 가능한 컨테이너 계층에 기록됩니다.

일반 지침 및 권장 사항

Create ephemeral containers (임시 컨테이너 만들기)

새 파일 작성, 기존 파일 수정 및 파일 삭제와 같이 실행 중인 컨테이너에 대한 모든 변경 사항은 이 쓰기 가능한 컨테이너 계층에 기록됩니다.

당신의 Dockerfile에 정의된 이미지는 가능한 한 일시적인 컨테이너를 생성해야 합니다.

여기서 일시적이라는 것은 컨테이너를 중지하고 삭제한 다음, 절대 필요한 최소한의 설정과 구성으로 다시 빌드하고 교체할 수 있는 것입니다.

도커파일의 이미지의 layer형태를 활용해서 최소한의 변경으로 교체가 가능하게 하라는 의미로 해석했다.

build context 이해

Build context
Learn how to use the build context to access files from your Dockerfile
https://docs.docker.com/build/building/context/

이 링크를 참고하라고 권유합니다. 따라서 링크를 따라가 정리하겠습니다.

이건 다른 게시물로 정리해두겠습니다.

다단계 빌드(Multi-stage builds)를 사용하세요

이 방법은 layer수 최소화하기와 연관이 있습니다.

🚨
이 부분은 inception과제 내용을 벗어납니다. 공식 이미지를 많이 사용하는 빌드에서 이미지 크기를 줄일 수 있는 방법 중 하나 입니다.
Multi-stage builds
Keeping your images small with multi-stage builds
https://docs.docker.com/build/building/multi-stage/
Builder pattern vs. Multi-stage builds in Docker
The Docker builder pattern just got a lot easier. Let's checkout some bleeding-edge PRs from the Docker project that are causing a stir.
https://blog.alexellis.io/mutli-stage-docker-builds/

다음 글을 참고해서 다른 게시물로 정리해두겠습니다.

다단계 빌드를 사용 하면 중간 레이어 및 파일 수를 줄이려고 노력하지 않고도 최종 이미지의 크기를 크게 줄일 수 있습니다. 빌드 프로세스의 마지막 단계에서 이미지가 빌드되기 때문에 빌드 캐시를 활용하여 이미지 레이어를 최소화할 수 있습니다 .

예를 들어 빌드에 여러 레이어가 포함되어 있고 빌드 캐시를 재사용할 수 있는지 확인하려는 경우 덜 자주 변경되는 레이어부터 더 자주 변경되는 레이어로 순서를 지정할 수 있습니다. 다음 목록은 명령 순서의 예입니다.

  1. 애플리케이션 구축에 필요한 도구 설치
  1. 라이브러리 종속성 설치 또는 업데이트
  1. 애플리케이션 생성

불필요한 패키지를 설치하지 마세요

🚨
추가 패키지나 불필요한 패키지가 있으면 좋다는 이유만으로 설치하지 마십시오. 예를 들어 데이터베이스 이미지에 텍스트 편집기를 포함할 필요가 없습니다.

불필요한 패키지를 설치하지 않으면 이미지의 복잡성이 감소하고, 종속성이 감소하며, 파일 크기가 감소하며, 빌드 시간이 단축됩니다.

애플리케이션 분리

각 컨테이너에는 하나의 주제만 있어야 합니다. 애플리케이션을 여러 컨테이너로 분리하면 수평 확장 및 컨테이너 재사용이 더 쉬워집니다. 

예를 들어, 웹 애플리케이션은 분리된 방식으로 웹 애플리케이션, 데이터베이스 및 메모리 내 캐시를 관리하기 위해 각각 고유한 이미지가 있는 세 개의 개별 컨테이너로 구성될 수 있습니다.

컨테이너를 하나의 프로세스로 제한하는 방법은 좋은 방법이긴 하지만 어렵기도 하고, 빠르지도 않습니다.

💡
따라서 여러 개의 컨테이너를 사용해서 모듈식으로 유지하는 것을 추천하고, 컨테이너가 서로 종속 된 경우에는, 컨테이너간 통신을 사용하는 것을 추천합니다.

다중 행 인수 정렬

RUN apt-get update && apt-get install -y \
  bzr \
  cvs \
  git \
  mercurial \
  subversion \
  && rm -rf /var/lib/apt/lists/*
💡
인자들을 쭉 나열하는 것보다 다음과 같이 \ 를 추가하는 것을 더 권장합니다.

빌드 캐시 활용

이미지를 작성할 때 도커는 도커 파일의 지시사항을 단계별로 수행하여 지정된 순서대로 각각 실행합니다.

각 명령을 검사할 때 Docker는 캐시에서 중복 이미지를 새로 만드는 대신 재사용할 수 있는 기존 이미지를 찾습니다.

캐시를 전혀 사용하지 않으려면 docker build --no-cache=true 옵션을 사용하면 됩니다.

Docker가 캐시를 사용하도록 허용하는 경우 일치하는 이미지를 찾을 수 있는 경우와 찾을 수 없는 경우를 이해하는 것이 중요합니다. 도커가 따르는 기본 규칙을 보고 이해합시다.

도커의 캐시관련 기본규칙

  • 캐시에 이미 있는 상위 이미지부터 시작하여 다음 명령을 해당 기본 이미지에서 파생된 모든 하위 이미지와 비교하여 이들 중 하나가 정확히 동일한 명령을 사용하여 작성되었는지 확인합니다. 아니라면 캐시는 무효화됩니다.
  • 대부분의 경우 도커파일을 특정 하위 이미지 하나만 보면 되지만, 여러개를 보는 경우도 있습니다.
  • ADD  와COPY instructions은 checksum 을 사용하기 때문에, 내용지 조금이라도 바뀌는 경우 캐시는 무효가 됩니다.
  • ADD  와COPY 를 제외한다면 캐시확인을 위해 컨테이너 내부 파일을 확인하지 않습니다.
  • 예를 들어, 다음을 처리할 때RUN apt-get -y update 내부에서 실제 업데이트가 있는지 확인하는게 아니라 문자열이 같은지를 확인합니다.

도커파일 내부 명령에 대한 지침

여기에는 FROM 등 모든 도커파일에서 지시어에 대한 지침이 있으니 지시어를 사용하다가 모르겠는 경우 다시 찾아보는 걸로하자.

이걸 다 정리하다가는 인셉션만 두달하겠다..
Best practices for writing Dockerfiles
Hints, tips and guidelines for writing clean, reliable Dockerfiles
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#dockerfile-instructions

[42 inception 과제 개념정리1]


Uploaded by N2T

728x90