본문 바로가기
AI Journey/클라우드

[Docker] 이미지 커밋(commit)과 Docker Hub 공유(push)

by 보눔비스타 2026. 1. 7.

이번에는 베이스 이미지를 실행하여 파일을 생성하고, 이를 커밋(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 방식은 컨테이너의 레이어 구조와 상태 저장의 원리를 이해하는 데 매우 중요한 기초가 된다.