3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

はじめに

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

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

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',)]
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?