2 분 소요


본 내용은 인프런의 데브위키님 강의 “개발자를 위한 쉬운 도커” 내용을 바탕으로 정리한 내용입니다.


빌드 컨텍스트

이미지 빌드 방식은 도커 데몬이 Dockerfile에 작성된 내용을 수행한 결과로 이미지를 생성한다. 이를 위해 도커 클라이언트는 도커 데몬에게 Dockerfile과 빌드에 사용되는 파일들을 전달해 주어야 하는데 이때 Dockerfile이 있는 폴더 자체를 넘겨 준다. 이렇게 도커 데몬에게 전달된 폴더를 빌드 컨텍스트라고 한다.

도커 데몬은 전달 받은 컨텍스트안에 있는 도커 파일로 이미지를 빌드한다. 그리고 도커 데몬은 빌드 컨텍스트에 있는 파일만 카피 명령으로 복사할 수 있다.

docker build 명령을 실행할 때 맨 뒤에 Dockerfile경로를 입력하는데 이 경로가 빌드 컨텍스트를 지정하는 것이다. 정리하자면 빌드 컨텍스트는 도커 데몬이 이미지를 빌드할 때 전달되는 폴더이고 이 폴더 안에 도커 파일과 카피에 사용할 파일들이 모두 들어있어야 한다.

.dockerignore 파일

.dockerignore 파일은 빌드 컨텍스트에 있는 파일을 제외할 수 있는 기능을 제공한다. 예를 들어서 빌드 컨텍스트에 largejunk라는 3GB 크기의 파일이 있다고 가정해 보자. 이 파일이 이미지 빌드에 필요하지 않은 파일인 경우 .dockerignore 파일 내용에 전달하고 싶지 않은 파일명을 적어 놓으면 빌드 컨텍스트 폴더에 있더라도 실제 도커 데몬에는 이 파일을 제외하고 전달할 수 있다.

Dockerfile 관리

Dockerfile은 별도의 폴더에서 관리되는 것이 좋다. 예를 들어서 Dockerfile이 C 드라이브의 최상단 폴더에 있게 되면 이 Dockerfile이 포함된 C드라이브 전체가 빌드 컨텍스트가 되어버린다. 이 빌드 컨텍스트는 도커 데몬에게 전달돼야 하기 때문에 빌드 컨텍스트의 크기가 커질수록 전송 시간이 길어지고 이 폴더의 크기가 비정상적으로 커지면 빌드에 문제가 발생할 수도 있다. 그래서 Dockerfile과 빌드에 사용되는 파일만 별도의 폴더로 관리해야 한다.

빌드 컨테이너와 새로운 레이어

Dockerfile 내에서 사용되는 지시어 중에 실제 컨테이너가 필요하거나 컨테이너 내부에 접근해야만 수행할 수 있는 지시어들이 존재한다. 이를 위해 도커 데몬은 빌드 중 빌드로 컨테이를 생성하는 데 이를 빌드 컨테이너라고 한다.

도커 데몬은 컨테이너가 필요한 명령이 감지되면 FROM에 지정한 베이스 이미지의 환경을 기반으로 빌드 컨테이너를 생성한다. 이 후 생성되는 빌드 컨테이너는 기존 레이어의 누적된 환경으로 실행된다.

빌드 컨테이너 생성 명령어

빌드 컨테이너를 생성하는 명령에는 COPY, ADD, RUN, ENTRYPOINT, CMD, WORKDIR, ENV, VOLUME, USER, ONBUILD 이 있다. 도커 데몬은 위 명령어 들이 실행될 때마다 빌드 컨테이너를 생성하고 명령의 수행이 완료되면 빌드 컨테이너를 삭제한다.

빌드 컨테이너 생성 및 새로운 레이어 생성

위 명령어 중 COPY, RUN, ADD, WORKDIR, USER, ENV 지시어는 새로운 레이어를 생성한다. 모두 기존 레이어의 변경을 필요로 하는 지시어들이다. 도커의 이미지 레이어는 불변이기 때문에 이 지시어들의 명령이 수행되면 변경된 내용을 새로운 레이어를 통해 저장해야 한다.

COPY 지시어의 동작 과정을 통해 이미지 레이어 생성 원리를 살펴보자.

FROM nginx
COPY ./nginx.conf /user/share/nginx/html/
  1. 도커 데몬은 COPY 지시어를 만나면 빌드 컨테이너를 생성한다. COPY 명령을 수행하기 위해서는 이미지의 파일 시스템에 접근해야 하기 때문이다.
  2. 출발지 경로에 있는 파일 또는 디렉토리를 빌드 컨텍스트에서 찾아 목적지 경로에 복사한다.
  3. 명령이 완료되면 빌드 컨테이너를 커밋하여 새로운 이미지 레이어를 생성한다.
  4. 이후 빌드 컨테이너는 도커 데몬에 의해 종료되고 삭제된다.

이미지 빌드 시 이미지 레이어를 생성하는 지시어들은 아래 과정을 반복하게 된다.
빌드 컨테이너 생성 -> 명령 수행 -> 빌드 컨테이너 커밋 -> 이미지 레이어 생성 -> 빌드 컨테이너 삭제

댓글남기기