PROGRAMMING

docker上で立てたMySQLとpythonの接続方法【sequel Proの接続方法も解説】

こんにちは。もんしょー(@sima199407)です。

ある人
dockerを使ってmysqlを使いたい。できれば接続方法も知りたい!

そんな声があるかと思います。

今回は「docker+MySQL」で接続する方法について解説していこうかと思います。

使う言語はpythonで、OSはMacでやります。

[box05 title="今回のポイント"]
・dockerコンテナの使い方を学ぶ
・今回のメイン「mysql-connector」
・DBを可視化してみたい→sequel Proを使う
[/box05]

になります。

一つずつ解説していきます。

開発手順

開発環境は以下の通り

・Mac OS
・docker for Mac
・MySQL 5.7
・Python3.6
・sequel Pro

そしてディレクトリの構造はここちら
今回は「sample-mysql」ディレクトリというものを作成して開発していきましょう。

sample-dir
├── python
│   ├── Dockerfile
│   ├── docker-compose.yaml
│   └── src
│       └── sample.py
└── mysql
├── Dockerfile
├── docker-compose.yaml
└── my.cnf

まずは、dockerが入っていることが前提になります。
もし、まだ入ってない場合はdockerの公式ページからインストールしましょう。

mysqlのコンテナ作成

ソースは以下の通り
Dockerfile

FROM mysql:5.7
RUN touch /var/log/mysql/mysqld.log # ログの置き場所を作る
FROM alpine:latest

RUN apk update && \
apk add mysql-client

docker-compose.yml

version: '2'
services:
mysql:
image: mysql:5.7
container_name: mysql-test
ports:
- "3316:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: mysql
MYSQL_PASSWORD: mysql
MYSQL_DATABASE: mysql
volumes:
- ./my.cnf:/etc/mysql/conf.d/my.cnf
volumes_from:
- mysql-volume:rw
working_dir: "/var/lib/mysql"
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
depends_on:
- mysql-volume
mysql-volume:
image: busybox
container_name: mysql-volume
volumes:
- ./data:/var/lib/mysql

my.cnf

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

[client]
default-character-set=utf8

pythonのコンテナ作成

Dockerfile

FROM python:3.7-alpine

RUN pip install --upgrade setuptools
RUN pip install mysql-connector-python

docker-compose.yml

version: '3'
services:
python-scrape:
build: .
image: python-scrape
container_name: python-test
working_dir: /root/src
volumes:
- ./src/:/root/src/
tty: true

こんな感じで用意しておきます。

mysqlのコンテナを立ち上げる

ここからターミナルで作業します。

開発用のディレクトリまで移動

$ cd ./sample-dir/mysql

docker-composeを叩く

$ docker-compose -d --build

[box03 title="オプション紹介"]
-d :デタッチド・モード: バックグラウンドでコンテナを実行し、新しいコンテナ名を表示
—build:コンテナを開始前にイメージを構築する
[/box03]

イメージとはコンテナを作るためのもとの素材のようなものです。

pythonのコンテナを立ち上げる

基本的にmysqlと同じようにdocker-composeで立ち上げます。

開発用のディレクトリまで移動

$ cd ./sample-dir/python

docker-composeを叩く

$ docker-compose -d --build

mysqlより少々時間がかかるかと思いますが、ほっておいて大丈夫です。

コンテナが立ち上がっているか確認する

$ docker ps
c48fr3dd30a5        mysql:5.7               "docker-entrypoint.s…"   1 hours ago        Up 1 hours         33060/tcp, 0.0.0.0:3316->3306/tcp   mysql-test
b7gkc7bd4743        python-scrape           "python3"                1 hours ago        Up 1 hours                                             python-test

nameのところは、docker-compose.ymlのcontainer_nameで設定したものになります。

接続するための準備をする

これがあることでpythonとMySQLをつなげることができます。

mysqlのコンテナに入る

ターミナルで作業します

$ docker exec -it [コンテナ名(例)mysql-test] sh
#

コンテナ名の代わりにコンテナIDを使うこともできます。(例)c48fr3dd30a5

ユーザー権限を変える

# mysql -u root -p //rootでmysqlにログイン
 Enter password:[docker-compose.ymlで設定したrootのパスワード]
 mysql> GRANT ALL PRIVILEGES ON *.* TO mysql@'%';

テストデータを入れる

まずテストテーブルを作成

mysql> CREATE TABLE test_users (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL,
email VARCHAR(32) NOT NULL,
PRIMARY KEY (id)
);

そして、テストデータを入れます

mysql> INSERT INTO test_users (id,name,email) VALUES (1, ’taro','taro@test.com');

mysqlのIPアドレス

mysql-connectorを使うときにIPアドレスの指定しますので、そのアドレスを調べます。

jqをインストールする

jqとは、JSONでデータを使うコマンドです。

ターミナルで以下を叩きます。

$ brew install jq

MySQLコンテナのネットワークを調べる

$ docker inspect mysql | jq '.[0].NetworkSettings.Networks|keys'
[
"mysql_default"
]

上記のようにJSON型で返ってきます。

MySQLゲートウェイを調べる

docker network inspect mysql_default | jq '.[0].IPAM.Config[0].Gateway'
"172.22.3.1"

上記が設定するべきIPアドレスになります。

sample.pyを作成

接続するためのコードを書いていきます

#coding: utf-8
config = {
'user': 'mysql',
'password': 'mysql',
'host': '172.22.3.1',
'database': 'mysql',
'port': '3316',
}

if __name__ == "__main__":
conn = mysql.connector.connect(**config)
cursor = conn.cursor()

cursor.execute("select * from test_users”) //SQLを書く
for row in cursor.fetchall():
print("ID:" + str(row[0]) + "  name:" + row[1])

sample.pyを実行する

そして、pythonからmysqlが実行できるかテストします。

pythonのコンテナに入る

$ docker exec -it [コンテナ名(例)python-test] sh
~/src #

そして、sample.pyを実行します

~/src # python3 test.py

上記で設定したデータ(例ではIDと名前)が表示されていれば成功です。

sequel Proの接続方法

sequel Proというツールを使って、どんなデータが入っているか確認することができます。
PHPを使った人にとってはPHP My Adminのようなものです。

このツールを使えばdockerのコンテナ上のMySQLも接続できるので解説してきます。

(準備)sequel Proをインストール

公式サイトからインストールします。

設定方法

以下のように設定してください。

[標準]での接続

Host: 127.0.0.1 //コンテナ間の接続とは違う
User: your_user //今回は「mysql」
Password: your_password //今回は「mysql」
Port: 3316 //デフォルトは3306ですが、今回は3316でdocker-composeで設定

という感じで設定すればオッケーです。

ポイントはHostの部分は先程調べたゲートウェイとは違うことです。

ここの設定でハマってしまい時間を無駄にすることがあるので気をつけてください。

難しいそうで意外と簡単

簡単とは言ってますが、結構ハマった部分もあります。笑

最初、MySQLdbというやり方を使おうと思ってましたがソケットエラーなどが出て、
mysql-connectorを見つけてこちらですんなりできました。

もし、同じところで詰まっている人がいたらこちらの方法でやってみてください。

-PROGRAMMING
-, ,