banner
云野阁

云野阁

闲云野鹤,八方逍遥

Dockerコンテナのホスト間通信を実現する

[TOC]

方案一:docker swarm クラスター#

https://blog.csdn.net/AMCUL/article/details/132913280

方案二:直接ルーティング法#

デプロイガイドで言及されている方法は、固定ネットワークセグメント、ルーティングの永続化、IP 転送の 3 つの部分で構成されています。

方法 1:#

docker0 のデフォルトネットワークセグメントを変更して固定する#
  1. docker0 ネットワークセグメントの IP を変更します。ホストの /etc/docker/daemon.json ファイルに以下の内容を追加します:
# daemon.jsonファイルを開く
vi /etc/docker/daemon.json

# ホスト1に追加する内容
# 172.16.200.1 はホスト1のdockerネットワークIP
{
 "bip": "172.16.200.1/24"
}

# ホスト2に追加する内容
# 172.16.210.1 はホスト2のdockerネットワークIP
{
 "bip": "172.16.210.1/24"
}

# dockerサービスを再起動
systemctl restart docker 
  1. ルーティングルールを追加し、ホスト間で相互に追加します。
# ホスト1でルーティングルールを追加(ホスト2のIPとネットワークセグメントを追加)
ip route add 172.16.210.0/24 via 172.20.1.52

# ホスト2でルーティングルールを追加(ホスト1のIPとネットワークセグメントを追加)
ip route add 172.16.200.0/24 via 172.20.1.51

# 方法一:
# ルーティング転送を有効にする
iptables -P FORWARD ACCEPT

# 方法二:
# iptablesルールを設定する(ローカルネットワークセグメント)
# ホスト1
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 172.16.200.0/24 ! -d 172.16.0.0/16 -j MASQUERADE

# ホスト2
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 172.16.210.0/24 ! -d 172.16.0.0/16 -j MASQUERADE
  1. コンテナを起動してテストします。
# ホスト1でubuntuコンテナを起動
docker run -it --name node1 ubuntu:latest /bin/bash

# ホスト2でubuntuコンテナを起動
docker run -it --name node2 ubuntu:latest /bin/bash

# テストツールをインストール
apt-get update
# pingツールをインストール
apt-get install inetutils-ping -y
# IP確認ツールをインストール
apt-get install net-tools -y
ルーティングの永続化(ホスト再起動時のルーティング消失を防ぐ)#
方法一:(推奨)

/etc/sysconfig/network-scripts/ディレクトリにroute-enp0s3(enp0s3 はホストのネットワークインターフェース名で、実際のものに基づく)という名前のファイルを作成します。

この方法を推奨します。作成時にroute-の後にローカルホストのネットワークインターフェース名を付けることに注意してください。

vi /etc/sysconfig/network-scripts/route-enp0s3

# このファイルに以下の形式の内容を追加
# ホスト1に追加
172.16.230.0/24 via 172.20.1.52
# ホスト2に追加
172.16.220.0/24 via 172.20.1.51

# ネットワークを再起動して確認
service network restart

# ルーティングテーブルに先ほど追加したルートがあるか確認
ip route show | column -t
方法二:

/etc/sysconfig/static-routesファイルに以下の内容を追加します(static-routes がない場合は手動で作成)。

# ホスト1に追加
any net 172.16.230.0/24 via 172.20.1.52
# ホスト2に追加
any net 172.16.220.0/24 via 172.20.1.51

# ネットワークサービスを再起動
systemctl restart network

# ルーティングテーブルに先ほど追加したルートがあるか確認
ip route show | column -t
IP 転送を有効にする#
# 永続的に有効にする
vi /etc/sysctl.conf
# 修正
net.ipv4.ip_forward=1

方法 2:(固定 IP を使用するコンテナに適用)#

docker ネットワークを作成#
  1. docker ブリッジタイプのネットワークを作成します。

それぞれのサーバーで、名前が test のネットワークを作成し、サブネット範囲を 172.16.220.0/24、172.16.230.0/24 に指定します。

# ホスト1
docker network create test --driver bridge --ipam-driver default --subnet 172.16.220.0/24

# ホスト2
docker network create test --driver bridge --ipam-driver default --subnet 172.16.230.0/24
# ネットワークを確認
docker network ls
  1. 静的ルーティングを設定します。
# ホスト1でルーティングルールを追加(ホスト2のIPとネットワークセグメントを追加)
ip route add 172.16.230.0/24 via 172.20.1.52

# ホスト2でルーティングルールを追加(ホスト1のIPとネットワークセグメントを追加)
ip route add 172.16.220.0/24 via 172.20.1.51

# ルーティング転送を有効にする
iptables -P FORWARD ACCEPT
  1. コンテナを起動してテストします。
# ホスト1でubuntuコンテナを起動(作成したブリッジネットワークを追加)
docker run -it --name node1 --net=test ubuntu:latest /bin/bash

# ホスト2でubuntuコンテナを起動(作成したブリッジネットワークを追加)
docker run -it --name node2 --net=test ubuntu:latest /bin/bash

# テストツールをインストール
apt-get update
# pingツールをインストール
apt-get install inetutils-ping -y
# IP確認ツールをインストール
apt-get install net-tools -y
ルーティングの永続化(ホスト再起動時のルーティング消失を防ぐ)#

nmtui グラフィカルインターフェースを使用して追加します。

 # nmtuiをダウンロード
 yum install net-tools -y
 # nmtuiグラフィカルインターフェースを表示
 nmtui

ホスト 1 のネットワークインターフェースにホスト 2 の docker ネットワークの IP セグメントと IP を設定し、ホスト 2 のネットワークインターフェースにホスト 1 の docker ネットワークの IP セグメントと IP を設定します。

# ホスト1に追加
172.16.230.0/24  172.20.1.52
# ホスト2に追加
172.16.220.0/24  172.20.1.51

設定が完了すると、/etc/sysconfig/network-scripts フォルダに以下のように表示されます。

image-20240323221412716-1711203257505-1

image-20240323221442754-1711203286475-3

新しく作成したネットワークインターフェースを起動します(ネットワーク再起動またはシステム再起動後は無効になります)。

# ホスト1
nmcli c up br-aed92de88760
# ホスト2
nmcli c up br-0ab3914edle2

新しいネットワークインターフェースを起動し続けるには、対応する新しく作成されたネットワークインターフェースファイルのONBOOT=noONBOOT=yesに変更する必要があります。

# ホスト1
vi ifcfg-br-aed92de88760
# ONBOOT=noをONBOOT=yesに変更
ONBOOT=yes
# ホスト2
vi ifcfg-br-0ab3914edle2
# ONBOOT=noをONBOOT=yesに変更
ONBOOT=yes

# ネットワークサービスを再起動
systemctl restart network

image-20240323221537519-1711203339288-5

IP 転送を有効にする#
# 永続的に有効にする
vi /etc/sysctl.conf
# 修正
net.ipv4.ip_forward=1

この時点で、コンテナはネットワーク再起動の影響を受けず、ホスト間通信を実現できます。

しかし、システム再起動後、作成した docker ネットワークとコンテナは無効になります。

再度 docker ネットワークとコンテナを作成する必要があり、その後 docker ネットワークとコンテナはシステム再起動やネットワーク再起動の影響を受けず、docker コンテナのホスト間通信を成功裏に実現します。

image-20240323221547069-1711203348713-7

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。