【问题标题】:Unable to access local network IP from docker container无法从 docker 容器访问本地网络 IP
【发布时间】:2016-12-15 16:19:18
【问题描述】:

在其上运行 macOS 和 docker ubuntu,我无法 ping 我本地网络的 IP 地址。下面是我的 docker 容器的网络配置。我可以 ping 主机的 IP 地址,但无法访问本地网络上的其他 IP 地址。

root# ping 172.17.101.192
PING 172.17.101.192 (172.17.101.192) 56(84) bytes of data.
From 172.17.0.3 icmp_seq=1 Destination Host Unreachable
From 172.17.0.3 icmp_seq=2 Destination Host Unreachable

root# ifconfig         
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:03
          inet addr:172.17.0.3  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link

是否有任何网络配置可以帮助我执行此操作?

我尝试过net=host,但没有帮助。

【问题讨论】:

  • 你使用的是哪个版本的 docker?
  • 1.13.0-rc4, build 88862e7
  • 您使用的是 docker-machine 还是 docker for mac (docs.docker.com/engine/installation/mac)?
  • 也许是一个愚蠢的问题,但是您确定您尝试 ping 的主机没有阻止您的 docker 主机而不是您的 mac 访问的防火墙规则吗?你能在办公室里 ping 你旁边的人吗?

标签: macos ubuntu networking docker


【解决方案1】:

我使用 docker for mac,问题是 docker 内部网络与我的本地网络寻址冲突。 要解决此问题,我需要转到 dokcer 菜单中的Preferences。 在 Preferences menu Daemon>Advanced Menu,我可以提供其他 bip。

{
    "bip" : "12.12.0.1/24"
}

单击应用并重新启动。下次 docker 将以 12.12.0.1/24 启动内部网络。

【讨论】:

    【解决方案2】:

    我认为 docker 内部网络可能与您的本地网络寻址冲突。

    尝试运行 Docker,将默认内部网络更改为不冲突的网络,如 172.31.0.0/24。添加到你的Docker启动选项--bip 172.31.0.1/24,可能位于/etc/default/docker

    # Use DOCKER_OPTS to modify the daemon startup options.
    DOCKER_OPTS="--bip 172.31.0.1/24"
    

    更新:虽然这在 Linux 中是正确的,但 Mac 的实现是不同的,请参阅文档 here,因此这取决于您是使用 Docker for Mac 还是 Linux。

    只是为了测试,尝试将您的笔记本电脑连接到不同的网络,192.168.0.0/16 范围内的任何网络都足够了。

    【讨论】:

      【解决方案3】:

      我猜你正在使用 docker-machine。

      您应该查看docker for mac,因为它有一些networking improvements 可能会为您工作。这是我正在使用的,我可以从 docker 访问我内部网络上的其他主机。

      【讨论】:

      • 不,我们正在使用 docker for Mac。您是否对容器进行了任何特殊的网络配置?
      • 没什么特别的。但我使用的是 stable 分支,并且(查看你拥有的版本)你在 beta 分支上。
      • (虽然我刚刚安装了 beta 分支,这也适用于我)
      【解决方案4】:

      我尝试了以下方法,它有效:

      mac-os $> ifconfig
      en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
          ether 78:31:c1:bd:4b:84 
          inet6 fe80::1425:a90d:9c00:ef53%en0 prefixlen 64 secured scopeid 0x4 
          inet 10.191.41.1 netmask 0xfffff800 broadcast 10.191.47.255
          nd6 options=201<PERFORMNUD,DAD>
          media: autoselect
          status: active
      

      所以我的 ip 是 10.191.41.1。然后我做:

      mac-os $> docker run -ti --rm ubuntu bash -c "apt-get update && apt-get install -y inetutils-ping && ping 10.191.41.1"
      

      它会安装“ping”命令,并尝试 ping 我的主机。我得到了正确的答案:

      [...]
      PING 10.191.41.1 (10.191.41.1): 56 data bytes
      64 bytes from 10.191.41.1: icmp_seq=0 ttl=37 time=0.303 ms
      64 bytes from 10.191.41.1: icmp_seq=1 ttl=37 time=0.536 ms
      [...]
      

      【讨论】:

      • 我可以 ping 我的 mac,但我无法访问本地网络上的服务器之一。 Docker 不会创建在 VM 上正常的桥接网络。所以,我想创建一个桥接网络,它可以从我的 mac 获得相同的访问权限。
      【解决方案5】:

      我想抛出这个答案,因为它在 Windows 上发生在我身上,但实际上可以在任何环境中。我在本地机器上使用桥接网络来开发我正在开发的服务并遇到类似问题,奇怪的是 ping 我们的生产物理服务器(以 10.10... IP 模式开始)或随机站点互联网我能够收到回复。但是位于 172.16... 模式上的物理开发服务器不起作用。

      最后,我通过在本地网络上执行 docker network inspect 发现,一个使用相同子网 172.16... 创建的网络与我的物理服务器 IP 地址范围重叠。因此,当我 ping 物理开发服务器时,它试图在虚拟 docker 网络上找到它,但它并不存在。

      删除该网络后(这是我没有使用的开发网络),一切正常。

      docker network rm {networkName}
      

      如果我必须保留网络,可以在 docker-compose 文件中更改子网。如果您需要更改有冲突的子网,链接在此处How do configure docker compose to use a given subnet if a variable is set, or choose for itself if it isn't? 这看起来像这样(如果你想要一个 12.12 子网):

      networks: 
        default:
          ipam:
            config:
              - subnet: 12.12.0.0/16
      

      【讨论】:

        猜你喜欢
        • 2017-11-08
        • 1970-01-01
        • 2021-04-07
        • 2020-12-17
        • 2018-12-09
        • 1970-01-01
        • 2022-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多