본문 바로가기
도커/개발자를 위한 쉬운 도커

4.2 도커(Docker) 이미지 빌드: 이미지 커밋(Commit)

by limdae94 2024. 6. 29.
 

개발자를 위한 쉬운 도커 강의 | 데브위키 - 인프런

데브위키 | 현업 개발자가 도커를 사용한 경험을 녹여낸 새로운 커리큘럼으로 기존 교재 및 강의와 차별된 강의를 제공합니다. 단순한 명령어 사용법이 아닌 도커를 왜 사용해야하는지 대한 근

www.inflearn.com

 

1. 이미지 커밋

Container commit, Dockerfile

이미지를 만드는 방법은 커밋빌드로 크게 두 가지이다. 실행 중인 컨테이너를 그 상태 그대로 이미지로 만들어내는 커밋 방식Dockerfile이라는 명세서를 통해서 이미지를 만드는 빌드 방식이다. 대부분은 빌드 방식을 사용하지만 빌드 방식은 커밋 방식으로 동작하기 때문에 알고 있어야 한다.

 

2. 커밋 방식

image commit

nginx 이미지 컨테이너를 생성하고 새로운 작업을 수행한다. 기본적으로 제공되는 웹페이지를 볼 수 있다.
index.html을 수정하여 hello.html으로 변경할 것이다.

 

Container Read/Write Layer

docker run 명령으로 nignx 를 실행하면 nignx 이미지 위에 읽기/쓰기 레이어인 컨테이너 레이어가 생성된다. 실행 중인 컨테이너에서 inhex.html 파일의 내용을 hello nginx으로 수정하면 nignx Image에 원래 있던 기존 파일을 컨테이너 레이어에 복사해 온 다음에 쓰기를 수행하게 된다. nignx Image는 읽기 전용이다.

 

docker commit

inhex.html파일이 수정된 상태에서 도커의 commit 기능을 사용하여 컨테이너 레이어까지 포함한 모든 레이어의 상태를 이미지로 저장할 수 있다. 지금까지는 이미지에서 컨테이너로 실행만 했는데 이번에는 commit으로 컨테이너의 상태를 이미지로 저장하는 것이다. 이처럼 수정하고 이미지를 저장하면 컨테이너 레이어를 포함하여 새로운 이미지가 생성된다.

 

3. run -it --name, commit -m

run, commit

docker run -it --name 컨테이너명 이미지명 bin/bash # 컨테이너 실행과 동시에 터미널 접속
docker commit -m 커밋명 실행중인컨테이너명 생성할이미지명 # 시행 중인 컨테이너를 이미지로 생성

컨테이너 실행과 동시에 터미널 접속은 보통 이미지 내부의 파일 시스템을 확인해보거나 디버깅할 때 많이 사용되는 방법이다. 이번 실습에서는 이 두 가지 명령을 사용하여 shell에 접속하고 ngin 이미지의 파일을 수정하여 새로운 이미지로 저장하자.

 

docker run -it --name officialNginx nginx bin/bash

docker run -it --name officialNginx nginx bin/bash

Nginx 컨테이너 실행과 동시에 터미널에 접속하는 것을 확인한다.

 

ls -al

ls -al

사용자의 컴퓨터가 아니라 nginx 내부 파일들을 살펴볼 수 있다.

 

docker ps

새로운 터미널에서 실행중인 컨테이너를 살펴보면 officalNginx가 실행 중이다. 실행 중인 nginx 컨테이너 내부에서 index.html 파일의 내용을 hello-my-nignx 으로 변경해보자.

 

echo hello-my-nginx > /usr/share/nginx/html/index.html

echo hello-my-nignx > /usr/share/nginx/html/index.html
cat /usr/share/nginx/html/index.html

 

 

docker commit -m "edited index.html by devwiki" -c "CMD [""\nginx\"", \""-g\"", \""deamon off;\""]" officialNginx 레지스트리명/commitnginx

docker commit -m "edited index.html by devwiki" -c "CMD [\""nginx\"", \""-g\"", \""daemon off;\""]" officialNginx <레지스트리계정명>/commitnginx
docker commit -m "edited index.html by devwiki" -c "CMD [\""nginx\"", \""-g\"", \""daemon off;\""]" officialNginx limdaeil94/commitnginx
docker image ls limdaeil94/commitnginx

Window 운영체제 환경인 PowerShell 에서 docker commit 을 수행하는 방법은 위와 같이 해야한다.

 

docker image history limdaeil94/commitnginx

docker image history limdaeil94/commitnginx

이미지 레이어 이력 조회를 위해 history 명령을 수행한다. 위의 그림처럼 nginx 이미지 레이어 위에 한 개의 레이어가 추가되면서 새로운 이미지가 생성된 것이다.

 

docker run -d -p 80:80 --name my-nginx limdaeil94/commitnginx

docker run -d -p 80:80 --name my-nginx limdaeil94/commitnginx
docker ps

localhost:80

새로운 이미지 my-nginx 를 실행하면 두 개의 nginx 가 정상적으로 실행된다.

shell 에서 logout

 

docker rm -f officialNginx my-nginx # 실습에 사용한 컨테이너 삭제

사용한 모든 컨테이너를 삭제한다. 컨테이너 삭제와 함께 officailNginx 컨테이너의 shell 접속은 자동으로 벗어나게 된다.

 

docker push limdaeil94/commitnginx

docker push limdaeil94/commitnginx # 실습에서 제작한 이미지 푸쉬

마지막으로 사용자의 레지스트리로 이미지를 푸쉬하자.

 

image commit 흐름

지금까지 이미지 커밋 방식으로 새로운 이미지를 생성했다. 실행 중인 nginx 이미지의 index.html 파일을 수정했다. 이때 읽기/쓰기 레이어인 container 레이어에서 파일 수정을 위해 읽기 전용 레이어인 nginx image 레이어로부터 index.html 파일을 복사하고 내용을 수정하고 확인했다. 그리고 commit 명령을 수행하여 nginx 이미지 레이어 위에 index.html 파일이 수정된 레이어 한 개가 추가된 새로운 nginx 이미지인 limdaeil94/commitnginx 이미지를 생성했다. 다음 시간에는 이미지 빌드에 대해 학습한다.