記事の背景:
LAN で Docker を使用するときに遭遇する最も一般的な混乱の 1 つは、ネットワークがネットワーク セグメント間でブロックされる場合があることです。その理由は、デフォルトで Docker によって生成されたゲートウェイが LAN セグメントと競合することがあるためです。たとえば、Docker が 172.16 ネットワーク セグメントのマシンにデプロイされ、その結果の docker0 ブリッジが 172.17 ネットワーク セグメントである場合、同じになります。ネットワーク セグメント内のマシン間に競合があります (つまり、172.17 ネットワーク セグメント内のマシンに ping を送信できません)。
(推奨チュートリアル: docker チュートリアル)
競合を避けるために、最初に思いつくのはゲートウェイを変更することです。例は次のとおりです( Centos を例に挙げます):
service docker stop # 删除docker防火墙过滤规则 iptables -t nat -F POSTROUTING # 删除docker默认网关配置 ip link set dev docker0 down ip addr del 172.17.0.1/16 dev docker0 # 增加新的docker网关配置 ip addr add 192.168.2.1/24 dev docker0 ip link set dev docker0 up # 检测是否配置成功,如果输出信息中有 192.168.5.1,则表明成功 ip addr show docker0 service docker start # 验证docker防火墙过滤规则
この変更後、信頼できるようになりますか?答えは「いいえ」です。docker の再起動後も docker0 が再構築され、行った変更が上書きされる可能性があるためです。これは、Docker の IP ルールがハードコーディングされており、自由に変更することはできないことを示しています。しかし、考え方を変えて docker0 を直接強制終了し、新しいブリッジを再構築しましょう:
まず、ブリッジ作成ツール brctl をインストールする必要があります:
sudo yum install -y bridge-utils
作成操作を開始します:
# 1.停止 Docker 服务 service docker stop # 2.创建新的网桥(新的网段) brctl addbr bridge0 ip addr add 192.168.2.1/24 dev bridge0 ip link set dev bridge0 up # 3.确认网桥信息 ip addr show bridge0 # 4.修改配置文件 /etc/docker/daemon.json(如不存在则创建一个 touch daemon.json),使Docker启动时使用自定义网桥 { "bridge": "bridge0" } # 5.重启 Docker service docker start # 确认 NAT 网络路由 iptables -t nat -L -n # 6.删除不再使用的网桥 ip link set dev docker0 down brctl delbr docker0 iptables -t nat -F POSTROUTING
ステップ 4 で行った変更された設定に関しては、新しいネットワーク ブリッジを参照するためのものですが、実際には、docker 設定ファイルで新しいネットワーク ブリッジを参照することもできます:
echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/sysconfig/docker sudo service docker start
しかし、それは、新しいネットワーク ブリッジを参照することを意味するものではありません。 docker のカスタム設定ファイルは確実に見れますが、default/docker や sysconfig/docker がない場合はさらに面倒になりますが、解決策は次のとおりです:
$ vi /lib/systemd/system/docker.service #添加一行 $ EnvironmentFile=-/etc/default/docker 或者 $ EnvironmentFile=-/etc/sysconfig/docker #-代表ignore error #并修改 $ ExecStart=/usr/bin/docker daemon -H fd:// #改成 $ ExecStart=/usr/bin/docker daemon -H fd:// $DOCKER_OPTS #这样才能使用/etc/default/docker里定义的DOCKER_OPTS参数 $ systemctl daemon-reload 重载 $ sudo service docker restart
Bridge0 の作成が完了したらdocker0 から Bridge0 に移行すると、表示したくない 172.17 ネットワーク セグメント:
それが存在しない限り、ルーティングして確認できます。そうすると、172.17 ネットワーク セグメント内のマシンに接続されるだけではなくなります。まだある場合は、クリアされるまで ip addr del 172.17.0.1/16 dev docker0 を使用します (新しい docker ブリッジが確立されているため、古いものを削除しても docker の使用には影響しません)。
マシンの再起動後に brctl によって作成されたネットワーク ブリッジが失われる可能性がある場合は、次のコマンドを Linux 自己起動スクリプトに記述し、再起動するたびに実行できます。セルフスタート スクリプトは、/etc/rc.local ファイルに実行可能ステートメント (sh /opt/script.sh & など) を追加することで追加できます。このようにすると、基本的にマシンが再起動されるたびに、bridge0 が確実に作成され、docker サービスが正常に開始できるようになります。
さらに: IP ネットワーク セグメントの競合を解決したいだけで、上記の複雑なプロセスを実行したくない場合は、実際にはコンテンツ "bip" を追加して /etc/docker/daemon.json を変更するだけです。 : 「ip/ netmask」で docker0 ブリッジのネットワーク セグメントを次のように変更します:
brctl addbr bridge0 ip addr add 192.168.2.1/24 dev bridge0 ip link set dev bridge0 up
以上がDockerのデフォルトゲートウェイを変更するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。