はじめに
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"'
おわりに
次のページが参考になりました。ありがとうございます!
- サーバの参考に
- ネットワークに任意の名前を付ける参考に
- クライアントの参考に
- コンテナ間通信の参考に
以上です。