我有两个网络接口,
eth0
和eth1
,
如何将所有 docker 容器绑定到
eth1
,并让所有网络流量通过 eth1
进出
谢谢~
我尝试用 133.130.60.36 绑定到
eth1
。
但我仍然没有运气,我仍然得到 eth0 IP 作为容器中的公共 IP。网络流量不是通过 eth1 出去
➜ ~ docker run -d --name Peach_1 -p 133.130.60.36::9998 -ti sample/ubuntu-vnc-selenium-firefox
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eb28f0d1c337 sample/ubuntu-vnc-selenium-firefox "/opt/bin/run_sele_s 4 minutes ago Up 4 minutes 5901/tcp, 133.130.60.36:32768->9998/tcp Peach_1
➜ ~ docker exec -ti Peach_1 zsh
➜ / curl ipecho.net/plain ; echo
133.130.101.114
这是 docker 文档中的内容
https://docs.docker.com/v17.09/engine/userguide/networking/default_network/binding/
如果你想限制更多,只允许容器服务 通过主机上的特定外部接口进行联系 机器,你有两个选择。当您调用 docker run 时,您可以使用
或-p IP:host_port:container_port
指定 一种特定绑定的外部接口。 或者,如果您始终希望 Docker 端口转发绑定到一个特定的 IP 地址,您可以编辑系统范围的 Docker 服务器 设置并添加选项-p IP::port
。记得重启你的 编辑此设置后的 Docker 服务器。--ip=IP_ADDRESS
将IP放入
-p
仅适用于到达服务器的流量,对于离开服务器的流量,您可以为每个容器分配静态本地IP,然后更改iptables
或snat
中的源IP。这是 iptables 规则示例:
iptables -t nat -I POSTROUTING -p all -s 172.20.128.2 ! -d 172.20.128.2 -j SNAT --to-source YourInterfaceIP
我花了一段时间才让它工作,所以我在这里发布完整的解决方案。 将传出流量从 Docker 容器路由到特定外部 IP 的解决方案是使用 iptables(如 haj_baba 提议):
iptables -t nat -I POSTROUTING -p all -s 172.20.128.2! -d 172.20.128.2 -j SNAT --to-source YourInterfaceIP
但这将被忽略,除非你停用伪装 如果您想为每个容器拥有特定的外部 IP,您可以设置一个静态 IP,如下所示(docker-compose 示例):
yourservice:
...
networks:
your-network:
ipv4_address: 172.20.0.100
networks:
your-network:
driver: bridge
driver_opts:
com.docker.network.bridge.enable_ip_masquerade: 'false'
ipam:
config:
- subnet: 172.20.0.0/24
然后就可以给静态ip绑定一些外部ip了
iptables -t nat -I POSTROUTING -p all -s 172.20.0.100! -d 172.20.0.100 -j SNAT --to-source YourInterfaceIP