Docker ネットワークの原理とカスタム ネットワークの詳細な分析

Docker ネットワークの原理とカスタム ネットワークの詳細な分析

Docker はホストマシン上のブリッジを仮想化します。コンテナを作成して起動すると、各コンテナにはデフォルトでブリッジのネットワークセグメントと一致する IP アドレスが割り当てられます。ブリッジはコンテナのゲートウェイとして機能します。ブリッジは各コンテナに接続され、コンテナはブリッジを介して通信できます。ブリッジは仮想化されているため、外部ネットワークをアドレス指定することはできません。つまり、デフォルトでは外部ネットワークからコンテナにアクセスすることはできません。コンテナの作成および起動時にホストポートをコンテナポートにマッピングし、ホスト IP ポートを介してコンテナにアクセスする必要があります。これは Docker のデフォルト ネットワークです。欠点の 1 つは、コンテナーが IP 経由でしか相互にアクセスできないことです。コンテナー名またはコンテナー ID を使用して相互にアクセスする場合は、コンテナーの作成時および起動時に、link を使用して hosts ファイルを変更する必要があります。一般的には、カスタムネットワークを使用します。カスタムネットワークは、ネットワークを使用して作成します。カスタムネットワークを作成する場合は、サブネットセグメントやゲートウェイなどの情報を指定できます。コンテナを作成して起動するときに、使用するネットワークを指定します。このように、カスタム ネットワーク内のすべてのコンテナは、コンテナ名を使用して直接アクセスできます。コンテナが他のネットワークのコンテナにアクセスしたい場合は、コンテナと対象ネットワークのコンテナがコンテナ名を使用して通信できるようにネットワークに設定することもできます。

1 デフォルトネットワーク docker0

vm 仮想マシンでテストしましたが、docker は起動しません。システムには 2 つのネットワークがあります (ループバック ネットワークと仮想マシン ネットワーク)

dockerサービスが起動すると、ホストにはdockerのデフォルトネットワークであるdocker0という追加のネットワークが設定されます。

# docker サービスを開始します [root@localhost ~]# systemctl start docker

Tomcat コンテナを起動すると、ホストに追加のネットワークがあることがわかります。

Tomcatを起動する
[root@localhost ~]# docker run -d -P --name tomcat1 tomcat

別のTomcatを起動すると、ホストマシンに別のネットワークが追加されます。

# Tomcatを起動する
[root@localhost ~]# docker run -d -P --name tomcat2 tomcat

2つのTomcatネットワークIPが接続されていることをテストする

# tomcatのIPアドレスを表示します [root@localhost ~]# docker exec -it tomcat2 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 状態 UNKNOWN グループのデフォルト qlen 1000
    リンク/ループバック 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 スコープ ホスト lo
       valid_lft 永久 preferred_lft 永久
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 状態 UP グループ デフォルト
    リンク/イーサ 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 スコープ グローバル eth0
       valid_lft 永久 preferred_lft 永久
# tomcat1からtomcat2のIPアドレスをpingする
[root@localhost ~]# docker exec -it tomcat1 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) バイトのデータ。
172.17.0.3 からの 64 バイト: icmp_seq=1 ttl=64 time=0.146 ms
172.17.0.3 からの 64 バイト: icmp_seq=2 ttl=64 time=0.067 ms
172.17.0.3 からの 64 バイト: icmp_seq=3 ttl=64 time=0.088 ms
^C
--- 172.17.0.3 ping 統計 ---
送信パケット 3 個、受信パケット 3 個、パケット損失 0%、時間 5 ミリ秒
rtt 最小/平均/最大/平均偏差 = 0.067/0.100/0.146/0.034 ミリ秒

tomcat1のtomcat2のコンテナ名をpingすると失敗する

# tomcat1 内の tomcat2 のコンテナ名を ping する [root@localhost ~]# docker exec -it tomcat1 ping tomcat2
^C[root@localhost ~]#

tomcat1 を停止し、tomcat を再作成して起動します。link を使用して、最下層の tomcat1 の hosts ファイルを変更し、コンテナー名を IP ドメイン名として実現して、tomcat1 が tomcat2 に一方向に ping できるようにします。

# tomcat1 を削除
[root@localhost ~]# docker rm -f tomcat1
トムキャット1
 
# ヘルプドキュメントリンクの使用法を表示 run [root@localhost ~]# docker run --help
 
使用方法: docker run [オプション] イメージ [コマンド] [引数...]
 
新しいコンテナでコマンドを実行する
 
オプション:
      --add-host list カスタムホストと IP のマッピングを追加します (host:ip)
  -a, --attach list STDIN、STDOUT、またはSTDERRにアタッチする
      --blkio-weight uint16 ブロック IO (相対重み)、10 から 1000 まで、または無効にする場合は 0 (デフォルト 0)
      --blkio-weight-device list ブロック IO 重み (相対デバイス重み) (デフォルト [])
      --cap-add list Linux の機能を追加する
      --cap-drop list Linux の機能を削除する
      --cgroup-parent string コンテナのオプションの親 cgroup
      --cgroupns 文字列 使用する Cgroup 名前空間 (ホスト|プライベート)
                                       'host': Dockerホストのcgroup名前空間でコンテナを実行します
                                       'private': コンテナを独自のプライベート cgroup 名前空間で実行します
                                       '': 設定されたcgroup名前空間を使用する
                                                  デーモンの default-cgroupns-mode オプション (デフォルト)
      --cidfile string コンテナIDをファイルに書き込む
      --cpu-period int CPU CFS (Completely Fair Scheduler) 期間を制限する
      --cpu-quota int CPU CFS (Completely Fair Scheduler) クォータを制限する
      --cpu-rt-period int CPU のリアルタイム期間をマイクロ秒単位で制限します
      --cpu-rt-runtime int CPU のリアルタイム実行時間をマイクロ秒単位で制限します
  -c, --cpu-shares int CPU シェア (相対的な重み)
      --cpus 小数点 CPU の数
      --cpuset-cpus 文字列 実行を許可する CPU (0-3, 0,1)
      --cpuset-mems 文字列 実行を許可するMEM(0-3、0、1)
  -d, --detach コンテナをバックグラウンドで実行し、コンテナ ID を出力します。
      --detach-keys string コンテナをデタッチするためのキーシーケンスを上書きする
      --device list コンテナにホストデバイスを追加する
      --device-cgroup-rule list cgroupの許可されたデバイスリストにルールを追加します
      --device-read-bps list デバイスからの読み取り速度(バイト/秒)を制限します(デフォルトは [])
      --device-read-iops list デバイスからの読み取り速度 (IO/秒) を制限します (デフォルト [])
      --device-write-bps list デバイスへの書き込み速度(バイト/秒)を制限します(デフォルトは[])
      --device-write-iops list デバイスへの書き込み速度 (IO/秒) を制限します (デフォルト [])
      --disable-content-trust イメージ検証をスキップする(デフォルトは true)
      --dns list カスタムDNSサーバーを設定する
      --dns-option list DNSオプションを設定する
      --dns-search list カスタムDNS検索ドメインを設定する
      --domainname 文字列 コンテナ NIS ドメイン名
      --entrypoint string イメージのデフォルトのENTRYPOINTを上書きします
  -e, --env list 環境変数を設定する
      --env-file list 環境変数のファイルを読み込む
      --expose list ポートまたはポート範囲を公開する
      --gpus gpu-request コンテナに追加する GPU デバイス (すべての GPU を渡すには 'all')
      --group-add list 参加するグループを追加する
      --health-cmd string ヘルスチェックを実行するコマンド
      --health-interval 期間 チェックを実行する間隔 (ms|s|m|h) (デフォルト 0s)
      --health-retries int 不健康を報告するために必要な連続失敗回数
      --health-start-period 期間 ヘルス再試行カウントダウンを開始する前にコンテナを初期化する期間の開始
                                       (ms|s|m|h) (デフォルト 0s)
      --health-timeout 期間 1 回のチェックの実行を許可する最大時間 (ms|s|m|h) (デフォルトは 0 秒)
      --help 使用方法を表示する
  -h, --hostname 文字列 コンテナのホスト名
      --init コンテナ内でシグナルを転送し、プロセスを取得するinitを実行します。
  -i, --interactive 接続されていない場合でも STDIN を開いたままにする
      --ip 文字列 IPv4 アドレス (例: 172.30.100.104)
      --ip6 文字列 IPv6 アドレス (例: 2001:db8::33)
      --ipc 文字列 使用する IPC モード
      --isolation 文字列 コンテナ分離テクノロジー
      --kernel-memory バイト カーネルメモリ制限
  -l, --label list コンテナのメタデータを設定する
      --label-file list 行区切りのラベルファイルを読み込む
      --link list 別のコンテナへのリンクを追加する
      --link-local-ip コンテナの IPv4/IPv6 リンクローカルアドレスをリストする
      --log-driver string コンテナのログドライバ
      --log-opt ログドライバのオプションを一覧表示する
      --mac-address 文字列 コンテナの MAC アドレス (例: 92:d0:c6:0a:29:33)
  -m, --memory バイト メモリ制限
      --memory-reservation バイト メモリソフト制限
      --memory-swap bytes スワップ制限はメモリとスワップの合計です。無制限のスワップを有効にするには '-1' を指定します。
      --memory-swappiness int コンテナのメモリ swappiness を調整します (0 ~ 100) (デフォルト -1)
      --mount mount コンテナにファイルシステムマウントをアタッチする
      --name string コンテナに名前を割り当てる
      --network ネットワーク コンテナをネットワークに接続する
      --network-alias list コンテナのネットワークスコープエイリアスを追加します
      --no-healthcheck コンテナ指定のHEALTHCHECKを無効にする
      --oom-kill-disable OOMキラーを無効にする
      --oom-score-adj int ホストの OOM 設定を調整します (-1000 ~ 1000)
      --pid 文字列 使用するPID名前空間
      --pids-limit int コンテナの pid 制限を調整します (無制限の場合は -1 に設定)
      --platform string サーバーがマルチプラットフォーム対応の場合、プラットフォームを設定します
      --privileged このコンテナに拡張権限を与える
  -p, --publish list コンテナのポートをホストに公開する
  -P, --publish-all 公開されているすべてのポートをランダムなポートに公開する
      --pull 文字列 実行前にイメージをプルします ("always"|"missing"|"never") (デフォルトは "missing")
      --read-only コンテナのルートファイルシステムを読み取り専用としてマウントします
      --restart string コンテナ終了時に適用する再起動ポリシー(デフォルトは「no」)
      --rm 終了時にコンテナを自動的に削除する
      --runtime string このコンテナで使用するランタイム
      --security-opt セキュリティオプションを一覧表示する
      --shm-size バイト /dev/shm のサイズ
      --sig-proxy プロセスに受信したシグナルをプロキシします (デフォルトは true)
      --stop-signal string コンテナを停止するシグナル(デフォルトは「SIGTERM」)
      --stop-timeout int コンテナを停止するまでのタイムアウト(秒単位)
      --storage-opt コンテナのストレージドライバオプションを一覧表示します
      --sysctl map Sysctlオプション(デフォルトmap[])
      --tmpfs list tmpfsディレクトリをマウントする
  -t, --tty 疑似TTYを割り当てる
      --ulimit ulimit Ulimitオプション(デフォルト[])
  -u, --user 文字列 ユーザー名またはUID (形式: <name|uid>[:<group|gid>])
      --userns string 使用するユーザー名前空間
      --uts 文字列 使用する UTS 名前空間
  -v, --volume list ボリュームをバインドマウントする
      --volume-driver string コンテナのオプションのボリュームドライバ
      --volumes-from list 指定されたコンテナからボリュームをマウントします
  -w, --workdir string コンテナ内の作業ディレクトリ
 
# tomcat1 リンクを起動してアクセスするコンテナ名を指定します [root@localhost ~]# docker run -d -P --name tomcat1 --link tomcat2 tomcat
f78c51961662a1d3558fc8d0d95906b902a7a042f251a60858e72bcfa62e7a08
 
# テストping
[root@localhost ~]# docker exec -it tomcat1 ping tomcat2
PING tomcat2 (172.17.0.3) 56(84) バイトのデータ。
tomcat2 (172.17.0.3) からの 64 バイト: icmp_seq=1 ttl=64 time=0.088 ms
tomcat2 (172.17.0.3) からの 64 バイト: icmp_seq=2 ttl=64 time=0.071 ms
tomcat2 (172.17.0.3) からの 64 バイト: icmp_seq=3 ttl=64 time=0.071 ms
^C
--- tomcat2 ping 統計 ---
送信パケット 3 個、受信パケット 3 個、パケット損失 0%、時間 1000 ミリ秒
rtt 最小/平均/最大/平均偏差 = 0.071/0.076/0.088/0.012 ミリ秒
 
# tomcat1 のホストが tomcat2 のドメイン名 [root@localhost ~] に追加されたことを確認します。# docker exec -it tomcat1 cat /etc/hosts
127.0.0.1 ローカルホスト
::1 ローカルホスト ip6-ローカルホスト ip6-ループバック
fe00::0 ip6-ローカルネット
ff00::0 ip6-mcastプレフィックス
ff02::1 ip6-全ノード
ff02::2 ip6-オールルーター
172.17.0.3 トムキャット2 27766c324de6
172.17.0.2 f78c51961662
 
# tomcat2 は tomcat1 に ping できません
[root@localhost ~]# docker exec -it tomcat2 ping tomcat1
^C[root@localhost ~]#

2 カスタムネットワーク

ネットワークコマンドを使用する必要がある

# ヘルプドキュメントを表示 [root@localhost ~]# docker network --help
 
使用方法: docker network コマンド
 
ネットワークを管理する
 
コマンド:
  コンテナをネットワークに接続する
  作成 ネットワークを作成する
  コンテナをネットワークから切断する
  検査 1つまたは複数のネットワークの詳細情報を表示する
  ls ネットワークを一覧表示する
  未使用のネットワークをすべて削除する
  rm 1つまたは複数のネットワークを削除します
 
コマンドの詳細については、「docker network COMMAND --help」を実行してください。

現在のDockerネットワークブリッジをデフォルトネットワークdocker0としてリストします。

[root@localhost ~]# docker ネットワーク ls
ネットワーク ID 名前 ドライバー スコープ
9b27ff0926bf ブリッジ ブリッジ ローカル
8dfa2efae677 ホスト ホスト ローカル
2025b7fb1d7c なし null ローカル

ネットワークmynetを作成する

[root@localhost ~]# docker ネットワーク作成 --help
 
使用方法: docker network create [OPTIONS] NETWORK
 
ネットワークを作成する
 
オプション:
      --attachable コンテナの手動アタッチメントを有効にする
      --aux-address map ネットワークドライバが使用する補助 IPv4 または IPv6 アドレス (デフォルト map[])
      --config-from 文字列 設定をコピーするネットワーク
      --config-only 設定のみのネットワークを作成する
  -d, --driver 文字列 ネットワークを管理するドライバー (デフォルトは「ブリッジ」)
      --gateway 文字列 マスターサブネットの IPv4 または IPv6 ゲートウェイ
      --ingress スウォームルーティングメッシュネットワークを作成する
      --internal ネットワークへの外部アクセスを制限する
      --ip-range strings サブ範囲からコンテナのIPを割り当てる
      --ipam-driver 文字列 IP アドレス管理ドライバー (デフォルトは "default")
      --ipam-opt map IPAM ドライバー固有のオプションを設定します (デフォルト map[])
      --ipv6 IPv6ネットワークを有効にする
      --label list ネットワーク上のメタデータを設定する
  -o, --opt map ドライバー固有のオプションを設定する (デフォルト map[])
      --scope string ネットワークのスコープを制御する
      --subnet 文字列 ネットワークセグメントを表す CIDR 形式のサブネット
[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
1abaa8e6a387bc8bbc7ac50d9f2289e96a143a92f074e90f698bd70411c86672
[root@localhost ~]# docker ネットワーク検査 mynet
[
    {
        「名前」: 「mynet」、
        「ID」: 「1abaa8e6a387bc8bbc7ac50d9f2289e96a143a92f074e90f698bd70411c86672」、
        「作成日」: 「2021-05-13T11:21:13.494039122+08:00」、
        「スコープ」:「ローカル」、
        「ドライバー」:「ブリッジ」、
        「IPv6を有効にする」:false、
        「IPAM」: {
            "ドライバー": "デフォルト",
            「オプション」: {},
            「設定」: [
                {
                    「サブネット」: 「192.168.0.0/16」、
                    「ゲートウェイ」: 「192.168.0.1」
                }
            ]
        },
        「内部」:偽、
        「接続可能」: false、
        「イングレス」:偽、
        "設定元": {
            「ネットワーク」: 「」
        },
        "ConfigOnly": false、
        「コンテナ」: {},
        「オプション」: {},
        「ラベル」: {}
    }
]

mynet を使用して 2 つの Tomcat を作成して起動すると、コンテナ名を介して直接相互に ping を実行できるようになります。

[root@localhost ~]# docker run --help
 
使用方法: docker run [オプション] イメージ [コマンド] [引数...]
 
新しいコンテナでコマンドを実行する
 
オプション:
      --add-host list カスタムホストと IP のマッピングを追加します (host:ip)
  -a, --attach list STDIN、STDOUT、またはSTDERRにアタッチする
      --blkio-weight uint16 ブロック IO (相対重み)、10 から 1000 まで、または無効にする場合は 0 (デフォルト 0)
      --blkio-weight-device list ブロック IO 重み (相対デバイス重み) (デフォルト [])
      --cap-add list Linux の機能を追加する
      --cap-drop list Linux の機能を削除する
      --cgroup-parent string コンテナのオプションの親 cgroup
      --cgroupns 文字列 使用する Cgroup 名前空間 (ホスト|プライベート)
                                       'host': Dockerホストのcgroup名前空間でコンテナを実行します
                                       'private': コンテナを独自のプライベート cgroup 名前空間で実行します
                                       '': 設定されたcgroup名前空間を使用する
                                                  デーモンの default-cgroupns-mode オプション (デフォルト)
      --cidfile string コンテナIDをファイルに書き込む
      --cpu-period int CPU CFS (Completely Fair Scheduler) 期間を制限する
      --cpu-quota int CPU CFS (Completely Fair Scheduler) クォータを制限する
      --cpu-rt-period int CPU のリアルタイム期間をマイクロ秒単位で制限します
      --cpu-rt-runtime int CPU のリアルタイム実行時間をマイクロ秒単位で制限します
  -c, --cpu-shares int CPU シェア (相対的な重み)
      --cpus 小数点 CPU の数
      --cpuset-cpus 文字列 実行を許可する CPU (0-3, 0,1)
      --cpuset-mems 文字列 実行を許可するMEM(0-3、0、1)
  -d, --detach コンテナをバックグラウンドで実行し、コンテナ ID を出力します。
      --detach-keys string コンテナをデタッチするためのキーシーケンスを上書きする
      --device list コンテナにホストデバイスを追加する
      --device-cgroup-rule list cgroupの許可されたデバイスリストにルールを追加します
      --device-read-bps list デバイスからの読み取り速度(バイト/秒)を制限します(デフォルトは [])
      --device-read-iops list デバイスからの読み取り速度 (IO/秒) を制限します (デフォルト [])
      --device-write-bps list デバイスへの書き込み速度(バイト/秒)を制限します(デフォルトは[])
      --device-write-iops list デバイスへの書き込み速度 (IO/秒) を制限します (デフォルト [])
      --disable-content-trust イメージ検証をスキップする(デフォルトは true)
      --dns list カスタムDNSサーバーを設定する
      --dns-option list DNSオプションを設定する
      --dns-search list カスタムDNS検索ドメインを設定する
      --domainname 文字列 コンテナ NIS ドメイン名
      --entrypoint string イメージのデフォルトのENTRYPOINTを上書きします
  -e, --env list 環境変数を設定する
      --env-file list 環境変数のファイルを読み込む
      --expose list ポートまたはポート範囲を公開する
      --gpus gpu-request コンテナに追加する GPU デバイス (すべての GPU を渡すには 'all')
      --group-add list 参加するグループを追加する
      --health-cmd string ヘルスチェックを実行するコマンド
      --health-interval 期間 チェックを実行する間隔 (ms|s|m|h) (デフォルト 0s)
      --health-retries int 不健康を報告するために必要な連続失敗回数
      --health-start-period 期間 ヘルス再試行カウントダウンを開始する前にコンテナを初期化する期間の開始
                                       (ms|s|m|h) (デフォルト 0s)
      --health-timeout 期間 1 回のチェックの実行を許可する最大時間 (ms|s|m|h) (デフォルトは 0 秒)
      --help 使用方法を表示する
  -h, --hostname 文字列 コンテナのホスト名
      --init コンテナ内でシグナルを転送し、プロセスを取得するinitを実行します。
  -i, --interactive 接続されていない場合でも STDIN を開いたままにする
      --ip 文字列 IPv4 アドレス (例: 172.30.100.104)
      --ip6 文字列 IPv6 アドレス (例: 2001:db8::33)
      --ipc 文字列 使用する IPC モード
      --isolation 文字列 コンテナ分離テクノロジー
      --kernel-memory バイト カーネルメモリ制限
  -l, --label list コンテナのメタデータを設定する
      --label-file list 行区切りのラベルファイルを読み込む
      --link list 別のコンテナへのリンクを追加する
      --link-local-ip コンテナの IPv4/IPv6 リンクローカルアドレスをリストする
      --log-driver string コンテナのログドライバ
      --log-opt ログドライバのオプションを一覧表示する
      --mac-address 文字列 コンテナの MAC アドレス (例: 92:d0:c6:0a:29:33)
  -m, --memory バイト メモリ制限
      --memory-reservation バイト メモリソフト制限
      --memory-swap bytes スワップ制限はメモリとスワップの合計です。無制限のスワップを有効にするには '-1' を指定します。
      --memory-swappiness int コンテナのメモリ swappiness を調整します (0 ~ 100) (デフォルト -1)
      --mount mount コンテナにファイルシステムマウントをアタッチする
      --name string コンテナに名前を割り当てる
      --network ネットワーク コンテナをネットワークに接続する
      --network-alias list コンテナのネットワークスコープエイリアスを追加します
      --no-healthcheck コンテナ指定のHEALTHCHECKを無効にする
      --oom-kill-disable OOMキラーを無効にする
      --oom-score-adj int ホストの OOM 設定を調整します (-1000 ~ 1000)
      --pid 文字列 使用するPID名前空間
      --pids-limit int コンテナの pid 制限を調整します (無制限の場合は -1 に設定)
      --platform string サーバーがマルチプラットフォーム対応の場合、プラットフォームを設定します
      --privileged このコンテナに拡張権限を与える
  -p, --publish list コンテナのポートをホストに公開する
  -P, --publish-all 公開されているすべてのポートをランダムなポートに公開する
      --pull 文字列 実行前にイメージをプルします ("always"|"missing"|"never") (デフォルトは "missing")
      --read-only コンテナのルートファイルシステムを読み取り専用としてマウントします
      --restart string コンテナ終了時に適用する再起動ポリシー(デフォルトは「no」)
      --rm コンテナ終了時に自動的に削除する
      --runtime string このコンテナで使用するランタイム
      --security-opt セキュリティオプションを一覧表示する
      --shm-size バイト /dev/shm のサイズ
      --sig-proxy プロセスに受信したシグナルをプロキシします (デフォルトは true)
      --stop-signal string コンテナを停止するシグナル(デフォルトは「SIGTERM」)
      --stop-timeout int コンテナを停止するまでのタイムアウト(秒単位)
      --storage-opt コンテナのストレージドライバオプションを一覧表示します
      --sysctl map Sysctlオプション(デフォルトmap[])
      --tmpfs list tmpfsディレクトリをマウントする
  -t, --tty 疑似TTYを割り当てる
      --ulimit ulimit Ulimitオプション(デフォルト[])
  -u, --user 文字列 ユーザー名またはUID (形式: <name|uid>[:<group|gid>])
      --userns string 使用するユーザー名前空間
      --uts 文字列 使用する UTS 名前空間
  -v, --volume list ボリュームをバインドマウントする
      --volume-driver string コンテナのオプションのボリュームドライバ
      --volumes-from list 指定されたコンテナからボリュームをマウントします
  -w, --workdir string コンテナ内の作業ディレクトリ
[root@localhost ~]# docker run -d -P --name tomcat-n-1 --network mynet tomcat
404e4e63622b207af2ed534e768996f4d1cba4c798bba9e5d9b33c42711eaa4a
[root@localhost ~]# docker run -d -P --name tomcat-n-2 --network mynet tomcat
f6352fb3db01beed6ddf17ef84999a4ab209f026a6137b3bc7e35335d434785f
[root@localhost ~]# docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
f6352fb3db01 tomcat "catalina.sh run" 3 秒前 2 秒前に起動 0.0.0.0:49159->8080/tcp, :::49159->8080/tcp tomcat-n-2
404e4e63622b tomcat "catalina.sh run" 10 秒前 9 秒前に起動 0.0.0.0:49158->8080/tcp, :::49158->8080/tcp tomcat-n-1
f78c51961662 tomcat "catalina.sh run" 15 分前 15 分前に起動 0.0.0.0:49157->8080/tcp, :::49157->8080/tcp tomcat1
27766c324de6 tomcat "catalina.sh run" 16 分前 16 分前にアップ 0.0.0.0:49156->8080/tcp, :::49156->8080/tcp tomcat2
[root@localhost ~]# docker exec -it tomcat-n-1 ping tomcat-n-2
PING tomcat-n-2 (192.168.0.3) 56(84)バイトのデータ。
tomcat-n-2.mynet (192.168.0.3) からの 64 バイト: icmp_seq=1 ttl=64 time=0.102 ms
tomcat-n-2.mynet (192.168.0.3) からの 64 バイト: icmp_seq=2 ttl=64 time=0.069 ms
tomcat-n-2.mynet (192.168.0.3) からの 64 バイト: icmp_seq=3 ttl=64 time=0.164 ms
^C
--- tomcat-n-2 ping 統計 ---
送信パケット 3 個、受信パケット 3 個、パケット損失 0%、時間 3 ミリ秒
rtt 最小/平均/最大/平均偏差 = 0.069/0.111/0.164/0.041 ミリ秒

起動した2つのTomcatコンテナのネットワーク情報を含む、mynetネットワークの詳細情報を表示します。

[root@localhost ~]# docker ネットワーク検査 mynet
[
    {
        「名前」: 「mynet」、
        「ID」: 「1abaa8e6a387bc8bbc7ac50d9f2289e96a143a92f074e90f698bd70411c86672」、
        「作成日」: 「2021-05-13T11:21:13.494039122+08:00」、
        「スコープ」:「ローカル」、
        「ドライバー」:「ブリッジ」、
        「IPv6を有効にする」:false、
        「IPAM」: {
            "ドライバー": "デフォルト",
            「オプション」: {},
            「設定」: [
                {
                    「サブネット」: 「192.168.0.0/16」、
                    「ゲートウェイ」: 「192.168.0.1」
                }
            ]
        },
        「内部」:偽、
        「接続可能」: false、
        「イングレス」:偽、
        "設定元": {
            「ネットワーク」: 「」
        },
        "ConfigOnly": false、
        「コンテナ」: {
            "404e4e63622b207af2ed534e768996f4d1cba4c798bba9e5d9b33c42711eaa4a": {
                "名前": "tomcat-n-1",
                "エンドポイントID": "b9efbd78daabe9345ade2a2e55291b7646d01679516e2f0be1efd5c2d6fea6b8",
                "Macアドレス": "02:42:c0:a8:00:02",
                "IPv4アドレス": "192.168.0.2/16",
                "IPv6アドレス": ""
            },
            "f6352fb3db01beed6ddf17ef84999a4ab209f026a6137b3bc7e35335d434785f": {
                "名前": "tomcat-n-2",
                "エンドポイントID": "6b05a1ceff43514305bf3d0adf9e30ba8007db5ec8349d47f96ff2b216912fc0",
                "Macアドレス": "02:42:c0:a8:00:03",
                "IPv4アドレス": "192.168.0.3/16",
                "IPv6アドレス": ""
            }
        },
        「オプション」: {},
        「ラベル」: {}
    }
]

デフォルトのネットワークdocker0を使用してtomcat3を起動します。

[root@localhost ~]# docker run -d -P --name tomcat3 tomcat
90e94ac30a3c61b493d2ea38c32cf5dddb781e88c30547b609db765b15d7d1e0
[root@localhost ~]# docker ネットワーク ls
ネットワーク ID 名前 ドライバー スコープ
9b27ff0926bf ブリッジ ブリッジ ローカル
8dfa2efae677 ホスト ホスト ローカル
1abaa8e6a387 マイネットブリッジローカル
2025b7fb1d7c なし null ローカル
 
# docker0 の詳細情報を表示する tomcat3 はデフォルトのネットワーク [root@localhost ~] に表示されます # docker network inspect 9b27ff0926bf
[
    {
        「名前」: 「ブリッジ」、
        「ID」: 「9b27ff0926bf22d0828ccd07d6e14eb17d96a4989f9def6f9118c099cf1ca1c6」、
        「作成日」: 「2021-05-13T10:51:20.244232273+08:00」、
        「スコープ」:「ローカル」、
        「ドライバー」:「ブリッジ」、
        「IPv6を有効にする」:false、
        「IPAM」: {
            "ドライバー": "デフォルト",
            「オプション」: null、
            「設定」: [
                {
                    「サブネット」: 「172.17.0.0/16」、
                    「ゲートウェイ」: 「172.17.0.1」
                }
            ]
        },
        「内部」:偽、
        「接続可能」: false、
        「イングレス」:偽、
        "設定元": {
            「ネットワーク」: 「」
        },
        "ConfigOnly": false、
        「コンテナ」: {
            "27766c324de619b24e2ed522d8064c5a4610c8f509ff0aed8fa1719691f01bf1": {
                "名前": "tomcat2",
                "エンドポイントID": "de913778ce2d7478e25daca26809aa75c9093c43853d9420c70886fb16741722",
                "Macアドレス": "02:42:ac:11:00:03",
                "IPv4アドレス": "172.17.0.3/16",
                "IPv6アドレス": ""
            },
            "90e94ac30a3c61b493d2ea38c32cf5dddb781e88c30547b609db765b15d7d1e0": {
                "名前": "tomcat3",
                "エンドポイントID": "2223e522a0950b846bb7691b31f60bbd88ab3c9b8e71d601a495cce39387b8cc",
                "Macアドレス": "02:42:ac:11:00:04",
                "IPv4アドレス": "172.17.0.4/16",
                "IPv6アドレス": ""
            },
            "f78c51961662a1d3558fc8d0d95906b902a7a042f251a60858e72bcfa62e7a08": {
                "名前": "tomcat1",
                "エンドポイントID": "59299fdca5497e55dc5a94e408529cc98819b673568720c81aa1c554dff1bbe5",
                "Macアドレス": "02:42:ac:11:00:02",
                "IPv4アドレス": "172.17.0.2/16",
                "IPv6アドレス": ""
            }
        },
        「オプション」: {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        「ラベル」: {}
    }
]

tomcat3 と mynet は同じネットワークにないため、tomcat3 は mynet ネットワーク内の 2 つの tomcat にアクセスできません。ネットワークを使用して tomcat3 と mynetwork を接続し、双方向の相互アクセス (コンテナー名のサポート) を実現できます。

# mynetネットワーク内のコンテナのIPアドレスを表示する
[root@localhost ~]# docker ネットワーク検査 mynet
[
    {
        「名前」: 「mynet」、
        「ID」: 「1abaa8e6a387bc8bbc7ac50d9f2289e96a143a92f074e90f698bd70411c86672」、
        「作成日」: 「2021-05-13T11:21:13.494039122+08:00」、
        「スコープ」:「ローカル」、
        「ドライバー」:「ブリッジ」、
        「IPv6を有効にする」:false、
        「IPAM」: {
            "ドライバー": "デフォルト",
            「オプション」: {},
            「設定」: [
                {
                    「サブネット」: 「192.168.0.0/16」、
                    「ゲートウェイ」: 「192.168.0.1」
                }
            ]
        },
        「内部」:偽、
        「接続可能」: false、
        「イングレス」:偽、
        "設定元": {
            「ネットワーク」: 「」
        },
        "ConfigOnly": false、
        「コンテナ」: {
            "404e4e63622b207af2ed534e768996f4d1cba4c798bba9e5d9b33c42711eaa4a": {
                "名前": "tomcat-n-1",
                "エンドポイントID": "b9efbd78daabe9345ade2a2e55291b7646d01679516e2f0be1efd5c2d6fea6b8",
                "Macアドレス": "02:42:c0:a8:00:02",
                "IPv4アドレス": "192.168.0.2/16",
                "IPv6アドレス": ""
            },
            "f6352fb3db01beed6ddf17ef84999a4ab209f026a6137b3bc7e35335d434785f": {
                "名前": "tomcat-n-2",
                "エンドポイントID": "6b05a1ceff43514305bf3d0adf9e30ba8007db5ec8349d47f96ff2b216912fc0",
                "Macアドレス": "02:42:c0:a8:00:03",
                "IPv4アドレス": "192.168.0.3/16",
                "IPv6アドレス": ""
            }
        },
        「オプション」: {},
        「ラベル」: {}
    }
]
 
# tomcat3 ping ip が機能しない [root@localhost ~]# docker exec -it tomcat3 ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) バイトのデータ。
^C
--- 192.168.0.2 ping 統計 ---
送信パケット 7 個、受信パケット 0 個、パケット損失 100%、時間 11 ミリ秒
 
[root@localhost ~]# docker exec -it tomcat3 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84)バイトのデータ。
^C
--- 192.168.0.3 ping 統計 ---
送信パケット 9 個、受信パケット 0 個、パケット損失 100%、時間 20 ミリ秒
# connect を使用してネットワークを別のネットワークのコンテナに接続すると、お互いのコンテナ名にアクセスできます [root@localhost ~]# docker network connect --help
 
使用方法: docker network connect [オプション] ネットワークコンテナ
 
コンテナをネットワークに接続する
 
オプション:
      --alias strings コンテナのネットワークスコープエイリアスを追加します
      --driver-opt 文字列 ネットワークのドライバーオプション
      --ip 文字列 IPv4 アドレス (例: 172.30.100.104)
      --ip6 文字列 IPv6 アドレス (例: 2001:db8::33)
      --link list 別のコンテナへのリンクを追加する
      --link-local-ip strings コンテナのリンクローカルアドレスを追加します
[root@localhost ~]# docker ネットワーク接続 mynet tomcat3
[root@localhost ~]# docker exec -it tomcat3 ping tomcat-n-1
PING tomcat-n-1 (192.168.0.2) 56(84)バイトのデータ。
tomcat-n-1.mynet (192.168.0.2) からの 64 バイト: icmp_seq=1 ttl=64 time=0.235 ms
tomcat-n-1.mynet (192.168.0.2) からの 64 バイト: icmp_seq=2 ttl=64 time=0.070 ms
tomcat-n-1.mynet (192.168.0.2) からの 64 バイト: icmp_seq=3 ttl=64 time=0.064 ms
^C
--- tomcat-n-1 ping 統計 ---
送信パケット 3 個、受信パケット 3 個、パケット損失 0%、時間 6 ミリ秒
rtt 最小/平均/最大/平均偏差 = 0.064/0.123/0.235/0.079 ミリ秒
[root@localhost ~]# docker exec -it tomcat-n-1 ping tomcat3
PING tomcat3 (192.168.0.4) 56(84) バイトのデータ。
tomcat3.mynet (192.168.0.4) からの 64 バイト: icmp_seq=1 ttl=64 time=0.055 ms
tomcat3.mynet (192.168.0.4) からの 64 バイト: icmp_seq=2 ttl=64 time=0.169 ms
tomcat3.mynet (192.168.0.4) からの 64 バイト: icmp_seq=3 ttl=64 time=0.194 ms
^C
--- tomcat3 ping 統計 ---
送信パケット 3 個、受信パケット 3 個、パケット損失 0%、時間 6 ミリ秒
rtt 最小/平均/最大/平均偏差 = 0.055/0.139/0.194/0.061 ミリ秒

上記は、Docker ネットワークの原則とカスタム ネットワークの詳細な分析の詳細な内容です。Docker ネットワークの原則の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Dockerネットワーク構成プロセスの詳細な紹介
  • Docker コンテナのカスタム ホストのネットワーク アクセス操作
  • Docker の 4 つのネットワーク タイプの主な例
  • Dockerカスタムネットワークの詳細な紹介

<<:  MySQL ページングクエリ最適化テクニック

>>:  JSにおける4つのデータ型判定方法

推薦する

Linux 面接で最もよく聞かれる 10 の質問のまとめ

序文Linux システムの運用および保守エンジニア職の面接を受ける場合は、次の 10 個の最も一般的...

nginxとIISで使用できるSSL証明書を作成する

目次SSL証明書の作成1. 秘密鍵を生成する2. 証明書要求ファイルを生成する3. CRT証明書ファ...

Javascriptの基本を詳しく説明

目次変数データ型拡張ポイント要約する変数基本的な構文 var age=10; //ageという変数を...

jQueryのコア機能とイベント処理の詳細な説明

目次イベントページの読み込みイベント委任イベントの切り替えイベント要約するイベントページの読み込み1...

JavaScript スタイル オブジェクトと CurrentStyle オブジェクトのケース スタディ

1. スタイルオブジェクトスタイル オブジェクトは単一のスタイル宣言を表し、スタイルが適用されている...

HTML ページにミュージック ビデオを追加する例

1. ビデオタグFirefoxでは自動再生をサポートしますが、GoogleとIEではサポートしません...

CentOS7 上で KVM 仮想化プラットフォームを構築する (3 つの方法)

KVM はカーネルベースの仮想マシンの略で、Linux をハイパーバイザーに変換する Linux ...

Vueでeslintを使用する方法の詳細な説明

目次1. 説明2. 関連する依存パッケージをダウンロードする3. 設定ファイル .eslintrc....

ウェブデザインとは何か

<br />元の記事: http://www.alistapart.com/articl...

純粋な CSS3 でペットの鶏のサンプルコードを実現

最近、CSS3に関する知識や記事をたくさん読んできましたが、CSS3はとても便利に使えると思います。...

vue3.0 のウォッチ リスナーの例の詳細な説明

目次序文リスナーと計算プロパティの違いvue3 で watch を使用するにはどうすればいいですか?...

Linux ファイアウォール設定の詳細な手順 (yum ウェアハウス設定に基づく)

序文この実験では、デバッグ用に2つの仮想マシン(CentOs6とRed Hat 6)を準備します。 ...

Django+vue 登録とログインのサンプルコード

登録するフロントエンドは、vue の axios を使用して値を渡し、取得したアカウントとパスワード...

MAC で MySQL の初期パスワードを変更する方法

問題の説明: Macを購入し、初めてMySQLをインストールしました。初期パスワードが分かりません。...

WebデザイナーがRetinaディスプレイデバイス向けの画像を作成する方法

特記事項:この記事は、Chris Spooner の英語記事「Web デザイン用の Retina グ...