Post

클라우드프로그래밍 5주차 — Docker 레지스트리 공유와 볼륨 영속성

이미지를 로컬 레지스트리에 push하고, 볼륨으로 컨테이너 데이터를 영속화하는 두 축을 다룬 5주차 기록. 컨테이너를 지웠다 다시 띄워도 데이터가 남는지 todo 앱으로 확인했다.

클라우드프로그래밍 5주차 — Docker 레지스트리 공유와 볼륨 영속성

5주차는 두 가지를 다뤘다. 하나는 이미지를 레지스트리(Docker Hub/로컬) 에 올려 공유하는 것, 다른 하나는 볼륨(volume) 으로 데이터를 컨테이너 바깥에 남기는 것이다.

핵심 개념 정리

  • 이미지 참조 = [레지스트리호스트[:포트]/]리포지터리/이미지[:태그]. 태그를 생략하면 :latest.
  • 레지스트리: 이미지를 저장·배포하는 서버. 퍼블릭(Docker Hub) / 사설(로컬 diamol/registry).
  • 컨테이너 쓰기 레이어는 컨테이너를 지우면 같이 사라진다 → 영속 데이터는 볼륨 에 둬야 한다.
  • 명명 볼륨(named volume): Docker가 관리하는 영속 스토리지. 컨테이너를 지워도 볼륨은 남아 다른 컨테이너에 다시 마운트할 수 있다.

이미지 pull / 실행 / 환경변수

pull (레이어 단위 다운로드)

1
2
3
4
5
6
7
$ docker image pull diamol/ch03-web-ping
latest: Pulling from diamol/ch03-web-ping
78b9b6c949f8: Pull complete
89e5cf82282d: Pull complete
... (6 layers) ...
Digest: sha256:2f2dce710a7f287afc2d7bbd0d68d024bab5ee37a1f658cef46c64b1a69affd2
Status: Downloaded newer image for diamol/ch03-web-ping:latest

이름 붙여 실행 + 로그 (기본 대상 = blog.sixeyed.com)

1
2
3
4
5
$ docker container run -d --name web-ping diamol/ch03-web-ping
$ docker container logs web-ping
** web-ping ** Pinging: blog.sixeyed.com; method: HEAD; 3000ms intervals
Making request number: 1; Got response status: 200; duration: 122ms
Making request number: 2; Got response status: 200; duration: 20ms

환경변수(--env TARGET)로 동작 바꾸기 → google.com

1
2
3
4
$ docker container run -d --name web-ping2 --env TARGET=google.com diamol/ch03-web-ping
$ docker container logs web-ping2
** web-ping ** Pinging: google.com; method: HEAD; 3000ms intervals
Making request number: 1; Got response status: 301; duration: 200ms

같은 이미지라도 환경변수로 설정을 주입하면 동작이 달라진다(설정 외부화). google.com 은 https 리다이렉트라 301 이 떨어진다.

로컬 레지스트리에 push

1
2
3
4
5
6
7
8
9
10
$ docker run -d -p 5000:5000 --restart always --name registry diamol/registry
$ docker image tag diamol/ch03-web-ping localhost:5000/gallery/web-ping:v1
$ docker image push localhost:5000/gallery/web-ping:v1
bbec46749066: Pushed
78b9b6c949f8: Pushed
v1: digest: sha256:98de6bee1ad542d48ebec049af712f8055de5fd1e0099bf05bfe4cee473896e0 size: 1572

$ docker image ls localhost:5000/gallery/web-ping
REPOSITORY                        TAG   IMAGE ID       SIZE
localhost:5000/gallery/web-ping   v1    2f2dce710a7f   118MB

태그를 사내 레지스트리(localhost:5000)용으로 바꿔 push했다. 사내 레지스트리를 운영하는 상황을 축소해 재현한 것이다.

볼륨 영속성 확인하기

명명 볼륨 생성 + todo 웹앱 실행 (localhost:8011)

1
2
3
4
$ docker volume create todo-list
$ docker container run -d -p 8011:80 -v todo-list:/data --name todo-v1 diamol/ch06-todo-list
$ curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8011
200

처음 접속하면 항목이 0개다.

todo 앱 초기 화면 (0 items)

웹에서 항목 추가 → 볼륨에 DB 파일 생성

브라우저로 항목을 추가하면 /data/todo-list.db(SQLite)가 볼륨에 기록된다.

1
2
$ docker exec todo-v1 ls -l /data
-rwxr-xr-x 1 root root 12288 Apr 14 21:05 todo-list.db

항목 추가 후 목록

컨테이너 삭제 → 같은 볼륨으로 재생성 → 데이터 유지 확인

1
2
3
4
$ docker rm -f todo-v1                     # 컨테이너(+쓰기레이어) 삭제
$ docker container run -d -p 8011:80 -v todo-list:/data --name todo-v2 diamol/ch06-todo-list
$ docker exec todo-v2 ls -l /data
-rwxr-xr-x 1 root root 12288 Apr 14 21:05 todo-list.db   # ← 같은 파일/타임스탬프 유지!

새 컨테이너(todo-v2)에서도 이전에 추가한 항목이 그대로 보인다. 볼륨이 데이터를 유지하고 있다는 의미다.

컨테이너 재생성 후에도 데이터 유지 todo-v1 을 지우고 todo-v2 를 같은 볼륨으로 띄웠는데, 앞서 추가한 항목이 그대로 남아 있다.

정리

1
2
$ docker rm -f web-ping web-ping2 todo-v2 registry
$ docker volume rm todo-list

정리

환경변수 주입으로 “한 이미지 → 여러 환경”을 구성할 수 있다(설정 외부화). 그리고 컨테이너를 삭제한 뒤 같은 볼륨으로 재생성해도 데이터가 유지된다는 점에서, 컨테이너는 일회용, 데이터는 볼륨 이라는 원칙을 확인했다. 로컬 레지스트리 push는 “아티팩트는 저장소에 둔다”는 패턴을 작게 다뤄 본 부분이다.

This post is licensed under CC BY 4.0 by the author.