: 설치할 패키지, 소스코드, 실행해야할 명령어 등을 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/