Docker Get Started(ドック翻訳)-Part 7-Mulit-Containerアプリケーション(マルチコンテナアプリケーションの構築)


Multi container apps


単一コンテナアプリケーションについては、これまで議論されてきました.ただし、アプリケーションスタックにMySQLを追加したい.「MySQLはどこで実行しますか?同じコンテナで実行しますか?それとも別のコンテナで実行しますか?」という質問がよくあります.通常、各コンテナは1つのことしかしません.理由は次のとおりです.
  • APIまたはfront-endは、データベースとは異なる拡張を必要とする可能性が高い.
  • セパレータコンテナを使用すると、バージョンとデータバージョンを独立して更新してタスクを実行できます.
  • ローカルではデータベースコンテナを使用できますが、本番データベースの管理サービスも使用できます.データベース・エンジンをアプリケーションと一緒に出荷したくない場合があります.
  • 複数のプロセスを実行するにはプロセスマネージャが必要です.これにより、コンテナの起動/停止が複雑になります.
  • もう1つの理由は、アプリケーションを次のようにします.

    Container Networking


    デフォルトでは、コンテナは別々に動作し、同じシステム内の他のプロセスまたはコンテナが同じマシンに存在してもわかりません.
    では、コンテナ間の通信はどうすればいいのでしょうか.ネットワーク.これを覚えておきましょう
    2つのコンテナが同じネットワークに存在する場合、互いに通信することができる.そうでなければ、これは不可能です.

    Starting MySQL


    コンテナをネットワークに入れるには2つの方法があります.
  • 起動時割付
  • 既存のコンテナに接続
  • 次に、ネットワークの作成と起動時にMySQLコンテナを貼り付けます.

  • ネットワークを作成します.
    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フラグは後述します.
  • Pro-tip
    ここでは、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-接続後に使用するデータベース
  • 環境変数を使用した接続設定は開発中は許容できますが、本番アプリケーションではあまりよくありません.DockerのセキュリティディレクターDiogo Monicaが原因を説明する情報を発表しましたので、ご覧ください.
    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 |
     +--------------------------------------+--------------------+-----------+
    いくつかの違いがはっきり見えます.
  • ドッキングダッシュボードをすばやく表示すると、2つのアプリケーションが実行されていることがわかりますが、1つのアプリケーションでグループ化されているかどうかはわかりません.今後、それをより良くする方法について議論します.