결론
Docker 컨테이너는 이미지 기반으로 운영되며 불변성을 유지하는 구조를 갖는다.
이는 환경의 일관성을 유지하고 배포 및 롤백을 용이하게 하며, 버전 관리를 최적화하는 등의 장점을 제공한다.
그러나 이러한 불변성으로 인해 컨테이너 내부의 데이터는 기본적으로 휘발성이며, 컨테이너가 삭제되면 데이터도 함께 사라지는 문제가 발생할 수 있다.
이를 해결하기 위해 Docker Volume을 사용하면 컨테이너의 수명과 관계없이 데이터를 지속적으로 유지할 수 있다. 또한, 바인드 마운트를 활용하면 호스트 시스템의 특정 디렉터리를 컨테이너와 공유하여 영구적인 데이터 저장이 가능하다.
따라서 컨테이너의 불변성을 유지하면서도 데이터를 보호하고 지속적으로 활용하기 위해서는 Docker Volume과 바인드 마운트를 잘 활용해야한다.
Docker Container란?
Docker 컨테이너는 애플리케이션과 그 실행에 필요한 모든 환경(라이브러리, 종속성, 설정 파일 등)을 하나의 패키지로 묶어 격리된 상태에서 실행할 수 있도록 해주는 가상화 기술이다. 이를 통해 환경에 구애받지 않고 어디서든 일관된 방식으로 애플리케이션을 실행할 수 있다.
컨테이너의 불변성
Docker 컨테이너는 가볍고 일관된 실행 환경을 제공하기 위해 이미지 기반 배포 방식을 따른다.
컨테이너는 불변(immutable) 구조를 가지며, 기존 컨테이너를 직접 수정하는 것이 아니라,
새로운 이미지를 빌드하고 이를 기반으로 새로운 컨테이너를 실행하는 방식으로 운영된다.
이러한 방식은 다음과 같은 이점을 제공한다.
- 환경의 일관성 유지: 개발, 테스트, 운영 환경에서 동일한 이미지를 사용하므로 환경 차이로 인한 문제를 방지할 수 있다.
- 배포 및 롤백 용이: 문제가 발생하면 기존 컨테이너를 수정하는 것이 아니라, 이전 버전의 이미지를 실행하여 빠르게 복구할 수 있다.
- 버전 관리 최적화: 변경 사항을 코드 및 이미지 단위로 관리할 수 있어, 배포 이력을 명확하게 추적할 수 있다.
불변성으로 인한 데이터 문제 및 해결책
컨테이너는 기본적으로 휘발성(volatile) 구조를 가지므로, 삭제될 경우 내부 데이터도 함께 사라진다.
이는 컨테이너의 경량성과 이식성을 극대화하기 위한 설계이지만, 데이터가 유지되어야 하는 경우 추가적인 관리가 필요하다.
이를 해결하기 위해 다음과 같은 방법을 사용할 수 있다.
- Docker Volume 사용: 컨테이너와 독립적인 저장소를 제공하여, 컨테이너가 삭제되더라도 데이터를 유지할 수 있다.
- Bind Mount 사용: 호스트 시스템의 특정 디렉터리를 컨테이너 내부에 연결하여, 데이터를 영구적으로 저장하고 접근할 수 있도록 한다.
이를 활용하면 컨테이너의 불변성을 유지하면서도 지속적인 데이터 저장 및 관리가 가능하다.
Docker Volume이란?
Docker Volume은 컨테이너가 삭제되더라도 데이터를 영구적으로 저장할 수 있도록 지원하는 저장소 관리 기능이다.
컨테이너 내부의 파일 시스템은 기본적으로 휘발성(volatile)이므로, 중요한 데이터를 유지하려면 볼륨을 사용해야 한다.
Docker Volume의 주요 특징
- 컨테이너와 독립적 → 컨테이너가 삭제되더라도 볼륨에 저장된 데이터는 유지된다.
- 다중 컨테이너 공유 가능 → 여러 컨테이너가 동일한 볼륨을 마운트하여 데이터를 공유할 수 있다.
- Docker가 직접 관리 → 호스트 디렉터리 경로를 신경 쓰지 않아도 되며, 보안성과 성능이 우수하다.
Bind Mount란?
바인드 마운트를 사용하면 호스트의 특정 디렉터리를 컨테이너 내부의 디렉터리에 연결할 수 있다.
이 방식은 호스트와 컨테이너가 동일한 디렉터리를 공유하며, 한쪽에서 파일을 수정하면 다른 쪽에도 즉시 반영된다. (공유 저장소 같은 느낌이다)
Docker Volume과 Bind Mount의 차이점
바인드 마운트는 호스트 디렉터리의 절대 경로를 직접 사용해야 하지만,
Docker 볼륨은 Docker가 자동으로 생성하고 관리하는 저장소를 사용한다.
-v 옵션 뒤에 절대경로(/home/user/data)가 오면 바인드 마운트 방식
-v 옵션 뒤에 볼륨명(my_volume)이 오면 Docker 볼륨 방식이다.
# 바인드 마운트
docker run -d -v /home/user/data:/app/data --name my_container nginx
# Docker Volume 사용
docker run -d -v my_volume:/app/data --name my_container nginx
- Volume
- 호스트 디렉터리 → Docker가 관리하는 볼륨 경로(예:/var/lib/docker/volumes/my_volume/_data)
- 컨테이너 디렉터리 → /app/data
- Bind Mount
- 호스트 디렉터리 → /home/user/data
- 컨테이너 디렉터리 → /app/data
- 특징: /app/data에서 변경한 내용이 호스트의 /home/user/data에도 즉시 반영됨.
예시
아래는 docker-compose.yml 파일의 일부이다.
services:
mysql:
image: mysql:8.0
container_name: chunsun-db
restart: always
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_USER: chunsun
MYSQL_PASSWORD: chunsun
ports:
- "3306:3306"
volumes:
- ./db/init-mysql:/docker-entrypoint-initdb.d
- mysql_data:/var/lib/mysql
volume 설정
1. 초기화 스크립트용 바인드 마운트
volumes:
- ./db/init-mysql:/docker-entrypoint-initdb.d
- 호스트 디렉터리: ./db/init-mysql
- 컨테이너 내부 디렉터리: /docker-entrypoint-initdb.d
- 역할:
- 호스트의 ./db/init-mysql 디렉터리를 컨테이너의 /docker-entrypoint-initdb.d에 연결한다.
- MySQL 공식 이미지에서는 컨테이너가 실행될 때, /docker-entrypoint-initdb.d 내부의 .sql 또는 .sh 파일을 자동 실행하는데 이를 호스트의 ./db/init-mysql 디렉터리로 바인드 마운트 한다.
- 따라서 호스트의 ./db/init-mysql에 있는 초기 SQL 스크립트(schema.sql, data.sql 등)가 컨테이너 실행 시 자동으로 적용된다.
2. 데이터 저장용 Docker 볼륨
volumes:
- mysql_data:/var/lib/mysql
- 볼륨 이름: mysql_data
- 컨테이너 내부 디렉터리: /var/lib/mysql
- 역할:
- MySQL 컨테이너는 기본적으로 데이터베이스 데이터를 /var/lib/mysql에 저장합니다.
- 이 설정을 통해 Docker가 관리하는 볼륨(mysql_data)을 사용하여 데이터를 저장하므로, 컨테이너가 삭제되더라도 데이터가 유지됩니다.
- 초기화 스크립트
- 호스트의 ./db/init-mysql을 컨테이너의 /docker-entrypoint-initdb.d와 연결하여,
컨테이너 시작 시 SQL 스크립트가 자동 실행되도록 설정합니다.
- 호스트의 ./db/init-mysql을 컨테이너의 /docker-entrypoint-initdb.d와 연결하여,
- 데이터 저장
- mysql_data라는 Docker 볼륨을 생성하여 컨테이너의 /var/lib/mysql 데이터를 저장합니다.
- 이로 인해 컨테이너가 삭제되더라도 MySQL 데이터가 유지됩니다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] DinD(Docker in Docker) 와 DooD(Docker out of Docker) (2) | 2025.02.02 |
---|---|
[Docker] docker compose - redis 연결 불가 오류 (0) | 2024.02.27 |
[Docker] docker compose로 Spring + MySQL 배포 환경 만들기 (0) | 2024.02.22 |
[Docker] 도커 개념, 기본 명령어 정리 (0) | 2024.02.19 |
댓글