背景
Docker コンテナ・ネットワークの理解(👇公式サイト)
https://docs.docker.jp/engine/userguide/networking/dockernetworks.html
公式サイトの説明はあるものの、自分の理解で簡単にまとめてみます。
1. Dockerネットワークとは
Dockerネットワークは、Dockerコンテナ間やコンテナとホストOS間のネットワーク接続を管理するための仕組みです。
2. Dockerネットワークの常用コマンド
Dockerネットワークを操作するためのコマンドは、以下のようになります。
[root@localhost myflie]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
①docker network connect:指定されたコンテナをDockerネットワークに接続するためのコマンドです。
例えば、既存の nginx コンテナを my-network という名前のDockerネットワークに接続する場合は、以下のように実行します。
⇒docker network connect my-network nginx
②docker network create:新しいDockerネットワークを作成するためのコマンドです。
③docker network disconnect:指定されたコンテナをDockerネットワークから切断するためのコマンドです。
④docker network inspect:指定されたDockerネットワークの詳細情報を表示するためのコマンドです。
⑤docker network ls:現在作成されているDockerネットワークの一覧を表示するためのコマンドです。
これらのコマンドを使用することで、Dockerネットワークを作成・管理することができます。
3. Dockerネットワークは何ができますか
Dockerネットワークを使用することで、以下のようなことができます。
3-1. 容器間の相互通信とポートマッピング
Dockerでは、複数のコンテナを同じ仮想ネットワーク内に配置し、それらのコンテナ間で通信することができます。これにより、マイクロサービスアーキテクチャなどの複雑なアプリケーションを構築する際に、各コンテナが必要な機能を担当することができます。また、コンテナごとに異なるポート番号を割り当てることで、各コンテナに直接アクセスできるようになります。
3-2. 容器のIPアドレスの変更に影響を受けない(サービス名によるネットワーク通信だから)
Dockerでは、コンテナのIPアドレスが変更されることがあります。しかし、Docker内部では、各コンテナに一意のサービス名が付与されます。このため、コンテナのIPアドレスが変更されても、サービス名を使用することで他のコンテナとのネットワーク通信を維持することができます。これにより、コンテナの移動や再起動などが発生しても、他のコンテナとの通信に影響を受けずにアプリケーションを実行することができます。これは便利ですね!(^^)
4. Dockerネットワークの種類
Dockerには、以下の3つのネットワークタイプがあります。
[root@localhost myflie]# docker network ls
NETWORK ID NAME DRIVER SCOPE
90f98361e6f9 bridge bridge local
84f80231780e host host local
ca51e547a48d none null local
[root@localhost myflie]#
ネットワークタイプ(driver) | 説明 |
---|---|
ブリッジ(bridge) | docker0という仮想ブリッジに接続、デフォルトモード。Dockerデーモンが自動的にコンテナにIPアドレスを割り当て、各コンテナを識別できるようにします。また、Dockerコンテナのネットワークは、外部から見えないため、セキュリティ上のリスクを減らすことができます。 |
ホスト(host) | DockerコンテナがホストOSのネットワークスタックに直接接続することができるネットワークです。コンテナはホストOSと同じIPアドレスを持ち、ポートをバインドする必要がありません。高速なネットワーク通信が必要な場合に使用されます。 |
none(null) | noneネットワークは、Dockerコンテナがネットワークに接続されていない状態を表します。一時的にネットワークから隔離したい場合に使用されます |
5. デモ
実際の使用から、理解を深めます。
5-1. ブリッジネットワークの新規
⇒ デフォルトタイプはブリッジです
[root@localhost myflie]# docker network create lnmp
00d581caf44823b566e25dcb4da7e26b67e1f7066216affc87c9e964018e2c73
[root@localhost myflie]#
[root@localhost myflie]# docker network ls
NETWORK ID NAME DRIVER SCOPE
90f98361e6f9 bridge bridge local
84f80231780e host host local
00d581caf448 lnmp bridge local //新規したネットワーク
ca51e547a48d none null local
[root@localhost myflie]#
5-2. ブリッジネットワークの使用
次は「Linux+nginx+php」というLNP環境を構築する際、
新規した「lnmp」というネットワークを使って、コンテナ同士の通信を実現します。
ヒント:まさに、実践で「Dockerネットワークは何ができますか」に回答します。^ ^
①. 作業ディレクトリを準備
[root@localhost /]# mkdir -p /work/{www,/nginx/conf.d}
[root@localhost /]# mkdir -p /work/mysql/{data,conf.d}
②. nginxのconfigファイルを準備
⇒ fastcgi_pass php-fpm:9000; (ブリッジネットワークを使うため、ここはIPアドレスを意識しなくても良い)
vim /work/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
location ~ \.php(.*)$ {
root /var/www/html; # php コンテナのワークディレクトリ
fastcgi_pass php-fpm:9000; # ブリッジネットワークを使うため、ここは固定のIPアドレスを記入することなく、相手先のサービス名(コンテナ名)で良い。
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
③. phpコンテナを起動(–net lnmpでブリッジネットワークを指定)
docker run -p 9000:9000 --name php-fpm \
-v /work/www:/var/www/html \
--net lnmp \
-d php:7.1-fpm
④. nginxコンテナを起動(–net lnmpでブリッジネットワークを指定)
docker run -p 80:80 --name nginx \
-v /work/www:/usr/share/nginx/html \
-v /work/nginx/conf.d:/etc/nginx/conf.d \
--net lnmp \
-e TZ=Asia/Tokyo \
--privileged=true \
-d nginx
⇒ nginxコンテナのネットワークを確認
[root@localhost /]# docker inspect nginx | tail -22
"Networks": {
"lnmp": {
"Gateway": "172.19.0.1",
"IPAddress": "172.19.0.3",
"IPPrefixLen": 16,
"MacAddress": "02:42:ac:13:00:02",
"DriverOpts": null
⑤疎通確認
- テストケースを用意
echo "<?php phpinfo(); ?>" > /work/www/info.php
- テスト結果
⇒ 疎通確認OK
5-3. ブリッジネットワークを使用しない場合
👇ページをご参照ください
https://www.mina-isho.com/s/2303112221
コメント欄