[MariaDB] Docker Container에 올렸던 DB서버 로컬로 빼내기
현재 놀토(Nolto) 서비스에서는 데이터베이스를 EC2 인스턴스의 Docker Container에 MariaDB를 띄워서 사용하고 있습니다.
하지만 Docker Container에 데이터베이스를 올리는것은 좋은 행위가 아니라고 합니다.
관련 자료들
- https://vsupalov.com/database-in-docker/
- https://patrobinson.github.io/2016/11/07/thou-shalt-not-run-a-database-inside-a-container/
먼저 데이터베이스를 Docker에 올려서 얻을 수 있는 장점은 어떤것이 있을까요?
- 손쉽게 버전을 맞춰줄 수 있습니다.
- 환경 설정을 맞춰줄 수 있습니다.
- 음..
그럼 단점은 어떤것이 있을까요?
- 데이터베이스의 데이터는 매우매우매우 중요한 자원입니다. Docker에 문제가 생겨서 컨테이너가 사라져버린다면 데이터도 함께 사라지는것을 의미합니다.
- Docker의 볼륨 마운팅으로 위의 단점은 극복할 수 있지만 볼륨 마운팅 기술은 불완전하여 어떤 문제가 발생할지 알 수 없습니다. 문제가 생길 여지가 있는곳에 매우매우매우 중요한 자원인 데이터베이스의 데이터를 저장하는것은 위험합니다.
- 즉 Docker 컨테이너에 데이터베이스를 띄우는것은 관리 포인트를 증가시키는 것이고 관리하지 않아도 될 리스크가 하나 생기는 것입니다.
이제 도커에 있는 mariaDB를 도커의 바깥인 인스턴스 자체에 설치를 할것입니다.
그러기 위해서는 먼저 도커 내부에 있는 데이터베이스의 데이터를 백업해둬야 합니다.
아래의 dump파일 생성 명령어를 docker container 내부의 CLI 창에서 실행해주세요.
(다양한 명령어 옵션은 MariaDB 사이트의 mysqldump 문서를 참고해주세요!)
mysqldump -u[username] -p[password] [Option] > [dump파일명].sql
백업 파일이 완성됐습니다.
이제 도커 컨테이너 내부에 있는 dump파일을 인스턴스 내부로 가져와야합니다.
아래 명령어로 가져올 수 있습니다.
docker cp [컨테이너 이름]:[파일 경로] [호스트 경로]
이제 dump파일이 준비됐습니다.
이제 MariaDB만 설치하면 간단하게 끝이날거라 생각했지만 버전 문제가 발생했습니다.
우선 EC2 인스턴스는 OS로 Ubuntu 18.04 를 사용하고 있는데 apt-get을 활용해서 mariaDB 설치시 10.1.xx 버전을 설치하고 있었습니다.
하지만 Docker 컨테이너 내부의 MariaDB는 lastest 버전을 설치했는데 이는 10.5.xx 버전이었습니다.
10.5.xx 버전의 dump 파일로 10.1.xx버전에 데이터를 복구하려고 했더니 인덱스 키값이 너무 길다는 에러와 함께 복구가 실행되지 않았습니다.
그래서 apt-get으로 mariaDB 10.5버전을 설치합니다.
설치는 이곳의 글을 참고했습니다.
mariaDB 10.5 버전이 있는 저장소를 apt에 추가하는 방법입니다.
(18.04 버전은 반드시 add-apt-repository 저장소를 추가할 때 focal 대신 bionic 을 사용하셔야 합니다.
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://mirror.lstn.net/mariadb/repo/10.5/ubuntu bionic main'
sudo apt update
sudo apt install mariadb-server
해당 작업을 하면서 apt의 저장소에 대한 오류가 생겼었는데 글의 주제와 맞지않아 다른 글에서 다루겠습니다.
이제 설치까지 마쳤다면 아래의 명령어를 실행해서 데이터를 복구합니다.
mysql -u[사용자] -p[비밀번호] [Option] < [dump 파일이름].sql
이제 모든 준비가 됐습니다! 애플리케이션과 연결만 잘 되면 해피엔딩입니다.
하지만.. Docker DB로 애플리케이션을 연결했을때는 잘 연결되던 것이 이번엔 Connection Fail을 뱉어냅니다.
문제는 mariaDB 설정에 있는 bind-address 입니다.
설치 후 아무런 설정을 하지않았다면 bind-address가 127.0.0.1 로 설정되어 있습니다.
즉, 외부에서 접근을 허용하지 않고있습니다.
이 설정을 바꿔줘야합니다.
설정파일은 우분투기준 /etc/mysql/mariadb.conf.d/50-server.conf 에 있습니다.
이 설정을 주석처리하면 0.0.0.0에 대한 IP를 허용합니다. 즉 전체를 허용하는 것입니다.
여기까지 설정했다면 연결까지 완료됐습니다!
혹시 Character-Encoding 문제가 있다면 이 글을 참고해보세요!