alt
Home 시작하세요! 도커 / 쿠버네티스 2장 도커 엔진 - 3. Dockerfile
Post
Cancel

시작하세요! 도커 / 쿠버네티스 2장 도커 엔진 - 3. Dockerfile

: 설치할 패키지, 소스코드, 실행해야할 명령어 등을 Dockerfile에 기록해놓고 해당 파일을 빌드해 도커 이미지를 만든다.


  • CI/CD 도구를 이용해 자동화하기에도 편리하다.
  • 빌드 과정에 필요한 작업들을 명확하게 명시할 수 있는 것도 장점 중 하나 인 것 같다.
  • docker build -t imageName 으로 실행한다.


빌드 과정

  • 가장 먼저 빌드 컨택스트(Dockerfile 위치)를 읽어들인다. (빌드 시 가장 먼저 Sending build context to Docker daemon 가 출력된다.) 하위 디렉터리를 모두 포함하기 때문에 필요한 디렉터리만 포함될 수 있도록 빌드 컨택스트를 고려해야한다.
    • 제외 할 파일은 .dockerignore을 사용한다.
  • 각 명령어마다 Step이 존재한다. 각 Step마다 새로운 컨테이너를 생성하고, 커밋해 이미지화 하고, 해당 이미지를 베이스로 다음 명령어를 수행한다.
  • 캐싱: 도커파일에서 명령어는 기본적으로 캐싱되어 같은 빌드를 할 때 재사용한다. COPY, RUN은 파일의 변경상태 또한 체크해준다.
    • 앞쪽 명령어에서 캐싱이 끊기면 그 이후론 쭉 끊긴다. 따라서 순서가 중요하고, COPY RUN으로 캐싱이 끊길 거라고 예상이 된다면 COPY, RUN을 순서를 뒤쪽으로 배치하는 것도 좋은 방법이다.
    • --no-cache: 같은 이미지레이어를 재사용 하는 것이기 때문에 git과 같은 원격에서 형상변경이 일어나도 재사용하게 된다. 이 때는 캐시를 사용하지 않도록 한다.
    • --cache-from을 통해 특정 이미지를 캐시로 활용 할 수도 있다.
  • <none>:<none> : 이미지 빌드 중 오류가 발생한 이미지


멀티스테이지

: 필요한 빌드 작업과 실제 사용할 컨테이너 작업을 분리해, 빌드 완료 시 최종적으로 필요한 파일만 추가할 수 있도록 한다.


  • 이미지 크기를 줄일 수 있는 방법.
  • 두번째 스테이지에서 COPY를 통해 첫번째 스테이지의 컨테이너 내부의 특정 경로만을 복사해 사용한다.


Dockerfile 작성


잘 작성하는 방법

  • \ 역슬래시를 활용해 가독성을 높인다.
  • 도커의 이미지 구조는 레이어 구조이기 때문에 각 레이어 변경사항을 모두 저장한다. 불필요한 용량을 줄이고자 RUN 명령어를 &&로 묶는 방법을 활용한다.


FROM

  • 새로운 빌드 스테이지를 초기화한다. 멀티 스테이지로 빌드할 경우 다음 스테이지의 베이스 이미지가 된다.
  • docker hub, private registry, 로컬로 부터 불러와 사용될 수 있는 이미지가 인자가 된다.


LABEL

: 메타데이터를 key:value로 명시한다. inspect로 메타데이터 확인 가능하다.


RUN

1
RUN ["executable", "param1", "param2"]
  • 컨테이너 내부 shell에서 직접 커맨드 하는 것과 같다. 이미지 빌드 과정에서 필요한 커맨드를 치기 위해 사용한다.
  • JSON 배열 형태로 입력한다.
  • RUN에 명시된 커맨드를 실행할 때 별도로 입력해야하는 경우(e.g. Y/N)라면 빌드가 실패한다.


ENV

  • docker build로 이미지 빌드시 빌더, 컨테이너로 보내줄 수 있는 variable를 보내준다.

    1
    2
    3
    4
    
    FROM busybox
    ENV user=root
    ARG user1
    ARG buildno
    
  • ARG와 유사하다. ARG 사용 시 build 명령어를 통해 해당 변수를 추가로 받을 수도 있다.
  • ${env_name:-value} -> 없을 시 value ${env_name:+value} -> 있을 시 value


WORKDIR

: 명령어를 실행할 컨테이너 내부의 디렉터리. 멱등하기 때문에 여러번 입력하면 모두 반영된다. (cd와 같다.)


EXPOSE

: 노출 할 컨테이너의 port. run 하는 시점에 호스트와 바인딩해줘야 접근 가능하다.


COPY

1
2
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
  • 여기서 src는 호스트의 빌드 컨택스트(Dockerfile이 위치한 디렉터리), dest는 컨테이너의 file system
  • 위 예시처럼 다수의 파일도 복사 가능


Add

: Copy와 비슷하게 사용. .tar나 네트워크 상의 경로도 추가 가능하다. 필요한 경우가 아니라면 로컬 컨텍스트의 명확히 특정 파일을 받을 수 있는 COPY 사용이 권장된다.


CMD

  • 이미지를 컨테이너로 띄우는 시점에 실행할 커맨드.
  • run 시점에 또다른 CMD를 입력하면 Dockerfile의 커맨드는 덮어씌워진다.


ENTRYPOINT

: CMD와 유사하다. ENTRYPOINT는 커맨드를 인자로 받아 사용할 수 있는 스크립트 역할을 할 수 있다.

  • ENTRYPOINT가 있으면 CMD는 단지 entrypoint의 인자 역할만 한다.


JSON 배열과 일반 형식의 차이점

  • 일반 형식의 경우 CMD, ENTRYPOINT를 사용할 때 기본적으로 /bin/sh -c가 앞에 추가된다. /bin/sh 사용을 하지 않으려면 JSON 배열 형태로 옵션을 부여해야한다.



Reference)

시작하세요! 도커 / 쿠버네티스

https://docs.docker.com/engine/reference/builder/#from

https://spring.io/guides/gs/spring-boot-docker/

This post is licensed under CC BY 4.0 by the author.

메인 컨테이너 종료 시 사이드카 컨테이너 종료하기

시작하세요! 도커 / 쿠버네티스 2장 도커 엔진 - 4. 도커 데몬