こんにちは。もんしょー(@sima199407)です。
そんな声があるかと思います。
今回は「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を見つけてこちらですんなりできました。
もし、同じところで詰まっている人がいたらこちらの方法でやってみてください。