[Docker] 4. 이미지 빌드

hwee·2024년 5월 4일
0

Docker

목록 보기
5/8
post-thumbnail
post-custom-banner

이미지와 레이어

이미지는 여러개의 레이어로 구성되어 있다.
레이어 구조는 각 레이어의 변경이 다른 레이어들에게 영향을 주지 않고, 다른 이미지를 생성할 때 겹치는 레이어는 재사용할 수 있다.

이미지 레이어는 변경이 불가능하지만, 컨테이너 레이어는 변경이 가능하다.
이미지 레이어는 컨테이너를 실행하기 위한 정보들을 담고 있으며, 컨테이너 레이어는 컨테이너 실행중 변경되는 내용을 기록한다.
각 컨테이너는 각자 다른 컨테이너 레이어를 가지고 있지만, 이미지 레이어는 공유하여 사용할 수 있다.

각 레이어들은 PK로 해시값을 가지고 있으며, 각 이미지의 메타데이터에서 쌓여있는 레이어들의 해시값들을 조회할 수 있다.

레이어는 CoW전략으로 인하여 불변성을 보장받고, 변경사항이 있을 시 변경할 기존 레이어를 복사하여 실행중인 컨테이너의 컨테이너 레이어에 생성한 후, 수정한다.

이미지 커밋


이미지를 생성하는 방법은 커밋과 빌드 2가지 방식이 존재한다.
커밋 방식은 실행되고 있는 컨테이너에서 쉘로 작업 후 커밋하면, 기존에 존재하던 이미지에 레이어가 한개 더 쌓인 상태로 저장되는 방식이다.

IaC와 이미지 빌드

IaC란?

인프라 상태를 코드로 관리하는 것.

도커파일 작성법


FROM명령에서는 JAVA 애플리케이션을 실행하려면, JAVA 런타임이 설치된 이미지를 베이스 이미지로 사용한다.
COPY명령에서는 수정한 파일을 컨테이너 내의 어느 경로에 복사할지 지정한다.
CMD명령은 컨테이너가 올라갔을 때 실행할 명령어를 지정한다.

DockerFile이 있는 경로에서 빌드하기

도커파일이 있는 디렉터리 안에서

docker build -t 레지스트리계정명/이미지명 .

명령어를 통하여 이미지를 빌드한다.

빌드 컨텍스트


빌드 컨텍스트는 이미지를 빌드할 때 사용되는 폴더이다.
즉, 도커 데몬이 이미지를 빌드할 때 전달받는 폴더이고, 이 폴더 안에 카피될 파일들이 존재하여야 한다.
이 때, .dockerignore 파일로 현재 경로 내에 있지만 빌드 컨텍스트에서 제외할 파일들을 지정할 수 있다.

DockerFile 지시어

대부분의 경우 도커파일은 그대로 DockerFile로 저장하지만, 케이스별로 다른 도커파일로 빌드해야 되는 경우 아래 명령어처럼 -f 도커파일명으로 사용할 도커파일을 지정한다.

docker build -f 도커파일명 -t 이미지명 DockerFile경로

DockerFile 시스템 관련 지시어


WORKDIR은 DockerFile에 나오는 지시어들의 기본 경로를 지정하며, USER명령으로 기본적으로 설정되어있는 root유저가 과한 권한을 가지는 것을 막을 수 있다.

DockerFile 환경변수와 관련된 지시어


ARG명령은 이미지를 빌드할때만 유지되는 환경변수들을 설정하고, ENV명령은 컨테이너가 실행될때도 유지되는 환경변수들을 설정한다.

DockerFile 프로세스 실행 관련 지시어


ENTRYPOINT명령은 CMD명령 앞에 고정적으로 붙게 되는 명령어를 저장해두는 것이다.

멀티 스테이지 빌드

도커파일에서 두개의 베이스 이미지를 활용하는 방법.
즉, 빌드에 사용하는 이미지와 실행에 사용하는 이미지를 나누는 방법이다.

메이븐을 통하여 빌드하는 JAVA애플리케이션


이 상황에서 빌드할 때 필요한 단계는 2~4번이고, 실행할때 필요한 단계는 1번과 5번이므로 아래와 같이 스테이지를 나눌 수 있다.

즉, 빌드 스테이지에서 빌드한 파일만 실행스테이지에서 가지고 와 이미지를 생성하면, 최종적으로 생성되는 이미지의 크기를 많이 줄일 수 있다.

profile
https://fuzzy-hose-356.notion.site/1ee34212ee2d42bdbb3c4a258a672612
post-custom-banner

0개의 댓글