![[Docker] 이미지 커밋와 이미지 빌드](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO81h5%2FbtsFml4YaIv%2FHh23FemfIsry3Z3y9ebM91%2Fimg.png)
새로운 이미지를 생성하는 방식으로 commit과 build 2가지 방법이 존재한다. Commit 방식은 현재 컨테이너의 상태를 이미지로 만드는 것이고, Build 방식은 Dockerfile을 만들고 이것을 이미지로 만드는 방식이다.
이미지 Commit
Commit 방식은 컨테이너의 현재 상태를 이미지로 만드는 방식이다. 즉 컨테이너의 변경 사항을 이미지로 저장하는 방식이다.
컨테이너에서 변경된 파일 시스템의 스냅샷을 촬영하여 새로운 이미지를 생성한다. 여기서 스냅샷이란 해당 컨테이너의 파일 시스템과 생타를 특정 시점에서 저장하는 것을 말한다. 해당 시잠의 상태를 기록함으로써 컨테이너 상태를 복원하거나 이미지로 저장할 수 있다.
Nginx 이미지로 생성한 컨테이너에 대해서 commit을 수행하는 과정은 다음과 같다.
- Nginx 이미지로 도커 컨테이너를 실행한다
- 현재 컨테이너 내부에는 의존성 파일과 nginx 이미지 등이 포함되어 있다
- Nginx 이미지에 존재하는 index.html 수정 => 도커 컨테이너 변경 사항 발생
- commit 명령어를 실행하여 현재 컨테이너를 새로운 이미지를 생성
현재 컨테이너로 이미지를 만드는 명령어는 다음과 같다.
$ docker commit -m "커밋 메시지" 현재컨테이너 새로만들이미지
이미지 Build
Build 방식은 Dockerfile을 사용하여 이미지를 생성하는 방식이다. Dockerfile에는 이미지를 구성하는 명령어와 기술이 포함되어 있습니다.
Build 방식에 대해 알기 전에 IaC 방식에 대해서 알아봅시다. IaC란 Infrastructure as Code로써 인프라 상태를 코드로 관리하는 방식입니다. 코드를 통해 인프라를 관리할 수 있습니다. 인프라의 프로비저닝을 자동화하므로 더 빠르고 낮은 비용으로 애플리케이션을 개발, 배포, 확장할 수 있다.
* 프로비저닝(Provisioning) : 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해 두는 것.
Dockerfile을 통해 이미지를 빌드할 대도 IaC 개념을 사용할 수 있습니다. Dockerfile에 원하는 이미지 상태를 코드로 작성하고 build 명령어를 통해 이미지를 생성할 수 있습니다.
Dockerfile 형태는 원하는 이미지의 형태를 작성하면 된다고 하였습니다. 파일 내부에는 다음 형식의 코드를 작성할 수 있습니다.
# 베이스 이미지 선택
# 이미지의 기반이 되는 부분이며, 해당 이미지 위에 파일과 설정이 추가된다
FROM 이미지이름:태그
# 작성자 정보
# 이미지에 작성자 정보 등의 메타데이터 추가한다
LABEL 작성자="Your Name <your_email@example.com>"
# 작업 디렉토리 설정
# 이후 명령어가 실행될 디렉토리가 된다
WORKDIR /경로
# 파일 복사
# 호스트 머신의 파일을 컨테이너로 복사한다
COPY 파일경로 복사할경로
# 의존성 설치 또는 명령 실행
# 패키지 설치, 의존성 관리 등을 수행할 수 있다
RUN 명령어
# 환경 변수 설정
ENV 변수명 값
# 포트 오픈
# 컨테이너를 외부에 노출할 포트 번호를 지정한다
EXPOSE 포트번호
# 컨테이너 실행 시 실행할 명령어
CMD ["실행할", "명령어"]
위에 작성한 Dockerfile을 이미지로 만들기 위한 명령어를 작성합니다.
$ docker build -t 이미지명 Dockerfile경로
build 명령어를 실행하면 Docker 데몬이 다음 과정을 수행합니다.
- Dockerfile 분석 : 도커 데몬이 해당 디렉토리에서 Dockerfile을 찾습니다. 그리고 Dockerfile에 작성된 명령어와 설정을 분석합니다
- Base 이미지 다운로드 : FROM에 명시된 베이스 이미지를 다운로드합니다. 이때 베이스 이미지가 로컬에 존재하지 않으면 도커 데몬이 해당 이미지를 Docker Hub(Public 레지스트리)에서 다운로드합니다.
- 이미지 build : Dockerfile에 적성된 명령어 COPY, RUN, ENV 등을 순차적으로 실행하여 이미지를 빌드합니다.
도커 데몬은 각 명령어를 실행하고 그 결과를 중간 이미지 레이어로 저장합니다. - Caching과 중간 이미지 레이어 관리 : 도커 데몬은 빌드 과정에서 중간 이미지 레이어를 캐싱하여 동일한 명령어가 반복 실행될 때 재사용합니다. 이는 이전에 빌드한 이미지 일부를 재사용하므로 빌드 속도를 향상시킬 수 있습니다.
- 최종 이미지 생성 : Dockerfile에 작성된 모든 명령어가 순차적으로 실행되고 중간 이미지 레이어가 생성하고 이를 기반으로 최종 이미지로 생성합니다.
[2024 NEW] 개발자를 위한 쉬운 도커 강의 - 인프런
현업 개발자가 도커를 사용한 경험을 녹여낸 새로운 커리큘럼으로 기존 교재 및 강의와 차별된 강의를 제공합니다. 단순한 명령어 사용법이 아닌 도커를 왜 사용해야하는지 대한 근본적인 질문
www.inflearn.com