임대일
4.2 도커(Docker) 이미지 빌드: 이미지 커밋(Commit) 본문
1. 이미지 커밋
이미지를 만드는 방법은 커밋과 빌드로 크게 두 가지이다. 실행 중인 컨테이너를 그 상태 그대로 이미지로 만들어내는 커밋 방식과 Dockerfile이라는 명세서를 통해서 이미지를 만드는 빌드 방식이다. 대부분은 빌드 방식을 사용하지만 빌드 방식은 커밋 방식으로 동작하기 때문에 알고 있어야 한다.
2. 커밋 방식
nginx 이미지 컨테이너를 생성하고 새로운 작업을 수행한다. 기본적으로 제공되는 웹페이지를 볼 수 있다.
index.html을 수정하여 hello.html으로 변경할 것이다.
docker run
명령으로 nignx 를 실행하면 nignx 이미지 위에 읽기/쓰기 레이어인 컨테이너 레이어가 생성된다. 실행 중인 컨테이너에서 inhex.html 파일의 내용을 hello nginx
으로 수정하면 nignx Image에 원래 있던 기존 파일을 컨테이너 레이어에 복사해 온 다음에 쓰기를 수행하게 된다. nignx Image는 읽기 전용이다.
inhex.html
파일이 수정된 상태에서 도커의 commit 기능을 사용하여 컨테이너 레이어까지 포함한 모든 레이어의 상태를 이미지로 저장할 수 있다. 지금까지는 이미지에서 컨테이너로 실행만 했는데 이번에는 commit으로 컨테이너의 상태를 이미지로 저장하는 것이다. 이처럼 수정하고 이미지를 저장하면 컨테이너 레이어를 포함하여 새로운 이미지가 생성된다.
3. run -it --name, commit -m
docker run -it --name 컨테이너명 이미지명 bin/bash # 컨테이너 실행과 동시에 터미널 접속
docker commit -m 커밋명 실행중인컨테이너명 생성할이미지명 # 시행 중인 컨테이너를 이미지로 생성
컨테이너 실행과 동시에 터미널 접속은 보통 이미지 내부의 파일 시스템을 확인해보거나 디버깅할 때 많이 사용되는 방법이다. 이번 실습에서는 이 두 가지 명령을 사용하여 shell에 접속하고 ngin 이미지의 파일을 수정하여 새로운 이미지로 저장하자.
docker run -it --name officialNginx nginx bin/bash
Nginx 컨테이너 실행과 동시에 터미널에 접속하는 것을 확인한다.
ls -al
사용자의 컴퓨터가 아니라 nginx 내부 파일들을 살펴볼 수 있다.
새로운 터미널에서 실행중인 컨테이너를 살펴보면 officalNginx가 실행 중이다. 실행 중인 nginx 컨테이너 내부에서 index.html 파일의 내용을 hello-my-nignx
으로 변경해보자.
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\"", \""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
이미지 레이어 이력 조회를 위해 history 명령을 수행한다. 위의 그림처럼 nginx 이미지 레이어 위에 한 개의 레이어가 추가되면서 새로운 이미지가 생성된 것이다.
docker run -d -p 80:80 --name my-nginx limdaeil94/commitnginx
docker ps
새로운 이미지 my-nginx 를 실행하면 두 개의 nginx 가 정상적으로 실행된다.
docker rm -f officialNginx my-nginx # 실습에 사용한 컨테이너 삭제
사용한 모든 컨테이너를 삭제한다. 컨테이너 삭제와 함께 officailNginx 컨테이너의 shell 접속은 자동으로 벗어나게 된다.
docker push limdaeil94/commitnginx # 실습에서 제작한 이미지 푸쉬
마지막으로 사용자의 레지스트리로 이미지를 푸쉬하자.
지금까지 이미지 커밋 방식으로 새로운 이미지를 생성했다. 실행 중인 nginx 이미지의 index.html 파일을 수정했다. 이때 읽기/쓰기 레이어인 container 레이어에서 파일 수정을 위해 읽기 전용 레이어인 nginx image 레이어로부터 index.html 파일을 복사하고 내용을 수정하고 확인했다. 그리고 commit 명령을 수행하여 nginx 이미지 레이어 위에 index.html 파일이 수정된 레이어 한 개가 추가된 새로운 nginx 이미지인 limdaeil94/commitnginx 이미지를 생성했다. 다음 시간에는 이미지 빌드에 대해 학습한다.
'도커 > 개발자를 위한 쉬운 도커' 카테고리의 다른 글
4.3 도커(Docker) 이미지 빌드: 이미지 빌드(Build) (0) | 2024.06.29 |
---|---|
4.1 도커(Docker) 이미지 빌드: 이미지와 레이어(Layer) (0) | 2024.06.29 |
3.2 도커(Docker) 이미지와 레지스트리: 이미지 레지스트리 실습 (0) | 2024.06.28 |
3.1 도커(Docker) 이미지와 레지스트리: 이미지 레지스트리 (0) | 2024.06.19 |
2.4 도커(Docker) 이미지와 컨테이너: 컨테이너의 라이프사이클(Lifecycle) (1) | 2024.06.19 |