ジャコ Lab

プログラミング関連のメモ帳的ブログです

異なる docker-compose 間で MySQL にアクセスするには?

昨日docker-compose.yml 1つコンテナを2つ という構成でしたが、本日は docker-compose.yml が2つです。

イメージ図
イメージ図

docker-compose を分けるとネットワークが別れてしまう

(mysql)

services:
  mysql:
    image: mysql:latest
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - ./db/data:/var/lib/mysql
    ports:
      - 3306:3306
$ docker compose up -d
~省略~
[+] Running 2/2
 ✔ Network mysql_default  Created  0.3s 
 ✔ Container mysql        Started  
mysql_default というネットワークが自動的に出来ます

(app)

FROM python:3.11.10-slim-bullseye

RUN apt update -y
RUN apt install default-mysql-client -y
services:
  app:
    build:
      context: .
    container_name: app
    tty: true
$ docker compose up -d
~省略~
 ✔ Network my_app_default  Created  0.4s 
 ✔ Container app           Started 
こちらではmy_app_default というネットワークが自動的に出来ました

昨日 はというと、
1つの docker-compose.yml2つのコンテナ の構成にしましたので、
偶然? 同じネットワーク内に app も mysql も居た のでした。


本日の状態ではもちろん接続できません。

$ docker compose exec app bash
root@6d3764e95a9c:/# mysql -h mysql -u root -p
Enter password: 
ERROR 2005 (HY000): Unknown MySQL server host 'mysql' (-3)

同じネットワークに所属するようにする

イメージ図
イメージ図

今回は、自動的に出来た mysql_default のネットワークを間借りして、app コンテナも所属させる作戦です。

一度コンテナを破棄しておきます

$ docker compose down
[+] Running 2/2
 ✔ Container app           Removed  11.2s 
 ✔ Network my_app_default  Removed     

app の docker-cmopose を書き換える

  services:
    app:
      build:
        context: .
      container_name: app
      tty: true
+     networks:
+       - mysql_default
+
+ networks:
+   mysql_default:
+     external: true  # どこかにある mysql_default というネットワークを使用する

コンテナを立て直す

$ docker compose up -d
~省略~
 ✔ Container app  Started 
今度はネットワークが自動生成されませんでした。

動作確認

コンテナに潜って MySQL にログイン

$ docker compose exec app bash
root@971a3ec3cb7f:/# mysql -h mysql -u root -p 
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 9.0.1 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_db              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.014 sec)

MySQL [(none)]> 
できた

まとめ

docker-compose 間の通信の仕方を学んだ