Mysql로 프로젝트를 만들다가 Docker를 다시시작하니까 Database가 사라졌음
컨테이너가 제거되거나 교체되면 지속가능한 위치(ex:Docker 볼륨 또는 Bind Mounts)에 저장되지 않은 모든 데이터가 손실됩니다.
Docker Voulmes VS Bind Mounts
Dokcer Voulmes
- 호스트에 구애받지 않음: Docker는 호스트 파일 시스템과 독립적으로 볼륨을 관리합니다. Docker 데몬은 저장 위치에 대한 세부 정보를 처리하며 Docker가 관리하는 호스트 파일 시스템의 일부(기본적으로 /var/lib/docker/volumes/)에 저장됩니다.
- 제어: 볼륨은 직접 파일 시스템 제어 측면에서 유연성이 떨어지지만 Docker CLI 명령과 잘 통합되며 다양한 Docker 환경에서 일관되게 작동합니다.
- 이식성: 볼륨은 호스트 파일 시스템의 구조에 의존하지 않기 때문에 다양한 시스템에서 더 쉽게 이식 가능합니다. 서로 다른 호스트 간에 컨테이너를 이동할 때 파일 경로를 조정할 필요 없이 볼륨도 쉽게 이동할 수 있습니다.
- 성능: 일반적으로 빠르지만 특히 고성능 시나리오에서는 볼륨이 기본 호스트 파일 시스템 성능보다 느릴 수 있습니다. 그러나 일반적으로 대부분의 응용 프로그램에 적합합니다.
- 사용 사례 예: 볼륨은 Docker 컨테이너 수명 주기 및 호스트 간 마이그레이션과 독립적으로 유지되어야 하는 프로덕션 데이터베이스 또는 로그 및 기타 애플리케이션 데이터를 저장하는 데 이상적입니다.
Bind Mounts
- 호스트 종속성: 바인드 마운트는 호스트 시스템의 특정 경로를 컨테이너 내부 경로에 직접 연결합니다. 이는 데이터가 호스트의 파일 시스템에 직접 존재하며 호스트에서 관리된다는 것을 의미합니다.
- 제어: 바인드 마운트는 호스트 파일 시스템에서 관리되므로 파일 시스템과 마운트된 파일 및 디렉터리에 대한 더 많은 제어를 제공합니다.
- 이식성: 바인드 마운트는 호스트의 특정 디렉터리 구조에 의존하기 때문에 이식성이 떨어집니다. Docker 컨테이너 설정을 다른 호스트로 이동할 때 호스트는 동일한 디렉터리 구조를 가져야 하며, 그렇지 않으면 그에 따라 바인드 탑재 경로를 조정해야 합니다.
- 성능: 바인딩 마운트는 볼륨으로 인해 발생할 수 있는 추가 추상화 계층의 오버헤드 없이 대용량 파일이나 다수의 파일에 빠르게 액세스해야 하는 시나리오에서 더 나은 성능을 제공할 수 있습니다.
- 사용 사례 예: 바인딩 마운트는 호스트 환경에서 코드를 편집하고 Docker 컨테이너 내부에서 실행되는 환경에 즉시 반영되는 변경 사항을 확인해야 하는 개발 환경에 자주 사용됩니다.
Docker Voulme 사용하기
볼륨은 Docker가 관리하는 호스트 파일 시스템의 일부(기본적으로 /var/lib/docker/volumes/)에 저장됩니다. 이는 컨테이너 수명주기와 사실상 독립적입니다. 즉, 다시 시작해도 데이터가 유지되고 컨테이너가 제거되더라도 데이터가 유지됩니다.
1. Docker Voulme 생성(아직 생성하지 않은 경우):
docker volume create [your-volume-name]
2. Voulme을 사용하여 Mysql 컨테이너 실행
docker run -d \
-p 3306:3306 \
--name my-mysql \
-e MYSQL_ROOT_PASSWORD=my-pw \
-v mysql-data:/var/lib/mysql \
mysql:tag
'my-pw'를 원하는 루트 비밀번호로 바꾸고 'mysql:tag'를 사용하려는 특정MySql 이미지 버전으로 바꾸세요.
이 명령은 Docker에게 MySQL이 기본적으로 데이터 파일을 저장하는 컨테이너 내부의 /var/lib/mysql 디렉터리에 mysql-data 볼륨을 마운트하도록 지시합니다.
Bind Mounts 사용하기
컨테이너의 데이터 디렉터리를 호스트 시스템의 디렉터리에 연결할 수 있습니다. 이 접근 방식은 컨테이너를 제거하고 다시 시작해도 데이터를 유지하지만 데이터를 호스트 파일 시스템에 더 직접적으로 연결하므로 이식성에 영향을 미칠 수 있습니다.
docker run -d \
-p 3306:3306 \
--name my-mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-v /my/own/datadir:/var/lib/mysql \
mysql:tag
'my/own/datadir'은 MySQL 데이터를 저장하려는 호스트 머신의 디렉토리 경로로 대체되어야 합니다.
Windows에서 경로 지정
C:\mysql\data와 같은 C 드라이브에 있는 디렉토리를 직접 사용한다고 가정하겠습니다. Docker 명령에서 경로는 이중 백슬래시 '\\'또는 단일 정방향 슬래시 '/'를 사용하여 형식을 지정해야 합니다.
이중 백슬래시 '\\' 사용
docker run -d \
-p 3306:3306 \
--name my-mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-v C:\\mysql\\data:/var/lib/mysql \
mysql:tag
단일 정방향 슬래시 '/'를 사용
docker run -d \
-p 3306:3306 \
--name my-mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-v C:/mysql/data:/var/lib/mysql \
mysql:tag
권한 및 Dokcer 설정 확인
- 권한: Docker 데몬에 C:\mysql\data 디렉터리에 액세스할 수 있는 권한이 있는지 확인하세요. 여기에는 보안 설정에 따라 권한을 조정하거나 Docker를 관리자로 실행하는 작업이 포함될 수 있습니다.
- Docker 파일 공유: Windows의 Docker Desktop의 경우 Docker 설정에서 C 드라이브를 공유할 수 있는지 확인하세요. Docker Desktop에서 설정 > 리소스 > 파일 공유로 이동하여 C 드라이브가 선택되어 있는지 확인하여 이를 조정할 수 있습니다.
'Docker' 카테고리의 다른 글
[Docker] MySQL 설치 (1) | 2024.04.27 |
---|---|
[Docker] WSL2사용해서 Docker 설치 (1) | 2024.04.27 |