Docker 入門 (7) - マルチコンテナアプリケーション
以下の記事を参考に書いてます。
・Multi container apps | Docker Documentation
前回
1. はじめに
「マルチコンテナアプリケーション」の作成方法を説明します。
今回は、todoリストのサンプルアプリのNode.js部分とMySQL部分を別コンテナに分離します。
2. ネットワーク
「コンテナ」は、デフォルトで隔離されており、他の「コンテナ」については何も知りません。2つの「コンテナ」を同じ「ネットワーク」上に配置することで、お互い会話することができるようになります。
3. ネットワークを指定したコンテナの開始
ネットワークを指定したコンテナの開始手順は、次のとおりです。
(1) 「docker network」で、ネットワークを作成。
$ docker network create todo-app
(2) 「docker network ls」でネットワークを確認。
「bridge」「host」「none」は、デフォルトネットワークになります。
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
f2536181c7ea bridge bridge local
d024ad549569 host host local
d0925739b90a none null local
fe8f0f32290f todo-app bridge local
(3) ネットワークを指定して、コンテナ「MySQL」を開始。
DBを初期化するために使用する環境変数も指定しています。
$ docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7
引数は、次のとおりです。
--network todo-app : ネットワーク「todo-app」に接続
--network-alias mysql : ホストネーム「mysql」を指定。
-v todo-mysql-data:/var/lib/mysql :「todo-mysql-data」という名前のボリュームを/var/lib/mysqlにバインド。名前付きボリュームは自動的に作成される。
(4) DBが稼働していることを確認するために、DBに接続。
$ docker exec -it <mysql-container-id> mysql -u root -p
(5) パスワードのプロンプトが表示されたら「secret」と入力。
(6) MySQL シェルでDBをリストアップ。
todosデータベースが表示されることを確認します。
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| todos |
+--------------------+
5 rows in set (0.00 sec)
4. ネットワークを指定したコンテナのIPの確認
ネットワークを指定したコンテナのIPの確認手順は、次のとおりです。
(1) ネットワークを指定して、コンテナ「nicolaka/netshoot」を開始。
「nicolaka/netshoot」は、ネットワークに関する問題のトラブルシューティングやデバッグに役立つ多くのツールが付属しているコンテナです。
$ docker run -it --network todo-app nicolaka/netshoot
(2) コンテナ内で「dig」コマンドを実行。
ホストネーム「mysql」(--network-aliasで指定した名前)のIPアドレスを調べます。
$ dig mysql
; <<>> DiG 9.16.19 <<>> mysql
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1378
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;mysql. IN A
;; ANSWER SECTION:
mysql. 600 IN A 172.20.0.2
;; Query time: 2 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Fri Aug 20 13:11:57 UTC 2021
;; MSG SIZE rcvd: 44
「ANSWER SECTION」では、172.23.0.2(多くの場合、異なる値になります)に解決されるmysqlのAレコードが表示されます。
5. ネットワークを指定したコンテナへの接続
ネットワークを指定したコンテナへの接続手順は、次のとおりです。
(1) ネットワークを指定して、MySQL接続の環境変数付きのコンテナを開始。
$ docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:12-alpine \
sh -c "yarn install && yarn run dev"
todoリストは、MySQL接続の環境変数をサポートしています。 これを設定することで、別コンテナのMySQLに接続するようになります。
・MYSQL_HOST : 稼働中のMySQLサーバーのホスト名。
・MYSQL_USER : 接続に使用するユーザー名。
・MYSQL_PASSWORD : 接続時に使用するパスワード。
・MYSQL_DB : 接続時に使用するデータベース。
(2) コンテナのログを確認。
「mysql」のデータベースを使用しているメッセージが表示されてれいることを確認します。
$ nodemon src/index.js
[nodemon] 1.19.2
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): *.*
[nodemon] starting `node src/index.js`
Waiting for mysql:3306.
Connected!
Connected to mysql db at host mysql
Listening on port 3000
(3) ブラウザで開き、todoリストにいくつかの項目を追加。
(4) mysqlデータベースに接続。
$ docker exec -it <mysql-container-id> mysql -p todos
(4) パスワードのプロンプトが表示されたら「secret」と入力。
(5) 項目がDBに書き込まれていることを確認。
mysql> select * from todo_items;
+--------------------------------------+-------+-----------+
| id | name | completed |
+--------------------------------------+-------+-----------+
| 9f0e6f15-0180-4b4a-bc9a-2393a6cf2cfa | TEST! | 0 |
+--------------------------------------+-------+-----------+
1 row in set (0.00 sec)
「Dockerダッシュボード」を見ると、2つのコンテナが実行されていることがわかります。
次回
この記事が気に入ったらサポートをしてみませんか?