기존 컨테이너를 수정해서 적용하는 것보다 그냥 새로운 컨테이너로 갈아끼우는 것이 더 효율적이라고 개발자들은 생각했다. 그러나 이 과정에서 생기는 문제점이 기존의 데이터가 날아간다는 것이다.
만약 이 컨테이너가 MySQL을 실행시키는 컨테이너였다면 MySQL에
저장된 데이터도 같이 삭제 돼버린다.
그래서 컨테이너 내부에 저장된 데이터가 삭제 안되도록 data를 영속적으로 저장하기 위해 생긴 것이 Docker Volume이다.
**도커의 볼륨(Volume)**이란 도커 컨테이너에서 데이터를 영속적으로 저장하기 위한 방법이다. 볼륨(Volume)은 컨테이너 자체의 저장 공간을 사용하지 않고, 호스트 자체의 저장 공간을 공유해서 사용하는 형태이다.

$ docker run **-v [호스트의 디렉토리 절대경로]:[컨테이너의 디렉토리 절대경로]** [이미지명]:[태그명]
[호스트의 디렉토리 절대 경로]에 디렉토리가 이미 존재할 경우, 호스트의 디렉터리가 컨테이너의 디렉터리를 덮어씌운다.


→ 호스트 데이터가 컨테이너로 복사됨
컨테이너 안에 있던 초기 데이터는 무시됨
즉, 마운트 지점의 컨테이너 디렉토리는 무시되고, 호스트 디렉토리 내용이 그대로 적용됨
→ 컨테이너 데이터는 보존되지 않고 무시됨
즉, 마운트되는 순간 호스트의 빈 디렉토리가 “덮어씌워짐”
$ docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -d mysql
mysql - Official Image | Docker Hub
Quick reference Supported tags and respective Dockerfile links 9.3.0, 9.3, 9, innovation, latest, 9.3.0-oraclelinux9, 9.3-oraclelinux9, 9-oraclelinux9, innovation-oraclelinux9, oraclelinux9, 9.3.0-oracle, 9.3-oracle, 9-oracle, innovation-oracle, oracle8
hub.docker.com
2. 컨테이너가 잘 실행되고 있는 지 체크
$ docker ps

3. 컨테이너 실행시킬 때 에러 없이 잘 실행됐는 지 로그 체크
$ docker logs [컨테이너 ID 또는 컨테이너명]
4. DBeaver에도 연결시켜보기


1. MySQL 컨테이너에 접속
$ docker exec -it [MySQL 컨테이너 ID] bash

2. 컨테이너에서 MySQL에 접근하기
$ mysql -u root -p

3. MySQL 접근에 성공했다면 데이터베이스 조회해보기
mysql> show databases;

4. 데이터베이스 만들기
mysql> create database mydb;
mysql> show databases;
5. 컨테이너 종료 후 다시 생성해보기
# 컨테이너 종료
$ docker stop [MySQL 컨테이너 ID]
$ docker rm [MySQL 컨테이너 ID]
# 컨테이너 생성
$ docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -d mysql
$ docker exec -it [MySQL 컨테이너 ID] bash
$ mysql -u root -p
mysql> show databases; # 아까 생성한 데이터베이스가 없어진 걸 확인할 수 있다.
👨🏻🏫 위 방식은 볼륨(Volume)을 활용하지 않고 MySQL 컨테이너를 띄웠다. 그래서 MySQL 컨테이너를 삭제함과 동시에 MySQL 내부에 저장되어 있던 데이터도 함께 삭제되어 없어졌다. 이를 방지하기 위해 볼륨(Volume)을 활용해 MySQL 컨테이너를 띄우는 방식에 대해 알아볼 것이다.
1. MySQL 컨테이너 띄우기
Docker Volume(도커 볼륨) | Notion
✅ 컨테이너가 가진 문제점
jscode.notion.site
$ cd /Users/jaeseong/Documents/Develop
$ mkdir docker-mysql # MySQL 데이터를 저장하고 싶은 폴더 만들기
# docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -v {호스트의 절대경로}/mysql_data:/var/lib/mysql-d mysql
$ docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -v /Users/jaeseong/Documents/Develop/docker-mysql/mysql_data:/var/lib/mysql -d mysql
-pwd 명령어로 볼륨으로 사용하고자 하는 경로를 확인한 뒤 입력해주자.
윈도우의 경우 아래와 같이 경로가 작성될 수 있다.
# 예시
$ docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -v **C:/Users/jaeseong/js-mysql**:/var/lib/mysql -d mysql
주의) mysql_data 디렉토리를 미리 만들어 놓으면 안 된다. 그래야 처음 이미지를 실행시킬 때 mysql 내부에 있는 /var/lib/mysql 파일들을 호스트 컴퓨터로 공유받을 수 있다. mysql_data 디렉토리를 미리 만들어놓을 경우, 기존 컨테이너의 /var/lib/mysql 파일들을 전부 삭제한 뒤에 mysql_data로 덮어씌워 버린다.
-DB에 관련된 데이터가 저장되는 곳이 /var/lib/mysql인지는 Dockerhub MySQL의 공식 문서에 나와있다.

2. MySQL 컨테이너에 접속해서 데이터베이스 만들기
$ docker exec -it [MySQL 컨테이너 ID] bash
$ mysql -u root -p
mysql> show databases;
mysql> create database mydb;
mysql> show databases;
3. 컨테이너 종료 후 다시 생성해보기
# 컨테이너 종료
$ docker stop [MySQL 컨테이너 ID]
$ docker rm [MySQL 컨테이너 ID]
# 컨테이너 생성
$ docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -v /Users/jaeseong/Documents/Develop/docker-mysql/mysql_data:/var/lib/mysql -d mysql
$ docker exec -it [MySQL 컨테이너 ID] bash
$ mysql -u root -p
mysql> show databases; # 아까 생성한 데이터베이스가 그대로 존재하는 걸 확인할 수 있다.
✅ 그림으로 이해하기

# 컨테이너 종료
$ docker stop [MySQL 컨테이너 ID]
$ docker rm [MySQL 컨테이너 ID]
# 비밀번호 바꿔서 컨테이너 생성
$ docker run -e MYSQL_ROOT_PASSWORD=**pwd1234** -p 3306:3306 -v /Users/jaeseong/Documents/Develop/docker-mysql/mysql_data:/var/lib/mysql -d mysql
$ docker exec -it [MySQL 컨테이너 ID] bash
$ mysql -u root -p # 접속이 안 됨...
분명 MYSQL_ROOT_PASSWORD 값을 바꿔서 새로 컨테이너를 띄웠는데 비밀번호는 바뀌지 않은걸까? 이 부분 때문에 많은 분들이 헤맨다.
그 이유는 Volume으로 설정해둔 폴더에 이미 비밀번호 정보가 저장되버렸기 때문이다.
| Docker CLI (1) | 2025.05.10 |
|---|---|
| Docker 기본 개념 (0) | 2025.05.10 |
| docker 주요 명령어 (0) | 2022.11.24 |
| 모던 서버 기술 관련 배경지식 (0) | 2022.11.22 |
| 2-모듈5 인프라 자동화 (0) | 2022.11.01 |
댓글 영역