| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- java
- 혼공챌린지
- 인프런
- CS
- 티스토리챌린지
- 오블완
- 프로그래머스
- 기술면접
- doitandroid
- MySQL
- Android
- 정보처리기사
- 스터디
- 안드로이드
- select
- 혼공파
- Til
- SQL
- Kotlin
- 자바
- 안드로이드스튜디오
- 카카오코테
- 자료구조
- 알고리즘
- 코테
- 정처기
- 혼공단
- groupby
- join
- 코틀린
- Today
- Total
Welcome! Everything is fine.
[Docker] Docker Volume 개념 및 사용법 본문
인프런 <비전공자도 이해할 수 있는 Docker 입문/실전> 강의를 토대로 정리한 내용입니다.
🐋 도커볼륨(Docker Volume)
- 도커볼륨(Docker Volume) : 도커 컨테이너에서 데이터를 영속적으로 저장하기 위한 방법. 호스트 자체의 저장공간을 공유해 사용하는 형태.
- 특정 프로그램을 컨테이너로 띄우고 나서 기능이 추가되면 새로운 이미지를 만들어 컨테이너를 실행시켜야 한다. 이 때 새로운 컨테이너를 통째로 갈아끼우는 방식으로 교체하는데, 그렇게 하면 기존 컨테이너 내부의 데이터도 같이 삭제된다. 따라서 볼륨이라는 개념을 사용해 삭제되면 안되는 데이터를 저장할 수 있다.
도커볼륨(Docker Volume) 사용하기
볼륨을 사용할 때는 -v를 입력하고 호스트와 컨테이너의 절대 경로를 다음과 같이 입력해야 한다.
$ docker run -v [호스트의 디렉토리 절대경로]:[컨테이너의 디렉토리 절대경로] [이미지명]:[태그명]
- -v : 호스트의 경로(1번)를 빌려서 2번 경로와 공유해서 쓰겠다는 의미.
- [호스트의 디렉토리 절대경로] 에 디렉토리가 이미 존재할 경우, 호스트의 디렉터리가 컨테이너의 디렉터리를 덮어씌운다.
- [호스트의 디렉토리 절대경로] 에 디렉토리가 존재하지 않을 경우, 호스트의 디렉터리 절대 경로에 디렉터리를 새로 만들고 컨테이너의 디렉터리에 있는 파일들을 호스트의 디렉터리로 복사해온다.
이것만 봐서는 어떻게 써야할지 막막한데, Docker로 MySQL를 실행시키는 실습을 통해 볼륨을 사용하는 방법을 자세히 알아보자.
패스워드 옵션과 함께 MySQL 실행하기
먼저 mysql을 실행시켰는데, docker ps로 보니 아무것도 떠있지 않다. docker ps -a로 확인해보니 중지된 mysql이 있고, 로그를 살펴보니 패스워드 옵션이 정의되지 않아 실행되지 못한 것이었다. 패스워드 옵션은 아래와 같이 알려주기도 하지만 DockerHub에서 찾을 수 있다.

다음과 같이 -e 옵션을 추가한 뒤 패스워드 옵션을 주고 다시 실행했다.
$ docker run -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306 mysql
다시 docker ps로 확인해보니 정상적으로 실행된 것을 알 수 있다.

컨테이너 안으로 들어가 직접 확인해보니 설정했던 비밀번호인 password가 잘 들어있는 것을 확인할 수 있다.

MySQL 컨테이너로 들어가 데이터베이스 만들기
이제 mysql 컨테이너에서 데이터베이스를 만들고, 컨테이너를 삭제했다가 다시 실행했을 때 해당 데이터베이스가 남아있는지 살펴볼 것이다. 여기서 볼륨이 필요한 이유를 알 수 있다.
컨테이너로 들어가서 mysql -u root -p 명령어로 mysql 내부로 들어간다. 처음 컨테이너를 만들 때 설정한 패스워드를 치고 들어가면 된다.

이렇게 mydb라는 새로운 데이터베이스를 만들고 컨테이너를 삭제 후 다시 만들었다. 그리고나서 다시 mysql로 들어가 확인해보니 mydb라는 데이터베이스가 사라졌다. 이런 상황을 방지하기 위해 볼륨을 사용해 컨테이너를 띄울 수 있다.

# 컨테이너 종료
$ docker stop [MySQL 컨테이너 ID]
$ docker rm [MySQL 컨테이너 ID]
# 컨테이너 생성
$ docker run -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 -d mysql
$ docker exec -it [MySQL 컨테이너 ID] bash
$ mysql -u root -p
mysql> show databases; # 아까 생성한 데이터베이스가 없어진 걸 확인할 수 있다.
볼륨을 활용해 MySQL 띄우기
위에서 본 도커 볼륨을 사용하는 방법을 다시 보자.
$ docker run -v [호스트의 디렉토리 절대경로]:[컨테이너의 디렉토리 절대경로] [이미지명]:[태그명]
실습에서는 다음과 같이 작성했다. docker-mysql 폴더는 미리 만들어두었다. 그리고 pwd 명령어를 통해 출력된 경로를 [호스트의 디렉토리 절대경로]로 둔다.
$ docker run -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 -v /home/won/docker-mysql/data:/var/lib/mysql -d mysql
참고로 컨테이너의 디렉토리 절대경로는 DockerHub에서 MySQL을 검색한 후 나오는 공식 문서를 통해 알 수 있다.

처음 데이터베이스를 만들었을 때와 마찬가지로, 컨테이너를 실행시킨 후 컨테이너 안의 mysql로 들어가 mydb 라는 데이터베이스를 만들어준다.

그리고 다시 컨테이너를 삭제 후, 다시 컨테이너를 생성해보면 mydb가 남아있는 것을 볼 수 있다. 볼륨을 사용하지 않았을 때는 사라졌었지만, 볼륨을 사용하니 삭제되지 않고 그대로 존재한다.

🤔 MYSQL_ROOT_PASSWORD를 바꿔서 명령어를 실행하면?
최초로 MySQL 띄울 때 설정한 데이터베이스 비밀번호가 호스트의 저장공간에 저장되기 때문에 컨테이너를 새로 띄워서 값을 바꿨다고 해도 기존의 값이 있어서 바뀌지 않는다. 따라서 비밀번호를 바꾸고 싶다면 MySQL 자체에서 비밀번호를 바꾸는 명령어를 날리거나 처음 저장한 MySQL 데이터 (실습에서는 data 자체)를 지워야 한다.
'Docker' 카테고리의 다른 글
| [Docker] Docker Compose로 여러 컨테이너 띄우기 (0) | 2025.10.08 |
|---|---|
| [Docker] Dockerfile 개념 및 사용법 (0) | 2025.09.05 |
| [Docker] 도커 주요 명령어 정리 (0) | 2025.08.18 |