カテゴリー
コンピューター

【Docker】MySQL のコンテナ A に、MySQL のコンテナ B からシンプルに接続する方法

はじめに

Docker さえあれば、MySQL クライアントが用意できる、それもたった 1 行のコマンドで。

これが実現できましたのでノートいたします。

ポイント

  • MySQL クライアントのコンテナについて。
    • 永続化する必要はまったくないため、終了したときに自動的にコンテナを削除するよう、docker run のオプションに –rm を指定する。
    • shell や bash で MySQL クライアントコンテナにログインしても、mysql コマンドで MySQL サーバへアクセスしかしないため、docker run 時に mysql コマンドも実行してしまう。
  • MySQL サーバについて。docker-compose up してからネットワークを作成するのは面倒なため、up 時に名前を指定してネットワークを作成する
    • そのために、docker-compose.yml のフォーマットは version: ‘3.5’ にする。
    • version: ‘3’ ではダメ

MySQL サーバを作成するための docker-compose.yml

version: '3.5'
services:
  db:
    image: mysql:latest
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: testdocker
      MYSQL_PASSWORD: testdocker
      MYSQL_DATABASE: testdocker
networks:
  default:
    name: dbnet

MySQL サーバへ接続するための MySQL クライアントを用意

docker run --network dbnet -it --rm mysql:latest sh -c 'exec mysql -u root -h db -p'

次のように、パスワードをコマンドにべた書きしてもアクセスできました。

docker run --network dbnet -it --rm mysql:latest sh -c 'exec mysql -u root -h db -proot'

env を使う次の方法は、もちろんダメでした。env は MySQL サーバにしか定義されていませんものね。

docker run --network dbnet -it --rm mysql:latest sh -c 'exec mysql -u root -h db -proot'

実際に動かしてみた記録

$ cat << EOF > docker-compose.yml 
> version: '3.5'
> services:
>   db:
>     image: mysql:latest
>     ports:
>       - "3306:3306"
>     environment:
>       MYSQL_ROOT_PASSWORD: root
>       MYSQL_USER: testdocker
>       MYSQL_PASSWORD: testdocker
>       MYSQL_DATABASE: testdocker
> networks:
>   default:
>     name: dbnet
> EOF
$ docker-compose up -d
Creating network "dbnet" with the default driver
Creating testdocker-mysql_db_1 ... done
$ 
$ docker run --network dbnet -it --rm mysql:latest sh -c 'exec mysql -u root -h db -p'
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.11 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> select user();
+--------------------+
| user()             |
+--------------------+
| root@192.168.224.3 |
+--------------------+
1 row in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdocker         |
+--------------------+
5 rows in set (0.01 sec)

mysql> exit
Bye
$ 

補足

MySQL クライアントからではなく、MySQL サーバコンテナにログインして直接アクセスするには、次のようにすればできました♪
もちろん、docker-compose up -d を行った後の操作となります。

# MySQL の任意のユーザでログイン
docker exec -it testdocker-mysql_db_1 sh -c 'exec mysql -u "$MYSQL_USER" -p"$MYSQL_PASSWORD"'
# MySQL の root ユーザでログイン
docker exec -it testdocker-mysql_db_1 sh -c 'exec mysql -u root -p"$MYSQL_ROOT_PASSWORD"'

おわりに

次のページが参考になりました。ありがとうございます!

以上です。

コメントを残す