상세 컨텐츠

본문 제목

Docker Volume

docker&aws distribute

by 개복신 개발자 2025. 5. 21. 18:28

본문

반응형

Docker Volume(도커 볼륨)

✅ 컨테이너가 가진 문제점

기존 컨테이너를 수정해서 적용하는 것보다 그냥 새로운 컨테이너로 갈아끼우는 것이 더 효율적이라고 개발자들은 생각했다. 그러나 이 과정에서 생기는 문제점이 기존의 데이터가 날아간다는 것이다.

만약 이 컨테이너가 MySQL을 실행시키는 컨테이너였다면 MySQL에

저장된 데이터도 같이 삭제 돼버린다. 

그래서 컨테이너 내부에 저장된 데이터가 삭제 안되도록 data를 영속적으로 저장하기 위해 생긴 것이 Docker Volume이다.

 

✅ Docker Volume(도커 볼륨)이란?

**도커의 볼륨(Volume)**이란 도커 컨테이너에서 데이터를 영속적으로 저장하기 위한 방법이다. 볼륨(Volume)은 컨테이너 자체의 저장 공간을 사용하지 않고, 호스트 자체의 저장 공간을 공유해서 사용하는 형태이다.

 

 

 

✅ 볼륨(Volume)을 사용하는 명령어

$ docker run **-v [호스트의 디렉토리 절대경로]:[컨테이너의 디렉토리 절대경로]** [이미지명]:[태그명]

[호스트의 디렉토리 절대 경로]에 디렉토리가 이미 존재할 경우, 호스트의 디렉터리가 컨테이너의 디렉터리를 덮어씌운다.

[호스트의 디렉토리 절대 경로]에 디렉토리가 존재하지 않을 경우, 호스트의 디렉터리 절대 경로에 디렉터리를 새로 만들고 컨테이너의 디렉터리에 있는 파일들을 호스트의 디렉터리로 복사해온다.

🔹 경우 1: 

호스트에만 데이터 있고, 컨테이너에는 없음

 호스트 데이터가 컨테이너로 복사됨

컨테이너 안에 있던 초기 데이터는 무시됨

즉, 마운트 지점의 컨테이너 디렉토리는 무시되고, 호스트 디렉토리 내용이 그대로 적용됨

 

 

🔹 경우 2: 

호스트 디렉토리가 비어 있고, 컨테이너 안엔 기본 데이터가 있음

→ 컨테이너 데이터는 보존되지 않고 무시됨

즉, 마운트되는 순간 호스트의 빈 디렉토리가 “덮어씌워짐”

 


[실습] Docker로 MySQL 실행시켜보기 - 1

✅ Docker로 MySQL 실행시켜보기

  1. MySQL 이미지를 바탕으로 컨테이너 실행시키기
    $ docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -d mysql
    
    • 참고) docker pull 과정은 생략해도 상관없다. 왜냐하면 docker run mysql로 실행시켰을 때, 로컬에 이미지가 없으면 Dockerhub으로부터 MySQL 이미지를 알아서 다운받아서 실행시키기 때문이다.
    • -e MYSQL_ROOT_PASSWORD=password123 : -e 옵션은 컨테이너의 환경 변수를 설정하는 옵션이다.
    • Dockerhub의 MySQL 공식 문서를 보면 환경 변수로 MYSQL_ROOT_PASSWORD를 정해주어야만 정상적으로 컨테이너가 실행된다고 적혀져있따.
    • 아래의 명령어로 컨테이너로 들어가서 환경 변수를 직접 눈으로 확인해보자.
    • $ docker exec -it [MySQL 컨테이너 ID] bash $ echo $MYSQL_ROOT_PASSWORD # MYSQL_ROOT_PASSWORD라는 환경변수 값 출력 $ export # 설정되어 있는 모든 환경변수 출력
    • mysql - Official Image | Docker Hub
 

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, oracle⁠8

hub.docker.com

2. 컨테이너가 잘 실행되고 있는 지 체크

$ docker ps

 

3. 컨테이너 실행시킬 때 에러 없이 잘 실행됐는 지 로그 체크

$ docker logs [컨테이너 ID 또는 컨테이너명]

 

4. DBeaver에도 연결시켜보기

✅ 그림으로 이해하기

[실습] Docker로 MySQL 실행시켜보기 - 2

✅ MySQL 컨테이너에 직접 접속해보기

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 컨테이너를 띄우는 방식에 대해 알아볼 것이다.

 

[실습] Docker로 MySQL 실행시켜보기 - 3

✅ 볼륨(Volume)을 활용해 MySQL 컨테이너 띄우기

1. MySQL 컨테이너 띄우기

Docker Volume(도커 볼륨)

 

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; # 아까 생성한 데이터베이스가 그대로 존재하는 걸 확인할 수 있다.

 그림으로 이해하기

✅ MySQL 컨테이너 삭제하고 다시 띄워보기

# 컨테이너 종료
$ 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&aws distribute' 카테고리의 다른 글

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

관련글 더보기

댓글 영역