docker container commit 명령어를 사용하여 새로운 이미지 생성 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker container commit 명령을 사용하여 기존 컨테이너로부터 새로운 Docker 이미지를 생성하는 방법을 배우게 됩니다. 컨테이너를 시작하고 수정하는 것으로 시작하여, 이러한 변경 사항을 새로운 이미지에 커밋할 것입니다.

또한 새로운 CMD 및 EXPOSE 지침 설정을 포함하여, 새로운 구성으로 컨테이너 변경 사항을 커밋하는 방법을 탐구하여, 실행 중인 컨테이너를 기반으로 사용자 정의 이미지를 생성하는 유연성을 보여줄 것입니다.

컨테이너 시작 및 수정

이 단계에서는 Docker 컨테이너를 시작하고 내부에서 변경 사항을 만드는 방법을 배우게 됩니다. 이 과정을 시연하기 위해 간단한 Ubuntu 이미지를 사용합니다.

먼저, Ubuntu 이미지를 가져오겠습니다. 이 명령은 Docker Hub 에서 Ubuntu 이미지를 로컬 머신으로 다운로드합니다.

docker pull ubuntu:latest

이미지가 다운로드되고 있음을 나타내는 출력을 볼 수 있습니다. 다운로드가 완료되면 이 이미지를 기반으로 컨테이너를 실행할 수 있습니다.

이제 Ubuntu 이미지를 사용하여 대화형 컨테이너를 실행해 보겠습니다. -it 플래그는 가상 TTY 를 할당하고 stdin 을 열어두어 컨테이너의 셸과 상호 작용할 수 있도록 합니다. --name 플래그는 컨테이너에 이름을 할당하여 나중에 참조하기 쉽게 만듭니다.

docker run -it --name my-ubuntu ubuntu:latest /bin/bash

이 명령을 실행하면 컨테이너의 bash 셸 내부에 있게 됩니다. 컨테이너 ID 가 될 호스트 이름을 확인하여 이를 확인할 수 있습니다.

컨테이너 내부에서 간단한 파일을 만들어 보겠습니다. echo 명령을 사용하여 루트 디렉토리에 있는 hello.txt라는 파일에 텍스트를 작성합니다.

echo "Hello from inside the container!" > /hello.txt

cat 명령을 사용하여 파일이 생성되었고 올바른 내용을 포함하고 있는지 확인할 수 있습니다.

cat /hello.txt

"Hello from inside the container!"라는 출력을 볼 수 있습니다.

이제 컨테이너 내부에서 변경 사항을 만들었으므로 컨테이너의 셸을 종료해 보겠습니다.

exit

이제 호스트 머신의 터미널로 돌아왔습니다. 컨테이너는 백그라운드에서 계속 실행 중입니다. 실행 중인 컨테이너를 나열하여 이를 확인할 수 있습니다.

docker ps

my-ubuntu 컨테이너가 나열된 것을 볼 수 있습니다.

컨테이너 변경 사항을 새 이미지에 커밋

이전 단계에서는 파일을 생성하여 실행 중인 컨테이너 내부에서 변경 사항을 만들었습니다. 이제 이러한 변경 사항을 새로운 Docker 이미지로 저장하는 방법을 배우겠습니다. 이 프로세스를 컨테이너 커밋이라고 합니다.

컨테이너를 커밋하면 컨테이너의 파일 시스템 및 구성에 적용한 변경 사항을 포함하는 새로운 이미지가 생성됩니다. 이는 기존 이미지를 기반으로 사용자 정의 이미지를 생성하는 데 유용합니다.

컨테이너를 커밋하려면 docker commit 명령을 사용합니다. 기본 구문은 docker commit [container_name] [new_image_name]입니다. my-ubuntu 컨테이너를 커밋하고 새 이미지 이름을 my-ubuntu-modified로 지정합니다.

docker commit my-ubuntu my-ubuntu-modified

새로 생성된 이미지의 ID 인 긴 문자열을 출력으로 볼 수 있습니다.

이제 새 이미지가 생성되었는지 확인해 보겠습니다. 시스템의 모든 이미지를 나열하려면 docker images 명령을 사용할 수 있습니다.

docker images

출력에 원래의 ubuntu 이미지와 함께 my-ubuntu-modified가 나열된 것을 볼 수 있습니다.

변경 사항이 새 이미지에 저장되었는지 확인하기 위해 my-ubuntu-modified를 기반으로 새 컨테이너를 실행하고 이전 단계에서 생성한 파일을 확인해 보겠습니다.

docker run -it --name my-ubuntu-test my-ubuntu-modified /bin/bash

새 컨테이너 내부에 들어가서 /hello.txt 파일이 있는지 확인합니다.

cat /hello.txt

"Hello from inside the container!"라는 출력을 볼 수 있으며, 이는 변경 사항이 새 이미지에 성공적으로 커밋되었음을 확인합니다.

이제 컨테이너를 종료합니다.

exit

마지막으로, 방금 생성한 테스트 컨테이너를 정리해 보겠습니다.

docker rm -f my-ubuntu-test

새로운 설정으로 컨테이너 변경 사항 커밋

이 단계에서는 컨테이너 변경 사항을 커밋하고 결과 이미지에 대한 새로운 구성 설정을 포함하는 방법을 살펴보겠습니다. 이를 통해 컨테이너가 시작될 때 실행할 기본 명령이나 환경 변수와 같은 측면을 정의할 수 있습니다.

이전 단계에서 사용한 my-ubuntu 컨테이너를 계속 사용하겠습니다. 먼저, 현재 상태를 커밋할 것이므로 컨테이너를 중지합니다.

docker stop my-ubuntu

컨테이너 이름 my-ubuntu가 출력으로 표시되어 중지되었음을 나타냅니다.

이제 컨테이너를 커밋하고 새 이미지에 레이블을 추가해 보겠습니다. 레이블은 메타데이터를 추가하기 위해 이미지에 첨부할 수 있는 키 - 값 쌍입니다. 수정된 이미지의 버전을 나타내는 레이블을 추가합니다. -c 플래그를 사용하고 구성 지침을 따릅니다.

docker commit -c 'LABEL version="1.0"' my-ubuntu my-ubuntu-labeled

새로 생성된 이미지의 ID 를 출력으로 볼 수 있습니다.

새 이미지 my-ubuntu-labeled가 생성되었고 레이블이 적용되었는지 확인해 보겠습니다. docker inspect 명령을 사용하여 이미지에 대한 자세한 정보를 볼 수 있습니다.

docker inspect my-ubuntu-labeled

출력은 큰 JSON 객체입니다. Config 블록 내에서 "Labels" 섹션을 찾습니다. 거기에서 "version": "1.0"이 나열된 것을 볼 수 있습니다.

또는 필터링과 함께 docker inspect를 사용하여 레이블을 구체적으로 확인할 수 있습니다.

docker inspect --format '{{.Config.Labels}}' my-ubuntu-labeled

이 명령은 이미지와 관련된 레이블만 출력합니다. map[version:1.0]과 유사한 것을 볼 수 있습니다.

커밋 프로세스 중에 환경 변수를 설정하는 등 다른 구성을 추가할 수도 있습니다. my-ubuntu 컨테이너를 다시 커밋하고 이번에는 환경 변수를 추가해 보겠습니다.

docker commit -c 'ENV MY_VARIABLE="Hello Docker"' my-ubuntu my-ubuntu-env

docker inspect를 사용하여 새 이미지와 환경 변수를 확인합니다.

docker inspect --format '{{.Config.Env}}' my-ubuntu-env

[PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin MY_VARIABLE=Hello Docker]와 유사한 출력을 볼 수 있으며, 이는 환경 변수가 설정되었음을 확인합니다.

새로운 CMD 및 EXPOSE 지침으로 컨테이너 변경 사항 커밋

이 마지막 단계에서는 컨테이너 변경 사항을 커밋하고 새 이미지에 대한 기본 명령 (CMD) 및 노출된 포트 (EXPOSE) 를 설정하는 방법을 배우겠습니다.

CMD 지침은 명령을 지정하지 않고 이미지를 기반으로 컨테이너가 시작될 때 실행될 기본 명령을 설정합니다. EXPOSE 지침은 Docker 에 런타임 시 지정된 네트워크 포트에서 컨테이너가 수신 대기함을 알립니다.

my-ubuntu 컨테이너를 다시 커밋하고 이번에는 /hello.txt의 내용을 인쇄하고 포트 80 을 노출하는 기본 명령을 설정합니다.

먼저, my-ubuntu 컨테이너가 중지되었는지 확인합니다.

docker stop my-ubuntu

이제 CMDEXPOSE 지침을 사용하여 컨테이너를 커밋합니다. CMD 지침은 문자열의 JSON 배열로 제공됩니다.

docker commit -c 'CMD ["cat", "/hello.txt"]' -c 'EXPOSE 80' my-ubuntu my-ubuntu-final

새로 생성된 이미지의 ID 를 출력으로 볼 수 있습니다.

docker inspect를 사용하여 새 이미지 my-ubuntu-finalCMDEXPOSE 구성을 확인해 보겠습니다.

docker inspect --format '{{.Config.Cmd}}' my-ubuntu-final

이것은 [cat /hello.txt]를 출력하여 기본 명령이 설정되었음을 확인해야 합니다.

이제 노출된 포트를 확인해 보겠습니다.

docker inspect --format '{{.Config.ExposedPorts}}' my-ubuntu-final

map[80/tcp:{}]과 유사한 출력을 볼 수 있으며, 이는 포트 80 이 노출되었음을 나타냅니다.

마지막으로, 기본 CMD가 작동하는지 확인하기 위해 명령을 지정하지 않고 이 새 이미지에서 컨테이너를 실행해 보겠습니다.

docker run --rm my-ubuntu-final

--rm 플래그는 종료 시 컨테이너를 자동으로 제거합니다. 기본 명령이 cat /hello.txt이므로 컨테이너가 실행되고 "Hello from inside the container!"를 인쇄한 다음 종료되어야 합니다.

터미널에 "Hello from inside the container!"가 인쇄되는 것을 볼 수 있습니다.

이것은 컨테이너 변경 사항을 커밋하고 결과 이미지의 기본 동작 및 네트워크 구성을 정의하는 방법을 보여줍니다.

요약

이 랩에서는 Docker 컨테이너를 시작하고 수정하는 방법을 배웠습니다. Ubuntu 이미지를 가져와 이를 기반으로 대화형 컨테이너를 실행하고, 컨테이너 내에서 파일을 생성한 다음 컨테이너를 계속 실행하면서 컨테이너의 셸을 종료했습니다.

이후, 실행 중인 컨테이너 내에서 변경 사항을 커밋하여 새로운 Docker 이미지를 생성하는 방법을 배웠습니다. 이 프로세스를 통해 컨테이너의 현재 상태를 재사용 가능한 이미지로 저장할 수 있습니다.