見出し画像

Docker 入門 (7) - マルチコンテナアプリケーション

以下の記事を参考に書いてます。

Multi container apps | Docker Documentation

前回

1. はじめに

「マルチコンテナアプリケーション」の作成方法を説明します。
今回は、todoリストのサンプルアプリのNode.js部分とMySQL部分を別コンテナに分離します。

画像2

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つのコンテナが実行されていることがわかります。

画像2

次回


この記事が気に入ったらサポートをしてみませんか?