Python 3 でMySQLに接続 docker-composeで外部ネットワーク経由

dockerでpythonからmysqlにs津族 docker

WindowsでDocker環境構築は下記リンクを参照。

現在、Selenium,python,mysql(phpmyadminも)の計3つのdocker-composeを作って、selenium<->pythonはselenium_network、python<->mysqlはmysql_networkというネットワークを作成しそこを介してコンテナ間でやりとりしています。

スポンサーリンク

Pythonのdocker-compose.ymlとmysqlのdocker-compose.ymlにネットワーク記述を

docker network create mysql_network

ネットワークを作成していなければdocker network create mysql_network(名前は好きなものを)作成しておきます。作成されたかは下記で確認しておきます。

docker network ls

python,mysqlそれぞれのdocker-compose.ymlにネットワークを記述

python

version: '3'
services:
  python:
    container_name: py3
    build: .
    ports:
      - 8888:8888
    volumes:
      - ../proj/py:/app
    tty: true
    networks:
      - selenium_network
      - mysql_network
networks:
  selenium_network:
    external: true
  mysql_network:
    external: true

mysql

version: '3'
services:
  mysql:
    container_name: mysql
    build: ./mysql
    environment:
      MYSQL_ROOT_PASSWORD: pass
      TZ: "Asia/Tokyo"
    networks:
      - mysql_network
    volumes:
      - db:/var/lib/mysql
    ports:
      - 3306:3306

  phpmyadmin:
    container_name: phpmyadmin
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOSTS=mysql
      - PMA_USER=root
      - PMA_PASSWORD=pass
    networks:
      - mysql_network
    ports:
      - 8080:80

volumes:
  db:
networks:
  mysql_network:
    external: true



それぞれdocker-compose upで変更が反映されるようにしておきます。

ネットワークの利用状況

先ほど作成したmysql_networkの状況を確認します。

下記のように、mysql_networkは、mysqlコンテナ、phpmyadminコンテナ、py3コンテナがリストに入っています。

# docker network inspect mysql_network

[
    {
        "Name": "mysql_network",
        "Id": "f1f45bf1834df9c3632198e155177249f599b91ed97d851a358405af943b55bb",
        "Created": "2022-05-30T23:57:37.561171096Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "3531f051ce584a6e72fa28efae430f625bbf296a0f8f5aac4d6d3725780e067e": {
                "Name": "mysql",
                "EndpointID": "f32ef7803f62db13d23d02adb4e4e34c617890b0baa08eb2f0b3e0329e0529e0",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "64788b7196ea52176b003c4c55d52b0a0638eb3d80a2122a9cbf68590f5f3fc8": {
                "Name": "phpmyadmin",
                "EndpointID": "18638338bcf347b4fc9f7224c6a37cfb4d739d7d3aeeea3a59a11b4dd9142cc7",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "81cd4067524cebb8b88d1d7da638c590665507830c31ad30c9551f8096ace5ff": {
                "Name": "py3",
                "EndpointID": "6e7f24e6b9cf44ef654934a05c20583bcca4d8b660b3ce78e621736afce62dc4",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

pythonにはmysqlclientパッケージを入れておく

requirements.txtとかに下記を書いておきます。別途Dockerfile必要です。

selenium
requests
BeautifulSoup4
mysqlclient

pythonからmysqlに接続しテーブル作成するコード

下記がサンプルです。実行するとテーブル作成されます。sqltest.pyとしました。

#sqltest.py

import MySQLdb

#接続
conn = MySQLdb.connect(
  host='mysql',  #mysqlコンテナ名
  port=3306,     #mysqlコンテナのポート
  user='root',   #DBuser名
  passwd='pass', #DBパスワード
  db='pydb',     #データベース名
  charset='utf8'
)

#カーソルオブジェクト取得
cur = conn.cursor()

#SQL実行命令(中身はなんでもいい)
cur.execute("""CREATE TABLE tt(id INT(11) AUTO_INCREMENT NOT NULL, name VARCHAR(32) NOT NULL, PRIMARY KEY (id)    )""")

#コミットで命令を実際に適用する
cur.commit()

#接続を閉じる
conn.close()

dockerコマンドでpythonコンテナに入り、実行してみます。

docker exec -it py3 /bin/bash

python sqltest.py

PHPMyAdminでテーブル作成されたかチェック

ブラウザでlocalhost:8080(自分のmysql docker-compose.yml設定では)でphpmyadminを開き、確認します。出来ています。

コメント

タイトルとURLをコピーしました