loader image

[docker]networkを使いコンテナを管理する

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」はコンテナにネットワーク・インターフェースを持たせない機能です。そのため、コンテナは内外の通信ができません。
標準の3つのネットワークモデル

参考:https://knowledge.sakura.ad.jp/23899/#Docker3

今回やること

networkを使用しない場合と使用する場合 の動作の差異を下記の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_nw1docker2_nw1nw1の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

コメント

タイトルとURLをコピーしました