docker networkについて
基本的にdockerは1つのコンテナに1つのアプリを入れて管理する。
またPIDなどの名前空間が隔離され、お互いのプロセスが見えない状態で動作する。
1.コンテナのAPとDBを連結し名前空間を共有したい
2.特定のコンテナを隔離したい
上記のユースケースでdocker networkを使いコンテナを管理する。
前提
dockerインストール時にデフォルトで bridge、host、null のnetworkが作成される
C:\Users\user>docker network ls
NETWORK ID NAME DRIVER SCOPE
6e7d865297e5 bridge bridge local
7c2e65292aab host host local
a1c5b119af1e none null local
C:\Users\user>
標準の3つのネットワークモデル
- 「bridge」はLinuxのブリッジ機能を使うブリッジ・ネットワークで、コンテナ内からの通信はインターネット側にルーティングされます。
- 「host」はコンテナがホスト側のネットワーク・インターフェースを共有するものです。ネットワークが隔離しないため、コンテナ内でプログラムがポートをリッスンすると、そのままインターネット側と通信可能になるモードです。
- 「null」はコンテナにネットワーク・インターフェースを持たせない機能です。そのため、コンテナは内外の通信ができません。
参考:https://knowledge.sakura.ad.jp/23899/#Docker3
今回やること
networkを使用しない場合と使用する場合 の動作の差異を下記のnetwork構成で網羅的に検証します。
networkの作成
下記のコマンドでnetworkを作成する
docker network create nw1
docker network ls
でnetworkが作成された事を確認する
C:\Users\user>docker network ls
NETWORK ID NAME DRIVER SCOPE
6e7d865297e5 bridge bridge local
7c2e65292aab host host local
a1c5b119af1e none null local
170493b1a816 nw1 bridge local
C:\Users\user>
コンテナの起動
コンテナを起動する。docker1_nw1とdocker2_nw1はnw1のnetworkにて起動する。
本項でコンテナ内に入る必要はないので d オプションを使用しています。
※イメージは前回の記事で作ったイメージにpingを含めたdocker_nw
イメージを使用しています。
docker run --name docker1_nw1 --net nw1 -dit -p 8080:80 docker_nw
docker run --name docker2_nw1 --net nw1 -dit -p 8081:80 docker_nw
docker run --name docker3 -dit -p 8082:80 docker_nw
docker run --name docker4 -dit -p 8083:80 docker_nw
それぞれのNW内のコンテナのIPを確認
nw1内のコンテナのIPを確認
以下のコマンドでnw1内のコンテナのIPを確認する。
docker network inspect nw1
デフォルトのNW内のコンテナのIPを確認
以下のコマンドでデフォルトのNW(bridge)内のコンテナのIPを確認する。
docker network inspect bridge
疎通確認
docker4からの疎通確認
docker4のコンテナ内に入り疎通を確認します。
docker exec -it docker4 /bin/bash
ping ${docker1_nw1のIP}
ping ${docker2_nw1のIP}
ping ${docker3のIP}
ping docker1_nw1
ping docker2_nw1
ping docker3
docker1_nw1からの疎通確認
docker1_nw1のコンテナ内に入り疎通を確認します。
docker exec -it docker1_nw1 /bin/bash
ping ${docker2_nw1のIP}
ping ${docker3のIP}
ping ${docker4のIP}
ping docker2_nw1
ping docker3
ping docker4
networkの削除
nw1内のコンテナを全て削除した後に以下のコマンドでnw1を削除する
docker network rm nw1
削除されたことの確認
docker network ls
結論
bridge(デフォルト) × bridge(デフォルト) → IP疎通可能だか名前解決出来ない
bridge(デフォルト) × nw1(独自NW) → 疎通不可
nw1(独自NW) × nw1(独自NW) → IP疎通可能で名前解決も出来る
参考:https://docs.docker.jp/engine/userguide/networking/dockernetworks.html
コメント