연구실 서버에서 사용 할 데이터베이스를 docker를 이용하여 구축하였다. 연구실 서버가 외부에서도 사용가능 하니 로컬 데이터베이스가 아닌 서버 데이터베이스에 정보를 저장할 수 있도록 하기 위함이다.
웹 프레임워크와 연동하여야 해서 조금 복잡하였다. 만드려는 컨테이너 구조는 아래의 그림과 같다.





데이터 베이스 컨테이너와 웹서버 컨테이너가 연결되어 있는 구조이다. docker-compose는 사용하지 않고 웹서버 컨테이너 생성시 link 기능으로 연결해주었다.

1. Mariadb 도커 컨테이너 만들기

데이터베이스 컨테이너를 생성 시 mariadb 이미지를 사용하였다.일단 아래의 명령어를 통해 docker hub에서 mariadb 이미지를 다운로드 받는다. 아래의 명령어는 태그명을 latest를 가지는 mariadb 이미지를 다운로드 받는 명령어이다.

$ docker pull mariadb:latest



다운로드 받은 이미지를 이용하여 데이터베이스 컨테이너를 생성(docker run)한다. 컨테이너가 삭제될 때 데이터가 날아가지 않도록 꼭 호스트의 데이터 볼륨과 연동해주어야 한다. 컨테이너를 생성하는 명령어는 다음과 같다.

옵션 기능
–name 컨테이너 이름
-v 데이터 볼륨 맵핑(경로)
-p 포트 맵핑(호스트포트:서비스포트)
-e MYSQL_ROOT_PASSWORD MYSQL ROOT 패스워드 설정
-d 사용하려는 이미지(이미지이름:태그명)


$ docker run --name mariadb \

-v /my/own/datadir:/home/ailab/DB \

-e MYSQL_ROOT_PASSWORD='0000' \

-d mariadb:latest



mariadb 컨테이너 내부로 접속하여 데이터베이스가 잘 구동 되는지 확인한다. 컨테이너 내부로 접속하여 mysql을 실행하는 명령어는 다음과 같다.

$ docker exec -it mariadb /bin/bash   // 도커 컨테이너 내부 접속
$ mysql -p패스워드입력                // mysql 접속(유저 생성 안했을 시 root로 접속)



추가적으로 mysql을 커맨드 라인으로 조작하는 명령어는 다음과 같다.

$ show database;                    // 데이터베이스 보기
$ use database이름;                 // 데이터베이스 선택
$ show tabels;                      // 데이터베이스 내부 테이블 보기



2. Python 컨테이너 내부에서 django 설치

Django 이미지를 따로 사용하지 않고 기존에 사용하고 있던 Python/Tensorflow 개발용 컨테이너에 django를 설치하여 개발용 웹서버로 만들었다. 기존에 사용하던 포트 이외 Django용 포트만 연결하여 주면 된다. 이 컨테이너에 데이터베이스 컨테이너를 연결해야하므로 link 명령어를 이용하여 데이터베이스를 연동하였다. 먼저 텐서플로우 이미지를 이용하여 컨테이너를 생성하는 명령어는 아래와 같다.

  • 텐서플로우 이미지 사용(주피터 노트북, 텐서플로우, 파이썬) / 8888 : 주피터 노트북 포트 , 8000 : 장고 포트, 3306 : 마리아 데이터베이스 포트)


옵션 기능
NV_GPU GPU 번호 지정
–name 컨테이너 이름
–link 연결할 컨테이너 이름(여기서는 mariadb 컨테이너)
-v 데이터 볼륨 맵핑(경로)
-p 포트 맵핑(호스트포트:서비스포트)
-e PASSWORD host url로 접속시 패스워드 설정
-d 사용하려는 이미지(이미지이름:태그명)



$ NV_GPU=1 nvidia-docker run -it \

--name crawler-journal \

--link mariadb \

-v /home/ailab/docker/crawler-journal:/notebooks \

-p 8894:8888 -p 81:8000 -p 6012:3306  \

-e PASSWORD="" \

-d crawler-journal:08.08



방금 생성한 도커 컨테이너 내부로 접속하여 장고를 설치하는 명령어는 다음과 같다.

$ docker exec -it crawler-journal /bin/bash   // 도커 컨테이너 내부 접속
$ pip install django                          // 장고 설치



3. mariadb 컨테이너 연결 확인

현재의 컨테이너(웹 서버용)와 데이터베이스 컨테이너가 잘 연결(link) 되었는지 확인하기 위해서 몇가지 추가 작업이 필요하다. 먼저 웹 서버 컨테이너에서 mysql 서버에 접속하기 위해서는 apt-get으로 mysqlclient 패키지를 설치해준다.

$ apt-get update
$ apt-get install mysqlclient



그다음 아래의 명령어로 mysql 서버에 접속한다. 이때 host는 mariadb(데이터베이스 컨테이너 이름)이고 계정은 따로 만들지 않았으니 root로 접속하고 패스워드(0000)를 입력해준다.

$ mysql -h mariadb -u root -p0000

데이터 베이스에 접속이 되면 컨테이너간 통신이 되는 것이다. 원래 호스트 주소 입력란에 127.0.0.1 같은 ip주소를 입력해야 하지만 docker 컨테이너의 ip는 도커가 할당해주는 가상 ip주소 이기 때문에 ip 주소가 변하게 된다.(고정 ip 주소가 아니다.) 그렇기 때문에 link 기능을 이용하여 도커 컨테이너 내부에서 알아서 호스트 주소를 받을 수 있게 하는것이 link 기능이라고 한다. 따라서 mysql -h 입력란에 컨테이너 이름을 입력하여도 연결이 가능한 것이다.

이렇게 해서 mariadb 컨테이너와 django/python 컨테이너가 연결이 되었다!


reference
  • https://www.fun25.co.kr/blog/python-install-mysqlclient/
  • https://wayhome25.github.io/mysql/2017/03/16/mysql-02-mysql-client/
  • http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter06/02