docker-compose で mysql コンテナを python コンテナで実行させてみた

# はじめに
docker で mysql と python のコンテナを別々に立ち上げてから python コンテナを mysql につなげて実行する記事はよくありますが
docker-compose でコンテナの起動を一気にやってしまう記事はなかなか見つからなかったので上げました。


# この記事で行うこと
1. docker-compose で mysql と python3 のコンテナの起動
2. 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 を作成します。

``` 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 と接続できないです。

https://qiita.com/A-Kira/items/f401aea261693c395966

こちらのサイトを参考にしました


### mysql コンテナの設定

#### my.cnf 編集


``` 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を有効にする設定をします。

``` /srv/docker/mysql/db/Dockerfile.　
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 と接続するためのパッケージをインストールします

```/srv/docker/mysql/python/Dockerfile.
FROM python:3.7

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

#### mysql コンテナと接続＆実行　python ファイルの作成


```/srv/docker/mysql/python/sample.py
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',)]
```