カニゲーム攻略日記ブログ

beatmaniaIIDXやハースストーンなどのゲーム攻略日記。主にまったり勢。2016年にIIDX皆伝になった

Docker チュートリアル 7 8

Dockerチュートリアル Get started を一通りやったが
開発環境作れないぞ
他の参考サイトを調べ中

目次

7 マルチコンテナ アプリ

https://docs.docker.com/get-started/07_multi_container/

アプリケーションのコンテナとデータベースコンテナを個別に実行する

+--------------------+     +----------------------+
|                    |     |                      |
|  API / Frontend    |     |  Database (MySQL)    |
|  Container         |     |  Container           |
|                    |     |                      |
+--------------------+     +----------------------+

API / Frontend コンテナとデータベース (MySQL) コンテナは個別に実行され、それぞれの役割に集中できるようになっています。このアプローチにより、アプリケーションのコンポーネント間でスケーリングやバージョン管理を独立させ、運用環境に適応させることができます。

コンテナネットワーキング

コンテナは独立している
別のコンテナと通信できるようにネットワーキングする 2つの方法がある

  • コンテナ起動時にネットワークを割り当てます。
  • すでに実行中のコンテナーをネットワークに接続します。

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:8.0

このコマンドは、MySQL 8.0イメージを使用して新しいDockerコンテナを実行するようDockerに指示しています。各オプションの説明は以下の通りです。

  • -d: デタッチモードでコンテナを実行します。これにより、コンテナがバックグラウンドで実行され、ターミナルがすぐに返されます。
  • --network todo-app: コンテナをtodo-appという名前のネットワークに接続します。このネットワークを使用することで、同じネットワークに接続された他のコンテナとの通信が可能になります。
  • --network-alias mysql: コンテナにmysqlというネットワークエイリアスを付けます。これにより、他のコンテナがこのエイリアス名でMySQLコンテナにアクセスできます。
  • -v todo-mysql-data:/var/lib/mysql: Dockerボリュームtodo-mysql-dataをコンテナ内の/var/lib/mysqlディレクトリにマウントします。これにより、MySQLデータがボリュームに保存され、コンテナが削除されてもデータが維持されます。
  • -e MYSQL_ROOT_PASSWORD=secret: 環境変数MYSQL_ROOT_PASSWORDを設定し、MySQLのrootユーザーのパスワードをsecretに設定します。
  • -e MYSQL_DATABASE=todos: 環境変数MYSQL_DATABASEを設定し、MySQLサーバーが起動時にtodosというデータベースを作成します。
  • mysql:8.0: 実行するDockerイメージを指定します。この場合、バージョン8.0のMySQLイメージが使用されます。

このコマンドを実行すると、新しいMySQLコンテナが作成され、todo-appネットワークに接続され、データがtodo-mysql-dataボリュームに保存されます。また、指定されたパスワードとデータベースが設定されます。

データベースを確認

docker exec -it <mysql-container-id> mysql -u root -p

mysql> SHOW DATABASES;

このコマンドは、実行中のMySQLコンテナ内でMySQLコマンドラインクライアントを起動するために使用されます。各部分の説明は以下の通りです。

  • docker exec: 実行中のDockerコンテナ内でコマンドを実行するために使用されるDockerコマンドです。
  • -it: このオプションは、対話的なターミナル(-i)と、端末をエミュレートするための疑似TTY(-t)を割り当てます。これにより、ユーザーはMySQLコマンドラインクライアントと対話できるようになります。
  • <mysql-container-id>: 実行中のMySQLコンテナのIDです。この部分は、実際のコンテナIDに置き換える必要があります。コンテナIDは、docker psコマンドを使用して取得できます。
  • mysql -u root -p: コンテナ内で実行するコマンドです。これは、MySQLコマンドラインクライアントをrootユーザーとして起動し、パスワードを要求するように指示しています。

コマンドを実行すると、MySQLコマンドラインクライアントが起動し、パスワード入力を求められます。パスワードを入力すると、MySQLサーバーにアクセスし、SQLクエリを実行できます。

対話的なターミナル(-i)と、端末をエミュレートするための疑似TTY(-t

対話的なターミナル(-i)と疑似TTY(-t)は、Dockerコンテナ内で対話的なセッションを開始するために使用されるオプションです。

  • -i(対話的): "interactive"(対話的)。このオプションは、コンテナとユーザーの間で対話的な通信を可能にします。標準入力(stdin)が開いたままになり、ユーザーがキーボードから入力できるようになります。これにより、対話的なシェルやアプリケーションと通信できます。
  • -t(疑似TTY): このオプションは、端末エミュレータ(疑似TTY)をコンテナに割り当てます。これにより、ユーザーは、コマンドラインプロンプトやテキストベースのアプリケーションなど、端末に依存する機能を利用できます。

図で説明すると以下のようになります:

+------------------+        +-----------------+
|                  |        |                 |
|    User Input    +-------->   Container     |
|   (Keyboard)     |        |   (Interactive  |
|                  |        |    Application) |
+------------------+        +-----------------+
        |                                   |
        +-----------------------------------+
          Terminal Emulation (Pseudo TTY)

この図では、ユーザーの入力がコンテナ内の対話的アプリケーションに渡されています。同時に、端末エミュレーション(疑似TTY)がアプリケーションとユーザーの間の通信を可能にし、端末依存の機能を提供しています。

nicolaka/netshoot イメージ

docker run -it --network todo-app nicolaka/netshoot
  1. docker run: Docker コンテナを実行するためのコマンドです。

  2. -it: このオプションは、コンテナと対話的に通信するために使用されます。-i は "interactive"(対話的)で、標準入力を開いたままにし、-t は疑似 TTY(端末)を割り当てて、コマンドラインプロンプトのようなインターフェイスを提供します。

  3. --network todo-app: このオプションは、コンテナを todo-app という名前のネットワークに接続します。これにより、同じネットワーク内の他のコンテナと通信できます。

  4. nicolaka/netshoot: この部分は、実行する Docker イメージの名前です。nicolaka/netshoot は、ネットワークのトラブルシューティングデバッグに役立つツールが含まれたイメージです。

このコマンドは、nicolaka/netshoot イメージを実行し、対話的なターミナルを開いて、todo-app ネットワークに接続します。これにより、ネットワーク内の他のコンテナと通信するためのツールを使用できます。

8 Docker Compose

https://docs.docker.com/get-started/08_using_compose/

Docker Composeを使用してマルチコンテナーアプリケーションを構築する方法を説明する図です。

+--------------------------------------------------+
|                                                  |
|                Docker Compose.yml                |
|                                                  |
|  +--------------+   +----------------+   +-----+ |
|  | Service 1    |   | Service 2      |   | ... | |
|  | (e.g. App)   |   | (e.g. Database)|   |     | |
|  | - Build      |   | - Image        |   | ... | |
|  | - Ports      |   | - Environment  |   |     | |
|  | - Volumes    |   | - Volumes      |   | ... | |
|  +--------------+   +----------------+   +-----+ |
|                                                  |
+--------------------------------------------------+

                      |
                      |
                      v

+--------------------------------------------------+
|                                                  |
|                Docker Engine                    |
|                                                  |
|  +--------------+   +----------------+   +-----+ |
|  | Container A  |   | Container B    |   | ... | |
|  | (Service 1)  |   | (Service 2)    |   |     | |
|  +--------------+   +----------------+   +-----+ |
|                                                  |
+--------------------------------------------------+

上記の図では、Docker Compose.ymlファイルを使用して、アプリケーションの各サービス(例:アプリ、データベース)を定義しています。このファイルには、ビルド設定、ポート、環境変数、ボリュームなどの各サービスの設定が含まれています。

Docker Compose.ymlファイルを使用してDockerエンジンでコンテナを作成し、各サービスが個別のコンテナとして実行されます。この方法でアプリケーションスタックをファイルで定義することで、他の開発者がプロジェクトに簡単に貢献できるようになります。

./:/appの:は?

./:/app は、Dockerでホストマシンとコンテナ内のディレクトリをマウント(バインド)する際に使用される構文です。ここでのコロン(:)は、ホストマシンのディレクトリとコンテナ内のディレクトリを区切るために使われています。

この具体的な例では、./はホストマシン上の現在のディレクトリを指し、/appはコンテナ内のディレクトリを指します。したがって、./:/appは、ホストマシンの現在のディレクトリをコンテナ内の/appディレクトリにマウント(バインド)することを意味します。

これにより、開発中にホストマシン上で行われるファイルの変更が、リアルタイムでコンテナ内にも反映されます。これは開発プロセスを簡素化し、コンテナ内で変更をすぐにテストすることができます。