쌓고 쌓다
MySQL 데이터 백업 및 가져오기/Docker MySQL 볼륨 마운트 본문
MySQL의 데이터를 백업해보고 그 데이터를 Docker MySQL에 가져와보자. 그리고
Docker 컨테이너를 통해 올린 DB 데이터를 Host에서 관리해보자.
먼저 Docker MySQL 볼륨을 마운트해보자.
즉, Docker 컨테이너에 올려진 DB의 데이터가 Host에서 관리되길 원하는것이다.
docker-compose.yml
version: '3'
services:
db:
image: mysql:8.0.33
container_name: spot-db
restart: always
ports:
- "3306:3306"
command:
- "--character-set-server=utf8mb4"
- "--collation-server=utf8mb4_unicode_ci"
environment:
MYSQL_ROOT_PASSWORD: 1234
TZ: Asia/Seoul
volumes:
- ./mysql/db:/var/lib/mysql
- ./mysql-init-files/:/docker-entrypoint-initdb.d
server:
image: [아이디]/[이미지명]:[버전]
container_name: spot-server
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/[DB명]
SPRING_DATASOURCE_USERNAME: "root"
SPRING_DATASOURCE_PASSWORD: "1234"
depends_on:
- db
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 10s
retries: 3
- volumes
- ./mysql/db:/var/lib/mysql : mysql의 파일들을 ./mysql/db로 마운트(연결)함.
- [HOST 경로]:[컨테이너경로]
- 즉, ./mysql/db는 docker-compose.yml 기준 경로이며
- /var/lib/mysql는 docker exec -it [컨테이너명] /bin/bash로 접속한 경로임.
- ./mysql-init-files/:/docker-entrypoint-initdb.d
- [docker-compose.yml 기준 경로]:/docker-entrypoint-initdb.d
- docker-compose.yml의 위치에 mysql-init-files 폴더에 있는 .sql을 모두 실행시켜 초기 데이터를 설정.
- ./mysql/db:/var/lib/mysql : mysql의 파일들을 ./mysql/db로 마운트(연결)함.
- SPRING_DATASOURCE_URL : 스프링부트 애플리케이션이 도커 컨테이너로 띄어진 DB와 통신하기 위해 작성
- depends_on : db 컨테이너가 먼저 실행된 후 server 컨테이너가 실행되도록 순서를 지정할 수 있음
- healthcheck : depends_on이 실행 순서만 보장해주지 완전한 상태까지 기다려주지 않기에 healthcheck로 체크.
depends_on과 healthcheck를 사용해도 자꾸 DB가 완전히 준비되기전에 서버가 켜져서 문제가 되어
docker compose db -> docker compose server 순서로 명령어로 컨테이너를 띄움...
이제 로컬의 DB 데이터를 Docker DB로 옮겨보자.
현재 컨테이너로 올라간 DB에는 ROW 값이 없다.
HOST의 3306 포트와 컨테이너의 3306 포트가 충돌이 나니깐
MySQL 컨테이너를 중지해주자.
docker compose stop db
Host의 MySQL을 접속하기위해 우분투 기준으로 아래의 명령어를 실행.
service mysql restart
아래의 명령어를 통해 DB를 지정하여 sql 파일로 생성하자.
mysqldump -u [계정명] -p [DB명] > [파일명].sql
명령어를 실행한 위치에 .sql 파일이 생긴다.
다시 Host MySQL을 중지시키고.
service mysql stop
MySQL 컨테이너 접속을 위해 다시 restart
docker compose restart db
spot-db 컨테이너에 접속하자.
docker exec -it spot-db /bin/bash
도커 컨테이너로 파일을 옮기려면 아래의 명령어를 치면된다.
docker cp [옮길 파일명] [container ID or Name]:[컨테이너 내 저장위치(경로)]
위의 명령어로 이전의 .sql 파일을 컨테이너로 복사해준다.
CREATE DATABASE [DB명]으로 DB를 생성해주고
아래의 명령어로 DB에 가져오면 된다.
mysqldump -u [계정명] -p [DB명] < [덤프 파일 경로]
그러나 도커 컨테이너에서 난 잘 안되어서 다음 명령어로 해결했다.
mysql -u root -p spot < data.sql
한글이 ???로 나오며 깨져있다..
잘 저장되어 있지만 깨져 보이는거 같다.
도커 컨테이너의 locale을 설정해줌으로써 해결할 수 있다.
현재 POSIX로 언어가 설정되어 있다.
locale -a로 사용 가능한 언어들을 볼 수 있다.
C.utf8이 있다면 아래의 명령어를 실행해주자.
export LC_ALL="C.UTF-8"
그러면 C.UTF-8로 설정이 된다.
MySQL 컨테이너에 데이터를 잘 가져왔으며,
HOST와 마운트하여 /mysql/db/ 에 mysql 파일들이 관리되고 있다.
'프로그래밍 > docker' 카테고리의 다른 글
docker-compose에 환경 변수 ${} 설정하는 방법 (0) | 2024.05.26 |
---|---|
도커로 스프링부트 로그 파일 마운트(볼륨) 하는 방법 (0) | 2024.05.26 |
Docker Container에서 Local의 DB 접근하는 방법 (0) | 2024.04.14 |