⚓ 컨테이너의 데이터 영속성과 데이터 공유를 위해 제공되는 특별한 저장소 메커니즘
컨테이너 내부의 데이터는 기본적으로 일시적이어서 컨테이너가 삭제되면 함께 사라지지만, 볼륨을 사용하면 컨테이너의 생명주기와 무관하게 데이터를 안전하게 보존할 수 있음
하나의 볼륨을 여러 컨테이너에 동시에 마운트하여 데이터를 공유할 수 있음
볼륨은 컨테이너와 별도로 생성·삭제되며, 명시적으로 볼륨을 삭제하지 않는 한 데이터는 남아 있음
도커 볼륨은 기본적으로 호스트 시스템의 /var/lib/docker/volumes/
디렉터리 아래에 저장
도커 볼륨(Docker-managed Volume) - 추천
바인드 마운트(Bind Mount)
tmpfs 마운트
구분 | 볼륨 마운트 | 바인드 마운트 |
---|---|---|
관리 주체 | Docker가 직접 관리 | 사용자가 직접 관리 |
저장 위치 | Docker 내부 디렉토리 | 호스트의 임의 경로 |
권한/인식성 | 권한 문제 적용, OS에 독립적 | 권한 문제 발생 가능, OS에 종속적 |
CLI/API 지원 | Docker 명령어로 관리 가능 | 직접 파일/폴더 관리 |
공유/백업/이동 | 쉽고 안전하게 가능 | 제한적, 수동 관리 필요 |
사용 용도 | 프로덕션, 데이터 안전한 공유 | 개발 환경, 실시간 파일 공유 |
💡 이미 저장된 volume이 보고 싶다면?
docker volume ls
# docker volume create [OPTIONS] [VOLUME]
docker volume create --name myvol01
# mountpoint 확인
docker volume inspect myvol01
구분 | --volume(-v) 옵션 | --mount 옵션 |
---|---|---|
구문 | 짧고 간단 | 명확하고 세부 설정 가능 |
사용 목적 | 단순 볼륨/바인드 마운트 | 복잡한 마운트, 여러 옵션 지정 필요 시 |
지원 타입 | volume, bind (tmpfs 는 미지원) | volume, bind, tmpfs 등 모두 지원 |
옵션 지정 | 제한적 (읽기 전용 등 일부만 지원) | type, source, target, readonly 등 다양 |
가독성/확장성 | 간단한 상황에 적합 | 복잡한 상황, 여러 마운트에 적합 |
🖥 볼륨을 이용한 컨테이너 생성 (-v
)
# 볼륨을 이용한 컨테이너 생성
docker run -d --name postgres01 \
-e POSTGRES_PASSWORD=bzeromo \
-v postgresvol:/var/lib/postgresql/data \
postgres:15.13-bullseye
# 컨테이너 내부에서 사용자 추가
docker exec -it postgres01 /bin/bash
psql -U postgres
create user ubuntu password 'ubuntu';
\du
\q
exit
# 컨테이너 삭제
docker rm -f postgres01
# 새로운 컨테이너 생성 후 ubuntu 계정 확인
# 같은 볼륨을 활용했기 때문에 계정이 남아있어야 함
docker run -d --name postgres02 \
-e POSTGRES_PASSWORD=bzeromo \
-v postgresvol:/var/lib/postgresql/data \
postgres:15.13-bullseye
docker exec -it postgres02 /bin/bash
psql -U postgres
\du
🖥 bind mount를 활용한 컨테이너 생성 (-v
)
# bind mount
mkdir -p ~/vols/nginx/html
mkdir -p ~/vols/nginx/conf.d
echo "<h1>Hello, Bzero? Bind mount time.</h1>" \
> ~/vols/nginx/html/index.html
docker run -d --name nginx01 \
-p 9090:80 \
-v ~/vols/nginx/html:/usr/share/nginx/html \
nginx
curl localhost:9090
# index.html 변경 후 확인
echo "<h2>Hello, mo? It's bind mount time.</h2>" \
>> ~/vols/nginx/html/index.html
curl localhost:9090
💡 이렇게 즉각적인 변화에는 bind mount가 유리할 수 있다.
⚓ Docker 컨테이너 애플리케이션을 정의하고 실행하기 위한 도구
단일 명령어로 복잡한 다중 컨테이너 애플리케이션을 쉽게 배포, 관리할 수 있게 해 줌
YAML 파일을 사용하여 애플리케이션의 서비스 정의
이 파일에는 서비스 이름, 사용할 이미지, 볼륨 마운트, 네트워크, 환경변수 등의 설정 포함
하나의 애플리케이션을 구성하는 여러 개의 서비스(웹서버, 데이터베이스, 캐시 등)를 하나의 docker-compose.yml
파일로 정의하고 실행할 수 있음
서비스 간의 의존성을 정의하면, 자동으로 해당 서비스들을 연결하고 통신할 수 있도록 설정
개발 및 테스트 환경 설정:
마이크로서비스 애플리케이션 배포:
CI/CD 파이프라인 자동화:
속성명 | 설명 |
---|---|
version | Compose 파일의 포맷 버전 지정. 파일 내에서 사용 가능한 기능과 문법을 결정 최신 Compose에서는 version 명시를 생략하는 경우도 있음 |
services | 실제로 실행할 컨테이너 서비스들의 목록 정의. 각 서비스는 별도의 컨테이너로 동작하며, 이미지, 빌드, 환경 변수, 포트, 볼륨, 네트워크 등 다양한 하위 설정을 포함 |
networks | 서비스 간 통신을 위한 사용자 정의 네트워크 정의 네트워크 이름, 드라이버(bridge, overlay 등), 옵션 등을 지정할 수 있음 |
volumes | 컨테이너와 호스트 간, 또는 컨테이너 간에 데이터를 공유할 수 있는 볼륨 정의 볼륨의 이름, 드라이버, 옵션 등을 설정할 수 있음 |
configs | (Swarm 환경) 서비스에서 사용할 설정 파일 정의 Swarm 모드에서 주로 사용하며, 민감하지 않은 설정 정보를 안전하게 배포할 수 있음 |
secrets | (Swarm 환경) 서비스에서 사용할 민감 정보(예: 비밀번호, 인증서 등)를 안전하게 저장하고 배포할 때 사용 |
extensions | x- 로 시작하는 커스텀 확장 속성으로, 반복되는 설정을 재사용하거나 템플릿처럼 활용할 때 사용공식 스펙에는 포함되지 않지만, YAML의 anchor/alias와 함께 자주 활용 |
속성 | 설명 |
---|---|
image | 사용할 도커 이미지 이름 지정. 예: nginx:latest |
build | Dockerfile 위치나 빌드 컨텍스트 지정. image 와 함께 사용 시 빌드 후 해당 이름으로 태그됨 |
ports | 호스트와 컨테이너 간 포트 매핑 지정. "호스트포트:컨테이너포트" 형식 |
volumes | 호스트↔컨테이너, 컨테이너↔컨테이너 간 디렉터리 또는 볼륨 매핑. "호스트경로:컨테이너경로" 또는 "볼륨명:경로" |
environment | 환경 변수 지정. key-value 쌍 또는 리스트 형식 모두 지원 |
env_file | 환경 변수 목록 파일 지정. environment 에서 덮어쓸 수 있음 |
command | 컨테이너 시작 시 실행할 명령 지정 (Dockerfile의 CMD 덮어씀) |
entrypoint | 컨테이너 시작 시 실행할 엔트리포인트 지정 (ENTRYPOINT 덮어씀) |
depends_on | 해당 서비스 실행 전 필요한 다른 서비스 지정. 실행 순서 제어 목적 |
links | 연결할 다른 서비스 지정. 같은 네트워크에 연결됨 (구버전 방식) |
networks | 컨테이너가 연결될 사용자 정의 네트워크 지정. 다중 네트워크도 가능 |
restart | 컨테이너 재시작 정책 지정. 예: always , on-failure 등 |
healthcheck | 컨테이너 상태 확인용 명령과 조건 지정. 주기적 상태 체크 |
deploy | (Swarm 전용) 복제 수, 배치 조건, 리소스 제한 등 배포 전략 지정 |
labels | 컨테이너에 메타데이터(라벨) 추가. 관리/검색/오케스트레이션에 활용 |
extra_hosts | 컨테이너의 /etc/hosts 파일에 추가할 호스트 정보 지정 |
user | 컨테이너 내에서 사용할 사용자(UID/GID) 지정 |
working_dir | 컨테이너 내 작업 디렉터리 지정 |
tty | TTY 할당 여부 지정. 대화형 터미널 사용 시 유용 |
stdin_open | 표준 입력 유지 여부 지정. 대화형 세션 지원 시 사용 |
🖥 compose.yaml
파일 예시
version: "3.9" # Compose 파일 버전(생략 가능)
services: # 컨테이너 서비스 목록
서비스이름:
image: 이미지명:태그 # 사용할 도커 이미지
build: . # Dockerfile로 이미지 빌드
command: ... # 컨테이너 시작 시 실행할 명령
entrypoint: ... # 컨테이너 시작 시 ENTRYPOINT 지정
ports: # 포트 매핑 (호스트:컨테이너)
- "8080:80"
expose: # 컨테이너 내부 포트만 노출(호스트에는 노출X)
- "3306"
volumes: # 볼륨/바인드 마운트
- ./data:/var/lib/mysql
environment: # 환경 변수
- MYSQL_ROOT_PASSWORD=1234
- TZ=Asia/Seoul
depends_on: # 의존 서비스(먼저 실행)
- db
networks: # 네트워크 지정
- frontend
- backend
volumes: # 볼륨 정의
data-volume:
networks: # 네트워크 정의
frontend:
backend:
❗
.yaml
형식 파일의 들여쓰기는tab
한번이자 3번 띄어쓰기임을 기억하자