このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
【Docker入門】コンテナのネットワーク②
コンテナのネットワークの概要
Docker Composeを使用すると、デフォルトで専用のネットワークが作成され、サービス間の通信が容易になります。「link
」オプションは非推奨であり、代わりにComposeファイル内でネットワークを明示的に定義することが推奨されます。
外部からコンテナに通信するにはポートフォワーディングが必要であり、これによりホストの特定のポートからコンテナのポートへのトラフィックが転送されます。ポートフォワーディングに関連するエラーには、ポートの競合やネットワーク設定の誤りが含まれます。
Docker Composeで明示的にネットワークを作成するには、Composeファイル内でネットワークを定義し、サービスに割り当てます。
ここでは、前半でコンテナのネットワークについて解説し、後半で、コンテナ間の通信、そして、コンテナ外とコンテナ内の通信ができるように実際にDockerのネットワークを構築していきます。
Docker Composeにおける専用のネットワーク
Docker Composeを使用すると、デフォルトで専用のネットワークが作成されます。これにより、Composeファイル内で定義されたサービス間での通信が容易になります。各サービスは、そのネットワーク内のDNS名で相互にアクセスできます。
linkオプションの非推奨性
以前は、「link
」オプションを使用してコンテナ間の通信を行う方法がありましたが、現在では非推奨とされています。代わりに、各サービスはComposeファイル内で明示的に定義されたネットワーク内で通信することが推奨されます。
外部からコンテナに通信する方法
コンテナの外部からコンテナ内のアプリケーションに通信する場合、ポートフォワーディングが必要です。これにより、ホストの特定のポートからコンテナ内のポートへのトラフィックが転送されます。例えば、ホストのポート8080をコンテナのポート80に転送する場合、次のようにします。
docker run -p 8080:80 image_name
ポートフォワーディングでよく起きるエラー
ポートフォワーディングに関連する一般的なエラーには、ポートがすでに他のプロセスに使用されているためにバインドできない場合や、ネットワーク設定が正しくない場合などがあります。
ポートが既に使用されている場合は、他のポートを使用するか、既存のプロセスを停止する必要があります。ネットワーク設定が正しくない場合は、ホストとコンテナの間で適切な通信ができるように設定を調整する必要があります。
具体的には、Dockerホストのポート番号を1つずらすなどして、使われていないポート番号に変更して実行します。例えば、「ports」のところで1つ目のコンテナに「8080:80」を2つ目のコンテナに「8081:80」のように指定します。
よく使用するホスト側のWebサービスのポート番号には、「80」「8080」「10080」などがあります。
Docker Composeで明示的にネットワークを作成する方法
Docker Composeで明示的にネットワークを作成するには、Composeファイルでネットワークを定義します。以下はその例です。
services:
web:
image: nginx
networks:
- mynetwork
db:
image: mysql
networks:
- mynetwork
networks:
mynetwork:
このようにして、「mynetwork
」という名前のネットワークを定義し、それを各サービスに割り当てます。これにより、Composeファイル内のサービスは同じネットワーク内で通信できます。
Dockerネットワークの構築
ここから、コンテナ間の通信、そして、コンテナ外とコンテナ内の通信ができるように実際にDockerのネットワークを構築します。
WordPressコンテナの作成
Docker Composeコマンドを使って、WordPressコンテナを構築していきます。
構築するコンテナとネットワークの構成は下図のとおりです。
compose.yaml の作成
ディレクトリの作成と移動
Docker Composeでコンテナを作成するには、「compose.yaml」ファイルが必要になります。
デフォルトでは、カレントディレクトリにある「compose.yaml」ファイルが読み込まれるため、作業ディレクトリに移動しておきます。
・「cd desktop/docker」コマンドを実行します。
PS C:\Users\joeac> cd desktop/docker
PS C:\Users\joeac\Desktop\docker>
「compose.yaml」ファイルを保存する「wordpress1」ディレクトリを作成して、作成したディレクトリに移動します。次のコマンドを実行します。
- 「mkdir wordpress3」コマンド
- 「cd wordpress3」コマンド
PS C:\Users\joeac\Desktop\docker> mkdir wordpress3
Directory: C:\Users\joeac\Desktop\docker
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2024/04/13 1:01 wordpress3
PS C:\Users\joeac\Desktop\docker> cd wordpress3
PS C:\Users\joeac\Desktop\docker\wordpress3>
VSCodeの起動
VSCodeで「compose.yaml」ファイルを作成します。
・「code compose.yaml」コマンドを実行します。
PS C:\Users\joeac\Desktop\docker\wordpress3> code compose.yaml
VSCodeが起動します。
「compose.yaml」ファイルの編集
・「compose.yaml」ファイルを以下のように編集して保存します。
services:
wpdb:
image: mariadb:10.8
environment:
MARIADB_ROOT_PASSWORD: root-pass
MARIADB_DATABASE: database
MARIADB_USER: wp-user
MARIADB_PASSWORD: wp-pass
networks:
- wpnetwork
volumes:
- db-data:/var/lib/mysql
wordpress:
image: wordpress:6.5
networks:
- wpnetwork
depends_on:
- wpdb
environment:
WORDPRESS_DB_HOST: wpdb
WORDPRESS_DB_NAME: database
WORDPRESS_DB_USER: wp-user
WORDPRESS_DB_PASSWORD: wp-pass
ports:
- "8080:80"
volumes:
- wp-data:/var/www/html
networks:
wpnetwork:
volumes:
db-data:
wp-data:
定義内容の解説
「compose.yaml」ファイルの定義を解説します。
このComposeファイルでは、WordPressのWebアプリケーションとデータベースのサービスが定義されており、それぞれが独自の設定とネットワーク上の位置を持っています。WordPressサービスは「wpdb
」データベースサービスに依存しており、wpnetwork
ネットワークに参加しています。また、WordPressのWebアプリケーションはホストのポート80にマッピングされて公開されています。データ永続化のために、それぞれのサービスがボリュームを使用しています。
サービス名 | イメージ | 環境変数 | ネットワーク | 依存関係 | ポートの転送 | ボリューム |
---|---|---|---|---|---|---|
wpdb | mariadb:10.8 | MARIADB_ROOT_PASSWORD | wpnetwork | なし | なし | db-data:/var/lib/mysql |
MARIADB_DATABASE | ||||||
MARIADB_USER | ||||||
MARIADB_PASSWORD | ||||||
wordpress | wordpress:6.5 | WORDPRESS_DB_HOST | wpnetwork | wpdb | 80:80 | wp-data:/var/www/html |
WORDPRESS_DB_NAME | ||||||
WORDPRESS_DB_USER | ||||||
WORDPRESS_DB_PASSWORD |
- サービス名: コンテナの識別子です。
- イメージ: 使用されるDockerイメージです。
- 環境変数: 各コンテナに渡される環境変数です。
- ネットワーク: コンテナが参加するネットワークの名前です。
- 依存関係: コンテナが他のコンテナに依存していることを示します。
- ポートの転送: ホストのポートとコンテナのポートのマッピングです。
- ボリューム: データ永続化のために使用されるボリュームのマウントポイントです。
依存関係の定義
このDocker Composeファイルの定義では、WordPressサービスがMariaDBサービスに依存しています。依存関係は以下のように定義しています。
wordpress:
凵凵depends_on:
凵凵凵凵-凵wpdb
※「凵」は半角スペースを表しています。
上の部分が依存関係を表しており、WordPressサービスが起動する前に、wpdb(MariaDBサービス)が起動することを要求しています。
WordPressはデータベースに接続しないと使用できません。
コンテナの作成と実行
・「docker compose up -d」コマンドを実行します。
このコマンドは、「compose.yaml」ファイルを配置した場所で実行する必要があります。
PS C:\Users\joeac\Desktop\docker\wordpress3> docker compose up -d
[+] Running 31/2
✔ wordpress 21 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 14.9s
✔ wpdb 8 layers [⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 9.3s
[+] Running 2/5
- Network wordpress3_wpnetwork Created 1.2s
- Volume "wordpress3_wp-data" Created 1.1s
- Volume "wordpress3_db-data" Created 1.1s
✔ Container wordpress3-wpdb-1 Started 0.8s
✔ Container wordpress3-wordpress-1 Started
「Network wordpress3_wpnetwork Created」の出力から、「wpnetwork 」が作成されていることが確認できます。
・Docker Desktopでコンテナを確認します。
MariaDBとWordPressの2つのコンテナが作成されて動作しているため、コンテナを示すアイコンが緑色になっています。
コンテナが、緑色になってない場合は、何らかの問題が発生しています。
「compose.yaml」の定義の間違いが疑わしいので、トラブルシューティングを行ってください。
WordPressにアクセスする
・Webブラウザを起動して、URLに「localhost:8080」と入力します。
WordPressの初期セットアップのページが表示されます。
・「日本語」を選択して「次へ」ボタンをクリックします。
日本語で、WordPressの初期セットアップが進んでいきます。
ここでは、WordPressの初期セットアップの完了まで進めて、サイトの構築までを行いません。
Dockerネットワークの確認
Dockerネットワークを確認します。
・「docker network ls」コマンドを実行します。
PS C:\Users\joeac\Desktop\docker\wordpress3> docker network ls
NETWORK ID NAME DRIVER SCOPE
78a52a23e094 bridge bridge local
9cb62d828092 host host local
1bafb53e8f6c none null local
72af286b8e77 wordpress3_wpnetwork bridge local
NAME列に「wordpress3_wpnetwork」があります。「wordpress3」という文字列は、プロジェクト名を表しており、「wpnetwork」が存在することが確認できます。
・「docker network inspect wordpress3_wpnetwork」コマンドを実行します。
PS C:\Users\joeac\Desktop\docker\wordpress3> docker network inspect wordpress3_wpnetwork
[
{
"Name": "wordpress3_wpnetwork",
"Id": "72af286b8e771cdec3d711d4bc3f825c695e840b8a8bdb144a9b71061e6fec8b",
"Created": "2024-04-13T06:12:04.461530199Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.20.0.0/16",
"Gateway": "172.20.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0943e1dddf1d2d08d040f682fe33f96bfe595eff32e771cc1cba1db7881d91af": {
"Name": "wordpress3-wpdb-1",
"EndpointID": "38c9d85b51d5666e5d40cf1af357e5bd01fe71a66e4c55bbe13eef51e215fea4",
"MacAddress": "02:42:ac:14:00:02",
"IPv4Address": "172.20.0.2/16",
"IPv6Address": ""
},
"1abb8e1f0557cdbcf5e1b8bc6f5766541bc819ecf78ec6ba126f530e818a7ff7": {
"Name": "wordpress3-wordpress-1",
"EndpointID": "0434298000b68291a9f0f05900bda0e4cd4a33e4b70f322ce426ae2399f46aed",
"MacAddress": "02:42:ac:14:00:03",
"IPv4Address": "172.20.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "wpnetwork",
"com.docker.compose.project": "wordpress3",
"com.docker.compose.version": "2.24.6"
}
}
]
PS C:\Users\joeac\Desktop\docker\wordpress3>
下図の赤枠に注目します。
WordPressコンテナとMriaDBコンテナが「wpnetwork」に接続されており、それぞれのMACアドレスとIPアドレスを確認することができます。
ポート番号の紐づけの確認
・「docker container ls」コマンドを実行します。
PS C:\Users\joeac\Desktop\docker\wordpress3> docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1abb8e1f0557 wordpress:6.5 "docker-entrypoint.s…" 28 minutes ago Up 28 minutes 0.0.0.0:8080->80/tcp wordpress3-wordpress-1
0943e1dddf1d mariadb:10.8 "docker-entrypoint.s…" 28 minutes ago Up 28 minutes 3306/tcp wordpress3-wpdb-1
下図の赤枠に注目します。
WordPressコンテナがホストのポート番号8080とコンテナのポート番号80を紐づけていること、MariaDBコンテナがポート番号3306を使用していることが確認できます。