1. 레지스트리 / 리포지터리 / 이미지 태그
도커 레지스트리란?
도커 플랫폼은 소프트웨어 배포 기능을 내장하고 있어서, 로컬에 이미지가 없어도 자동으로 다운로드해준다. 이때 이미지가 저장되는 서버를 레지스트리(Registry) 라고 한다.
도커 허브(Docker Hub) 는 도커 레지스트리 중 가장 유명한 레지스트리로, 수십만 종 이상의 이미지를 제공하며 도커 엔진에 기본으로 설정되어 있다.
도커 이미지 참조 구조
docker.io / diamol / golang : latest
│ │ │ │
레지스트리 계정이름 리포지터리 태그
구성요소 설명 기본값
| 레지스트리 도메인 | 이미지가 저장된 서버 | docker.io (도커 허브) |
| 계정 이름 | 이미지 작성자의 개인/단체 이름 | - |
| 리포지터리 | 애플리케이션 이름. 여러 버전의 이미지를 담을 수 있음 | - |
| 태그 | 버전 또는 변종 | latest |
이미지 태그를 효율적으로 사용하기
major.minor.patch 형식으로 버전 관리를 하면 아래처럼 여러 태그를 하나의 이미지에 붙일 수 있다.
:latest
:2
:2.1
:2.1.106 ← 실제 빌드 번호 (고정된 특정 버전)
latest, 2, 2.1 같은 태그는 별명(alias) 역할을 하며, 새 버전이 나올 때마다 해당 태그를 새 이미지로 옮겨주면 된다. 2.1.106 처럼 구체적인 태그는 절대 변하지 않는 특정 빌드를 가리킨다.
2. 공식 이미지 vs 골든 이미지
공식 이미지 (Official Image)
도커 허브는 검증된 퍼블리셔(Verified Publisher) 와 공식 이미지(Official Image) 제도를 통해 악성 이미지 배포를 방지한다.
- 마이크로소프트, 오라클, IBM 같은 신뢰할 수 있는 기업이 검증된 퍼블리셔로 지정됨
- 공식 이미지는 오픈소스 소프트웨어가 대부분이며, 해당 프로젝트 팀과 도커가 함께 관리
- 취약점 탐색을 거치고 주기적으로 업데이트됨
- 모든 Dockerfile 스크립트가 깃허브 저장소에 공개되어 있음
골든 이미지 (Golden Image)
공식 이미지를 기반으로 우리 팀의 설정/보안 정책을 추가해서 만든 커스텀 기반 이미지다.
공식 이미지 (openjdk:11.0.3)
↓
골든 이미지 (golden/openjdk:1907) ← 공식 이미지 + 우리 팀 커스터마이징
↓
실제 앱 이미지 (project/java-app) ← 골든 이미지를 FROM으로 사용
이 구조를 쓰면 신뢰성 있는 공식 이미지의 장점 + 팀의 커스터마이징을 함께 가져갈 수 있다.
3. 나만의 도커 레지스트리 운영
도커 허브 외에 로컬에서 직접 레지스트리를 컨테이너로 실행할 수도 있다.
로컬 레지스트리를 실행한 뒤, 이미지에 해당 레지스트리 도메인을 포함한 태그를 붙여서 푸시하면 된다.
# 로컬 레지스트리에 태그 붙이기
docker image tag image-gallery registry.local:5000/gallery/ui:v1
# 로컬 레지스트리에 푸시
docker image push registry.local:5000/gallery/ui:v1
⚠️ HTTP를 사용하는 로컬 레지스트리는 도커 설정에서 비보안 레지스트리 허용 목록에 추가해야 사용 가능하다.
{ "insecure-registries": ["registry.local:5000"] }
4. 도커 볼륨을 이용한 퍼시스턴트 스토리지
컨테이너 속 데이터가 사라지는 이유
컨테이너의 파일 시스템은 이미지 레이어(읽기 전용) + 기록 가능 레이어로 구성된다.
컨테이너 rn1 이미지 컨테이너 rn2
┌─────────────┐ ┌───────────┐ ┌─────────────┐
│ 기록가능레이어 │ │ 앱 레이어 │ │ 기록가능레이어 │
│ (컨테이너마다 │◀──│ 운영체제 │──▶ │ (컨테이너마다 │
│ 다름) │ │ 레이어 │ │ 다름) │
└─────────────┘ └───────────┘ └─────────────┘
컨테이너를 삭제하면 기록 가능 레이어도 함께 삭제된다. 즉, 컨테이너 안에서 생성/수정한 데이터는 컨테이너가 사라지면 함께 사라진다.
도커 볼륨 (Docker Volume)
볼륨은 컨테이너와 독립적으로 존재하며 별도의 생애주기를 가진다. 컨테이너에 연결하면 컨테이너 파일 시스템의 한 디렉터리처럼 동작한다.
컨테이너 삭제 → 기록 가능 레이어 삭제
볼륨 → 그대로 유지 ✅
애플리케이션을 새 버전으로 업데이트할 때 기존 볼륨을 새 컨테이너에 다시 연결하면 데이터가 그대로 유지된다.
볼륨 사용 방법 2가지:
- 직접 볼륨을 생성해서 컨테이너에 연결 (docker volume create + -v 플래그)
- Dockerfile의 VOLUME 인스트럭션 사용 → 컨테이너 실행 시 자동으로 볼륨 생성
파일 시스템 마운트 (Bind Mount)
볼륨과 달리 호스트 컴퓨터의 특정 디렉터리를 직접 컨테이너에 연결하는 방식이다.
호스트의 ./databases 폴더 ←→ 컨테이너의 /data 디렉터리
설정 파일이나 개발 중인 소스코드를 컨테이너와 공유할 때 유용하다. readonly 옵션을 붙이면 컨테이너가 파일을 읽기만 할 수 있다.
5. 도커 컴포즈로 분산 애플리케이션 실행하기
도커 컴포즈란?
여러 컨테이너로 구성된 애플리케이션을 한 번에 정의하고 실행하는 도구다. docker container run 명령에 넣던 모든 옵션을 하나의 YAML 파일로 관리한다.
도커 컴포즈는 이 파일을 읽어 컨테이너, 네트워크, 볼륨 등 필요한 모든 도커 객체를 도커 API를 통해 생성한다.
컴포즈 파일 구조
version: '3.7'
services: # 실행할 컨테이너들 정의
todo-web:
image: diamol/ch06-todo-list
ports:
- "8020:80"
networks:
- app-net
networks: # 네트워크 정의
app-net:
external:
name: nat # 외부에 미리 만들어진 네트워크 참조
주요 명령어
명령어 설명
| docker-compose up -d | 백그라운드로 애플리케이션 실행 |
| docker-compose down | 컨테이너 + 컴포즈 관리 리소스 모두 삭제 |
| docker-compose stop | 컨테이너만 중지 (삭제 X, 파일 시스템 유지) |
| docker-compose start | 중지된 컨테이너 재시작 |
| docker-compose ps | 컨테이너 목록 확인 |
| docker-compose logs | 로그 확인 |
| docker-compose up -d --scale iotd=3 | 특정 서비스 컨테이너 수 늘리기 |
⚠️ docker-compose down 후 up을 하면 컴포즈 파일 기준으로 초기화되기 때문에, scale로 늘렸던 컨테이너 수가 다시 1개로 돌아온다.
도커 컨테이너 간의 통신 (DNS)
도커에는 DNS 서비스가 내장되어 있어, 같은 네트워크에 있는 컨테이너끼리 서비스 이름(컨테이너 이름)을 도메인처럼 사용해 통신할 수 있다.
# image-gallery 컨테이너 안에서 accesslog 서비스 주소 조회
nslookup accesslog
# → 172.24.0.2 처럼 IP가 반환됨
서비스를 스케일 아웃(컨테이너 3개)하면 DNS 조회 시 3개의 IP가 모두 반환된다. 클라이언트는 그 중 하나를 선택해 요청을 보내는 방식으로 로드밸런싱이 자연스럽게 이루어진다.
6. 실습 명령어 모음
개념을 익혔다면 아래 명령어로 직접 실습해보자!
도커 허브 이미지 푸시
# macOS/Linux
export dockerId="도커허브계정이름"
# 도커 허브 로그인
docker login --username $dockerId
# 이미지에 태그 붙이기
docker image tag image-gallery $dockerId/image-gallery:v1
# 도커 허브에 푸시
docker image push $dockerId/image-gallery:v1
# 푸시된 이미지 URL 확인
echo "https://hub.docker.com/r/$dockerId/image-gallery/tags"
로컬 레지스트리 운영
# 레지스트리 컨테이너 실행
docker container run -d -p 5000:5000 --restart always diamol/registry
# hosts 파일에 도메인 등록 (macOS/Linux)
echo $'\n127.0.0.1 registry.local' | sudo tee -a /etc/hosts
# 이미지 태그 후 로컬 레지스트리에 푸시
docker image tag image-gallery registry.local:5000/gallery/ui:v1
docker image push registry.local:5000/gallery/ui:v1
볼륨 실습
# 볼륨 생성
docker volume create todo-list
# 볼륨 연결해서 컨테이너 실행 (Linux)
target='/data'
docker container run -d -p 8011:80 -v todo-list:$target --name todo-v1 diamol/ch06-todo-list
# v1 삭제 후 v2에 같은 볼륨 연결 → 데이터 유지 확인
docker container rm -f todo-v1
docker container run -d -p 8011:80 -v todo-list:$target --name todo-v2 diamol/ch06-todo-list:v2
바인드 마운트 실습
# Linux
source="$(pwd)/databases" && target='/data'
mkdir ./databases
docker container run --mount type=bind,source=$source,target=$target -d -p 8012:80 diamol/ch06-todo-list
ls ./databases # 컨테이너에서 생성된 파일 확인
도커 컴포즈 실습
# 네트워크 생성
docker network create nat
# 애플리케이션 실행
cd ./ch07/exercises/image-of-the-day
docker-compose up --detach
# iotd 서비스 3개로 스케일 아웃
docker-compose up -d --scale iotd=3
# 로그 확인
docker-compose logs --tail=1 iotd
# 중지 / 재시작
docker-compose stop
docker-compose start
# 전체 삭제 후 재실행
docker-compose down
docker-compose up -d
컨테이너 간 DNS 통신 확인
# image-gallery 컨테이너에 접속
docker container exec -it image-of-the-day_image-gallery_1 sh
# DNS 조회
nslookup accesslog
nslookup iotd # 스케일 아웃 시 여러 IP 반환 확인
exit
'Cloud > 클라우드 프로그래밍' 카테고리의 다른 글
| [클라우드 프로그래밍] 10주차 (0) | 2026.06.16 |
|---|---|
| [클라우드 프로그래밍] 9주차 (0) | 2026.06.16 |
| [클라우드 프로그래밍] 7주차 (0) | 2026.05.10 |
| [클라우드 프로그래밍] 6주차 (0) | 2026.05.10 |
| [클라우드 프로그래밍] 2주차 (0) | 2026.03.22 |