Docker를 이용한 외부 접속용 MariaDB 만들기 DEV / DOCKER
2019-07-27 posted by sang12
Docker Compose를 이용하여 외부에서 접근이 가능한 MariaDB를 만들어 보겠습니다. ( 저의 개인 PC에 DB를 만들고 블로그를 옮기기 위한 과정.. ). 참고로 CentOs7환경 입니다 ^^.
저는 리눅스 홈 다이렉토리 아래에 아래와 같이 폴더를 설정 하였습니다.
/home/sang12/blog/db_volumes
-> mariadb에서 외부 저장소를 설정하여 도커를 삭제해도 데이터가 보전하기 위함. 그리고 설정파일을 보관.
docker-compose.yml
-> maria db 도커 컨테이너를 생성하기 위한 compose 파일
이제 가장 중요한 docker-compose.yml 파일을 보겠습니다.
version: '3.7'
services:
mariadb:
image: mariadb:10.4.6
restart: always
environment:
- MYSQL_ROOT_PASSWORD=test
volumes:
- ./db_volumes:/var/lib/mysql
ports:
- '3306:3306'
version은 .yml의 문법 버전을 의미하고 image는 mariadb 10.4.6버전을 사용하겠다는 것을 의미합니다. restart:always는 재시작 하였을 경우 항상 시작 하겠다는 말입니다. 그리고 환경(environment)에서는 루트의 암호를 설정할 수 있습니다. 그 외에도 추가로 계정을 생성하거나 할 수 있습니다. volumes은 mariadb에서 데이터와 설정파일을 외부 host리눅스의 ./db_volumes폴더 아래 위치시키겠다는 말입니다. 그래야 도커가 삭제되거나해도 데이터가 항상 유지 될 수 있습니다. 마지막으로 ports는 3306내부 포트를 사용하고 위부로도 3306 포트를 사용 하겠다는 말입니다. 저는 위와같이 간단히 테스트하기위해 암호를 test라고 명시했는데, 환경변수를 이용하면 github나 svn등 외부에 노출될때도 조금 더 안전하게 디비정보나 보안이 필요한 것들을 지킬 수 있습니다.
그럼 실제로 dokcer compose에 명시되어 있는데로 도커 컨테이너를 올려 봅시다.
$ docker-compose up -d
$ docker-compose up -d 명령어를 이용하여 docker compose에 설정된 mariadb 이미지를 컨테이너에 올릴 수 있습니다.
$ docker ps
잘 올라 갔나요~? 어디한번 docker ps명령어를 이용하여 확인해 봅시다 :)
e3db6b44ec11이란 컨테이너 아이디로 잘 올라가 있는게 보이네요~. 저희가 설정한되로 이미지도 10.4.6버전으로 올라갔고 내부 3306포트에서 외부 3306포트로 대기 하고 있군요~^^.
자, 여기까지 Docker를 이용해서 MariaDB를 컨테이너에 올렸습니다. 하지만 정말 MariaDB가 제대로 올라갔는지 느껴 지시나요? 저는 사실 잘 안느껴졌습니다. 한번 제대로 느껴보기 위해 해당 container에 직접 접근해봅시다.
$ docker exec -it e3db6b44ec11 bash
$ docker exec -it {docker container id} bash 명령어를 활용하면 도커 컨테이너 쉘에 직접 접속 할 수 있습니다. -it는 키보드 입력이나 외부 하드웨어를 쓰기위한 명령어..?
와우 위 명령어로 방금 만드신 컨테이너 쉘에 접속해보셨나요? 또다른 리눅스가 존재하고 있습니다. 자연스레 손에 익어있는 명령어 ls로 조심스레 조회를 해봅니다. 전 이때 이론만으로 누군가 설명해논 글을 보며 이해한 도커의 존재가 뭔지 정확히 알 수 있었습니다. 리눅스 커널을 사용해서 가상의 이미지화된 리눅스를 올리는 것이죠..! 그 리눅스위에는 mariaDB가 올라갈 수도 있고 tomcat과 같은 웹서버 와스들도 올라 갈 수 있겠구나..!
아... 감상을 너무 오래했네요. 이제 mariadb에 접속해 봅시다. 이제 저희가 아는 접속방법 그대로 이전 리눅스에서 했던 것 그대로 사용하면 됩니다.
$ mysql -u root -p
$ mysql -u root -p 명령어를 사용하여 docker-compose.yml에서 설정했던 암호로 접속을 해봅시다!
와우.. 감동! ㅎㅎ. 아..! 기억나시나요? 저희가 외부볼륨(저장소)를 설정했던 것을요. 그럼 실제로 도커 이미지가 삭제되도 데이터는 영구적으로 유지되는지 테스트 해볼까요~? 위
create database test;
use test;
create table test(
test_col varchar(2)
);
create database로 데이터 베이스를 생성하고 해당 디비에 접속해서 test테이블을 하나 만들었습니다. 자 그럼 도커 컨테이너를 삭제하고 다시 만들어도 해당 데이터가 계속 존재하는지 확인해봅시다! mariaDB 명령창에서 exit를 사용해서 빠져나옵니다. 그리고 한번더 exit를 사용하여 도커 컨테이너 쉘에서 빠져 나오도록 하겠습니다.
그럼 이제 뭘 할지 다 예상 되시죠?
$ docker ps
$ docker stop {docker_id}
$ docker rm {docker_id}
현재 실행중인 도커 컨테이너를 docker stop, docker rm 명령어를 이용하여 말끔하게 삭제해줍시다!
깔끔하게 삭제된 모습을 볼 수 있네요.
그럼 다시, 저희가 만들어논 docker-compose.yml을 이용하여 컨테이너를 올리겠습니다. 이제 다 올릴줄 아시죠~?
와우..보이시나요? 위처럼 컨테이너를 삭제하고 다시 올렸는데도 데이터가 남아있는 것을 볼 수 있습니다. 디비 뿐만 아니라 이미지나 계속적으로 쌓여야 할 것들은 외부저장소를 사용하면 매우 편리하겠군요..
자, 그럼 이제는 외부에서 도커 컨테이너(마리아 DB)로 접속해 보겠습니다. 처음에 DB 포트를 3306으로 지정 했습니다. 일반적으로 내부 네트워크에서 접근할때는 127.0.0.1:3306 의 형식으로 접근 할 수 있습니다. 외부에서 접근할때는 어떻게 할까요? 똑같습니다 다만 IP주소가 바껴지는데요. 저는 IPTIME의 DDNS서비스를 사용하여 sang12.iptime.org란 도메인으로 저의 내부 서버에 접근 할 수 있었습니다. 참고로 일반적인 리눅스환경에서 mariadb를 설치하면 내부에서 외부접속을 허용해주는 설정들이 필요합니다. 하지만 docker에서 받은 mariadb 이미지는 이미 설정이 되어있어서인지 설정없이 바로 접속 할 수 있었습니다. 참고해주세요~
저는 개인적으로 잘 사용하고있는 HeidiSQL을 사용하여 접속해보겠습니다.
호스트명은 자신의 ip주소를 적어주시면 됩니다. 내부에서 사용하시고 있으시면 127.0.0.1을 적어주시면 됩니다! 그럼 아래와 같이 저희가 만들었던 데이터베이스와 Table을 조회 할 수 있습니다.
Docker Compose를 이용하여 MariaDB를 생성, 삭제해보고 외부에서 접근까지 해보았습니다. Docker 공부하는게 재미있네요. 블로그를 개인서버로 옮기면서 배우는 것들을 하나하나 포스팅 하도록 하겠습니다 :)