이번에는 베이스 이미지를 실행하여 파일을 생성하고, 이를 커밋(commit)하여 새로운 이미지로 만든 뒤 Docker Hub에 배포(push)하고 다른 환경에서 내려받아(pull) 확인하는 전체 라이프사이클을 살펴본다.
Workflow
작업의 전체 흐름은 로컬 환경에서 컨테이너를 변경하고 이미지를 생성하는 단계(build/commit), 원격 저장소로 업로드하는 단계(push), 그리고 타 환경에서 이를 실행하는 단계(run/pull)로 나뉜다.

1단계: 베이스 이미지 실행 및 변경사항 발생
가장 먼저 베이스가 될 OS 이미지를 실행하고, 컨테이너 내부에서 파일 생성 등의 작업을 수행한다.
여기서는 ubuntu:16.04를 사용했다.
docker run -it --name comm_test1 ubuntu:16.04 /bin/bash
Unable to find image 'ubuntu:16.04' locally
16.04: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:16.04
# 컨테이너 내부 진입 후 파일 생성
root@a66707307fa7:/# echo "My first push on web" > first_push.txt
root@a66707307fa7:/# ls
bin dev first_push.txt lib media opt root sbin sys usr
boot etc home lib64 mnt proc run srv tmp var
root@a66707307fa7:/# exit
- 이미지 레이어와 컨테이너: 로컬에 이미지가 없으면 Docker Hub에서 자동으로 pull을 수행한다. 컨테이너가 실행되면 이미지의 읽기 전용(Read-Only) 레이어 위에 얇은 읽기/쓰기(Read-Write) 레이어가 올라간다.
- 변경사항의 휘발성: 위에서 생성한 first_push.txt는 이 R/W 레이어에 저장된다. 컨테이너를 삭제하면 이 파일도 함께 사라진다. 영구적으로 보존하거나 배포하려면 이 상태를 '이미지'로 박제해야 한다.
2단계: 컨테이너 상태를 이미지로 저장 (Commit)
컨테이너에서의 변경 사항(파일 생성 등)을 포함한 상태 그대로를 새로운 이미지로 저장한다.
docker commit comm_test1 comm_test2
- docker commit [컨테이너명] [새이미지명]: 실행 중이거나 중지된 컨테이너의 파일 시스템 변경 사항을 새로운 이미지로 생성한다. 마치 Git에서 코드를 커밋하듯, 컨테이너의 현재 상태(스냅샷)를 이미지로 저장하는 것이다.
3단계: 태그 설정 및 Docker Hub 배포 (Tag & Push)
생성된 로컬 이미지를 외부에서 접근 가능한 저장소(Docker Hub)에 올리기 위해서는 명명 규칙을 준수해야 한다.
# 태그 설정
docker tag comm_test2 [Docker hub 사용자명]/comm_test2:0.0
# 이미지 확인
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[Docker hub 사용자명]/comm_test2 0.0 a99bfb69734b About a minute ago 135MB
comm_test2 latest a99bfb69734b About a minute ago 135MB
# 로그인
docker login
Username: [Docker hub 사용자명]
Password:
Login Succeeded
# 이미지 푸시
docker push [Docker hub 사용자명]/comm_test2:0.0
The push refers to repository [docker.io/[Docker hub 사용자명]/comm_test2]
3f4479677010: Pushing [==================================================>] 3.584kB
...
동작 원리
- 네임스페이스 규칙: Docker Hub에 이미지를 올리려면 이미지 이름이 [사용자ID]/[이미지명]:[태그] 형식을 따라야 한다. docker tag 명령어는 기존 이미지 ID를 가리키는 새로운 별칭(Alias)을 만드는 역할을 한다. (위 결과를 보면 IMAGE ID가 동일함을 알 수 있다.)
- Docker Registry: docker push는 로컬에 저장된 이미지 레이어들을 원격 레지스트리로 전송한다. 이때 베이스 이미지(Ubuntu 16.04)의 레이어는 이미 Hub에 존재하므로, 변경된 레이어(여기서는 파일이 추가된 부분)만 효율적으로 업로드된다.
4단계: 다른 환경에서 이미지 다운로드 및 검증 (Pull & Run)
이제 다른 환경(다른 머신)에서 업로드한 이미지를 내려받아, 원본 컨테이너에서 생성했던 파일이 그대로 존재하는지 확인한다.
# 타 호스트 로그인
docker login -u [Docker hub 사용자명]
# 이미지 다운로드
docker pull [Docker hub 사용자명]/comm_test2:0.0
0.0: Pulling from [Docker hub 사용자명]/comm_test2
...
Status: Downloaded newer image for cordilog/comm_test2:0.0
# 컨테이너 실행 및 파일 확인
docker run -it [Docker hub 사용자명]/comm_test2:0.0 bin/bash
root@0e6097909428:/# ls
bin dev first_push.txt lib media opt root sbin sys usr
...
시사점
- 환경 일관성(Consistency): Host A에서 작업했던 first_push.txt 파일이 Host B에서 실행한 컨테이너에도 정확히 존재한다.
- 배포의 용이성: 복잡한 설정 과정 없이 pull과 run만으로 동일한 환경을 즉시 복제해낼 수 있다.
실제 현업에서는 docker commit보다는 Dockerfile을 이용해 이미지를 빌드(Build)하는 방식을 더 선호하지만(IaC, 관리가 용이함), commit 방식은 컨테이너의 레이어 구조와 상태 저장의 원리를 이해하는 데 매우 중요한 기초가 된다.
'AI Journey > 클라우드' 카테고리의 다른 글
| [Docker] 리소스 모니터링 도구 - events, stats, system, cAdvisor (0) | 2026.01.08 |
|---|---|
| [Docker] 파이썬 코드로 도커 제어하기: Docker SDK 활용 기초 (0) | 2026.01.08 |
| [Docker] Private Registry 구축 및 이미지 배포 워크플로우 (0) | 2026.01.07 |
| [Docker] Dockerfile을 이용해서 이미지 빌드하고 실행하기 (3) - 웹 페이지 배포 (0) | 2026.01.07 |
| [Docker] Dockerfile을 이용해서 이미지 빌드하고 실행하기 (2) - Apache (0) | 2026.01.07 |