4.2(2) 이미지 생성을 위한 Dockerfile 빌드
4.2.2 이미지 생성을 위한 Dockerfile 빌드
이미지 빌드
docker build
명령을 통해 Dockerfile로부터 이미지를 생성할 수 있다.
$ docker build [옵션] 이미지명:[태그] 경로 | URL | 압축파일(tar | tar.gz)
- 옵션
-t
(tag): ‘이미지명:태그’를 지정하는 경우
-f
(file): Dockerfile이 아닌 다른 파일명을 사용하는 경우 (ex. -f Dockerfile_nginx
)
- 이미지명:[태그]
- 생성할 이미지명과 태그를 지정
- 일반적으로 태그는 버전 관리 차원으로 고려한다.
- 경로(path)
- 디렉터리 단위 개발을 권고
- 현재 경로에 Dockerfile이 있다면
‘.’
을 사용한다.
- 또는 Dockerfile이 있는 절대경로를 작성해도 된다.
- URL
- Dockerfile이 포함된 깃허브 URL을 제공하는 경우 사용
docker build -t phpserver:2.0 github.com/brayanlee/docker-phpserver
- 압축 파일
- 압축 파일 내 Dockerfiledㅣ 포함되는 경우
docker build -f appl/Dockerfile http://server/app1.tar.gz
왜 Dockerfile이 필요할까?
- Dockerfile을 사용하지 않으면
- 신규 애플리케이션 서버 구성이 필요하다면 서버를 세팅해야 한다.
- OS부터 환경설정, 애플리케이션 서비스까지 테스트를 거쳐 웹 소스를 넣고 배포한다.
- 이런 라이프사이클을 도커 컨테이너를 통해 하나하나 설치하고 이미지로 생성하는 것은 번거롭다.
- Dockerfile을 통해 인프라를 브로비저닝하면 언제든 사용할 수 있고 업데이트를 통해 또다른 버전의 이미지, 즉 인프라를 제공할 수 있다.
4.2.3 이미지 빌드 과정
- 도커 허브로부터 pull한 이미지는 불변이다.
- 이미지로 컨테이너를 생성하여 변경 사항을 추가하고
docker commit
을 통해 새로운 이미지를 생성하는 것은 가능하다.
- 새로운 이미지를 만든 것이지 기존 이미지를 수정한 것이 아니다.
- 필요한 모든 이미지를 도커 허브가 보유하고 있는 것은 아니기에 필요한 인프라 설계 요구서와 여러 환경 변수 등을 고려한 Dockerfile을 생성해야 한다.
Dockerfile 작성 라이프사이클
docker build
명령을 통해 Dockerfile에 작성한 명령을 순서대로 읽으며 자동으로 이미지를 빌드한다.
- 주의할 것은 이미지 빌드는 대화식 처리가 아닌 자동화된 빌드라는 것이다.
- 빌드 중에 명령어 오류나 에러가 발생하면 강제 종료된다.
docker build
를 실행하는 현재 디렉터리를 빌드 컨텍스트라고 부른다.
- 이미지 빌드 시 현재 디렉터리의 모든 파일과 디렉터리 컨텐츠는 도커 데몬에 빌드 컨텍스트로 전달된다.
- 제외 대상이 있다면 .dockerignore 파일에 작성하면 된다.
- 빌드 컨텍스트로 시작된 이미지 빌드 수행은 각 명령어 실행을 통해 레이어를 만드는 것이다.
이미지 빌드 과정
# Nginx Dockerfile 예시
# 베이스 이미지 지정
FROM ubuntu:latest
# 작성자 정보 작성
MAINTAINER "kevin.lee <hylee@dshub.cloud>"
# 필요한 패키지 작성
RUN apt-get update && apt-get install -y nginx curl vim
# nginx 기본 웹 페이지 생성
RUN echo 'Docker Container Appliation.' > /var/www/html/index.html
# 80번 포트 노출
EXPOSE 80
# 컨테이너 실행 시 nginx 데몬 자동 실행
CMD ["nginx", "-g", "demon off;"]
- 첫 번째 이미지 빌드 과정
docker build -f Dockerfile_nginx -t webapp:1.0 .
- Step 1/6: 베이스 이미지 Ubuntu를 가져와 이미지 ID 부여
- Step 2/6: 이미지 작성자 정보를 추가하기 위해 임시 컨테이너를 실행하고, 임시 컨테이너를 삭제한 뒤 이 내용을 포함한 새로운 이미지 ID 부여
- Step 3/6: 2단계와 마찬가지로 임시 컨테이너를 생성하여 작업하고 삭제한 뒤 이 내용을 포함한 새로운 이미지 ID 부여
- Step 4/6: index.html 파일 생성 과정에서 마찬가지로 임시 컨테이너 생성, 삭제 후 이 내용을 포함한 새로운 이미지 ID 부여
- Step 5/6 포트 80번을 노출하면서 마찬가지로 임시 컨테이너로 작업 후 새로운 이미지 ID 부여
- Step 6/6: 데몬 자동 시작 과정에서도 임시 컨테이너로 생성, 작업, 삭제 후 새로운 이미지 ID 부여
- Successfully: 최정 이미지를 생성하고 webapp:1.0 태그로 설정
- 두 번째 빌드
docker build -f Dockerfile_nginx -t webapp:2.0 .
- Step2 ~ Step 6까지 Using cache 구문이 있는데 이를 빌드 캐시라고 한다.
docker build
는 빌드 속도 향상을 위해 중간에 있는 이미지 캐시를 사용한다.
- 도커 18.09 버전에 Buildkit이 추가되어 빌드에 향상된 기능을 제공했고 20.10부터 안정화되었다.
- 빌드 과정을 병렬 처리하여 더 빠른 빌드 제공
- 사용하지 않는 빌드 단계 비활성화
- 비밀번호 등 민감 데이터 포함 시 secret 구축이 가능
- 빌드 중 빌드 정보에 따라 변경된 파일만 전송
- 자동 빌드 시 빌드 캐시 우선순위를 정한다.