如何将docker容器绑定到特定的外部接口

问题描述 投票:0回答:3

我有两个网络接口,

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
3个回答
57
投票

这是 docker 文档中的内容

https://docs.docker.com/v17.09/engine/userguide/networking/default_network/binding/

如果你想限制更多,只允许容器服务 通过主机上的特定外部接口进行联系 机器,你有两个选择。当您调用 docker run 时,您可以使用

-p IP:host_port:container_port
-p IP::port
指定 一种特定绑定的外部接口。 或者,如果您始终希望 Docker 端口转发绑定到一个特定的 IP 地址,您可以编辑系统范围的 Docker 服务器 设置并添加选项
--ip=IP_ADDRESS
。记得重启你的 编辑此设置后的 Docker 服务器。


7
投票

将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

0
投票

我花了一段时间才让它工作,所以我在这里发布完整的解决方案。 将传出流量从 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

© www.soinside.com 2019 - 2024. All rights reserved.