Docker Get Started(ドック翻訳)-Part 7-Mulit-Containerアプリケーション(マルチコンテナアプリケーションの構築)
6684 ワード
Multi container apps
単一コンテナアプリケーションについては、これまで議論されてきました.ただし、アプリケーションスタックにMySQLを追加したい.「MySQLはどこで実行しますか?同じコンテナで実行しますか?それとも別のコンテナで実行しますか?」という質問がよくあります.通常、各コンテナは1つのことしかしません.理由は次のとおりです.
Container Networking
デフォルトでは、コンテナは別々に動作し、同じシステム内の他のプロセスまたはコンテナが同じマシンに存在してもわかりません.
では、コンテナ間の通信はどうすればいいのでしょうか.ネットワーク.これを覚えておきましょう
2つのコンテナが同じネットワークに存在する場合、互いに通信することができる.そうでなければ、これは不可能です.
Starting MySQL
コンテナをネットワークに入れるには2つの方法があります.
コンテナをネットワークに入れるには2つの方法があります.
ネットワークを作成します.
docker network create todo-app
MySQLコンテナを起動し、ネットワークに接続します.データベースを初期化するためにいくつかの環境変数を定義します.
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
電源ユニット(PSU)では、次のようになります. 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-aliasフラグは後述します.ここでは、tod-mysql-dataというボリュームを使用してデータを格納し、/var/lib/msqlをマウントします.しかしdocker volume createは実行されませんでした.これは、ドッキングステーションが使用する名前付きボリュームを覚えて自動的に作成するためです.
データベースが実行中であることを確認するには、データベースに接続して接続します.
docker exec -it <mysql-container-id> mysql -p
パスワードの入力が必要な場合はsecretを入力します.MySQL Shellでは、データベースのリストとtodosデータベースを表示できます. mysql> SHOW DATABASES;
以下の結果を確認できます. +--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| todos |
+--------------------+
5 rows in set (0.00 sec)
Connecting to MySQL
MySQLが実行されていることがわかります.ここで、同じネットワーク上の別のコンテナが実行されている場合、どのように検索しますか?各コンテナには独自のIPアドレスがあることを覚えておいてください.
この問題を解決するために、Nicolaka/Netshotコンテナを作成して使用します.これには、トラブルシューティングやネットワークイベントのデバッグに使用できるツールがたくさんあります.
nicolaka/netshotイメージを使用して新しいコンテナを起動し、同じネットワークに接続します.
docker run -it --network todo-app nicolaka/netshoot
DNSツールとして有用なdigコマンドをコンテナに使用します.ホスト名mysqlのIPアドレスを確認しましょう.
dig mysql
では、以下の結果を見ることができます. ; <<>> DiG 9.14.1 <<>> mysql
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32162
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;mysql. IN A
;; ANSWER SECTION:
mysql. 600 IN A 172.23.0.2
;; Query time: 0 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Tue Oct 01 23:47:24 UTC 2019
;; MSG SIZE rcvd: 44
ANSWER SECTIONが172.23.0.2と決定したmysqlのAレコードを表示します.通常mysqlは有効なホスト名ではありませんが、Dockerはmysqlをネットワーク別名を持つコンテナのIPアドレスとして解析できます.ホスト名をmysqlに簡単に接続するだけです.Running our App with MySQL
todo appは、MySQL接続を設定するためのいくつかの環境変数をサポートします.
MYSQL_HOST
-実行中のMySQLサーバのホスト名MYSQL_USER
-接続用ユーザー名MYSQL_PASSWORD
-パスワードMYSQL_DB
-接続後に使用するデータベースhttps://diogomonica.com/2017/03/27/why-you-shouldnt-use-env-variables-for-secret-data/
容器交響楽団の枠組みを用いて放出される秘密はより安全なメカニズムである.ほとんどの場合、Secretをファイルとして実海にマウントします.多くのアプリケーションでは、FILE接尾辞を使用して変数を含むファイルを位置決めすることがサポートされています.
たとえば、MYSQL PASWORD FILE変数を設定する場合は、接続パスワードを使用してファイルの内容を参照してください.ドッキングステーションでは、これらの環境変数はサポートされていません.アプリケーションを使用して変数とファイルの内容を検索する方法を理解する必要があります.
dev-readyコンテナを始めましょう.
アプリケーションネットワークにうまく接続するには、各環境変数を指定します.
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"
PowerShellは次のようになります. 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"
コンテナログを表示する場合は、メッセージに接続されているMySQLデータベースが表示されます.
# Previous log messages omitted
$ 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`
Connected to mysql db at host mysql
Listening on port 3000
ブラウザでtodoアプリケーションを実行し、いくつかのプロジェクトを追加します.
mysqlデータベースに接続し、正しく書き込まれているかどうかを確認します.パスワードは秘密
docker exec -it <mysql-container-id> mysql -p todos
そして確認しよう mysql> select * from todo_items;
+--------------------------------------+--------------------+-----------+
| id | name | completed |
+--------------------------------------+--------------------+-----------+
| c906ff08-60e6-44e6-8f49-ed56a0853e85 | Do amazing things! | 0 |
| 2912a79e-8486-4bc3-a4c5-460793a575ab | Be awesome! | 0 |
+--------------------------------------+--------------------+-----------+
いくつかの違いがはっきり見えます.Reference
この問題について(Docker Get Started(ドック翻訳)-Part 7-Mulit-Containerアプリケーション(マルチコンテナアプリケーションの構築)), 我々は、より多くの情報をここで見つけました https://velog.io/@devsh/Docker-Get-started-도커-번역-Part-7-Mulit-Container-Application-다중-컨테이너-애플리케이션-구축하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol