はじめに
docker で mysql と python のコンテナを別々に立ち上げてから python コンテナを mysql につなげて実行する記事はよくありますが
docker-compose でコンテナの起動を一気にやってしまう記事はなかなか見つからなかったので上げました。
この記事で行うこと
- docker-compose で mysql と python3 のコンテナの起動
- python3 のコンテナの起動後、mysql に接続してテーブルを作成&確認
環境
ubuntu 18.04 を使用
docker と docker-compose をインストール済であること
ファイル構成
/srv/docker/mysql/
├── docker-compose.yml
├── db/
│ ├── data/
│ ├── Dockerfile
│ ├── my.cnf
├── log/
├── python/
│ ├── sample.py
│ └── Dockerfile
└── root
手順
ディレクトリを作成します
$ mkdir -p /srv/docker/mysql/db/data
$ cd /srv/docker/mysql
$ mkdir log
$ mkdir python
$ mkdir python
$ mkdir root
docker-compose.yml 作成
/srv/docker/mysql/ ディレクトリで docker-compose.yml を作成します。
version: '3'
services:
# MySQL
db:
image: mysql:5.7
container_name: mysql_host
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_database
MYSQL_USER: docker
MYSQL_PASSWORD: docker
TZ: 'Asia/Tokyo'
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./db/data:/var/lib/mysql
- ./log/mysql:/var/log/mysql
- ./db/my.cnf:/etc/mysql/conf.d/my.cnf
ports:
- 3306:3306
## For static IP address
networks:
python_network:
ipv4_address: 192.168.2.2
## python3
python3:
restart: always
build:
context: ./python
container_name: "python3"
working_dir: "/root/src"
tty: true
volumes:
- ./python:/root/src
links:
- db
networks:
- python_network
networks:
python_network:
driver: bridge
ipam:
driver: default
config:
- subnet: 192.168.2.0/24
gateway: 192.168.2.1
解説
基本は mysql と python3 を docker-composeで立ち上げる内容になってます。
networks: について
python3で mysqlに接続するときに毎回 IP アドレスを聞くのが面倒なので、 "networks: " を使ってmysql のIPアドレスを固定化させています。
python3 のIPアドレスは固定させなくても大丈夫ですが、mysqlコンテナと同じネットワークで起動させないと(networks: で、mysqlと同じネットワークを指定)mysql と接続できないです。
こちらのサイトを参考にしました
mysql コンテナの設定
my.cnf 編集
[mysqld]
# 文字コード、整合順序の設定
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4
user = docker
password = docker
Dockerfile 編集
mysql のログ取りや my.cnfを有効にする設定をします。
FROM mysql:5.7
RUN touch /var/log/mysql/mysqld.log
ADD ./db/my.cnf /etc/mysql/conf.d/my.cnf
RUN chmod 644 /etc/mysql/my.cnf
python3 コンテナの設定
Dockerfile 編集
mysql と接続するためのパッケージをインストールします
FROM python:3.7
RUN pip install --upgrade setuptools
RUN pip install mysql-connector-python
mysql コンテナと接続&実行 python ファイルの作成
import mysql.connector
# connect mysql
cnx = mysql.connector.connect(
host='192.168.2.2',
port='3306',
user='docker',
password='docker',
database='test_database'
)
cursor_=cnx.cursor()
# create new database
query = " create database if not exists test_database"
cursor.execute(query2)
#create new table
query2 = "create table if not exists test (id int, data varchar(20))"
cursor.execute(query2)
#check table
query3 = "SHOW TABLES"
cursor.execute(query3)
print(cursor.fetchall())
解説
connect mysql について
host には mysql のIPアドレスを書きます。今回はdocker-compose で固定化させたIPアドレス使用してます
docker-compose でmysql のIPアドレスを固定化させていない場合、次の手順で確認します
mysql コンテナのIPアドレス確認方法
$ docker-compose up -d
$ docker exec -it mysql_host sh
# hostname -i
192.168.2.2
実行
1. コンテナの起動
docker-compose で mysql と python3 のコンテナを起動させます
$ cd /srv/docker/mysql
$ docker-compose up -d
ちゃんと起動できてるか確認します。 State が Up になっていればOKです
$ docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------
mysql_host docker-entrypoint.sh mysql ... Up 0.0.0.0:3306->3306/tcp,:::330
6->3306/tcp, 33060/tcp
python3 python3 Up
State が up じゃなかったらログを確認します
$ docker-compose logs
2. python3 コンテナを mysql コンテナに接続 & mysql を実行
python3 のコンテナの起動し、sample.pyを実行します
sample.py で作成したテーブル名が出力されれば成功です!
$ sudo docker exec -it python3 sh
# python3 sample.py
[('test',)]