首页 > 解决方案 > 无法连接到 Docker 服务

问题描述

我在 MAC 机器上运行 Docker 映像,当我登录到容器时,我看到 IP 地址为“172.17.0.2”(cat /etc/hosts)。

  1. docker是如何选择IP的?

  2. Docker 是否有任何 IP 范围可供选择?

  3. 如果我在同一主机上运行多个容器怎么办?会有所不同吗?

  4. /etc/resolve.conf 提供了一些 IP。该 IP 是什么,它从哪里获得?

  5. 如何使用内部 IP 连接到 Docker 服务,比如 172.17.0.2

ping CONTAINER_ID -> 返回 IP 172.17.0.2

它如何解析主机名?

我尝试通过网络阅读,但没有帮助。

另外,我在端口 8443 上运行我的服务。但我仍然无法连接。

我试过跑步,

docker run -net host -p 8443:8443 图像

仍然没有运气。

也尝试了以下方法。

docker run -p MY_MACHINE_IP:8080:8080 图像

试过了,

http://MY_MACHINE_IP:8080

http://localhost:8080

以上都不起作用。

ifconfig 输出,

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
    options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
    inet 127.0.0.1 netmask 0xff000000 
    inet6 ::1 prefixlen 128 
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
    nd6 options=201<PERFORMNUD,DAD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
XHC20: flags=0<> mtu 0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 60:f8:1d:b2:cb:0c 
    inet6 fe80::49d:a511:dc4e:7960%en0 prefixlen 64 secured scopeid 0x5 
    inet 10.231.168.63 netmask 0xffe00000 broadcast 10.255.255.255
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active
p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304
    ether 02:f8:1d:b2:cb:0c 
    media: autoselect
    status: inactive
awdl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1484
    ether 0a:71:96:61:e4:eb 
    inet6 fe80::871:96ff:fe61:e4eb%awdl0 prefixlen 64 scopeid 0x7 
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active
en1: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 72:00:07:57:48:30 
    media: autoselect <full-duplex>
    status: inactive
en2: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 72:00:07:57:48:31 
    media: autoselect <full-duplex>
    status: inactive
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=63<RXCSUM,TXCSUM,TSO4,TSO6>
    ether 72:00:07:57:48:30 
    Configuration:
        id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
        maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
        root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
        ipfilter disabled flags 0x2
    member: en1 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 8 priority 0 path cost 0
    member: en2 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 9 priority 0 path cost 0
    nd6 options=201<PERFORMNUD,DAD>
    media: <unknown type>
    status: inactive
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 2000
    inet6 fe80::3f17:8946:c18d:5d25%utun0 prefixlen 64 scopeid 0xb 
    nd6 options=201<PERFORMNUD,DAD>
utun2: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1380
    inet6 fe80::20aa:76fd:d68:7fb2%utun2 prefixlen 64 scopeid 0xd 
    nd6 options=201<PERFORMNUD,DAD>
utun3: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1380
    inet6 fe80::e42a:c616:4960:2c43%utun3 prefixlen 64 scopeid 0x10 
    nd6 options=201<PERFORMNUD,DAD>
utun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1342
    inet 17...... --> 17.... netmask 0xff000000 
    inet6 fe80::93df:7780:862c:8a06%utun1 prefixlen 64 scopeid 0x12 
    nd6 options=201<PERFORMNUD,DAD>

标签: dockerdocker-for-mac

解决方案


Docker 自己管理所有这些内部网络机制。这包括从私有范围分配 IP(v4) 地址、用于出站连接的 NAT 设置以及允许容器相互通信的 DNS 服务。

一个稳定、合理的设置是:

  • 运行docker network create mynet一次,创建一个非默认网络。(Docker Compose 会自动为你做这件事。)
  • 使用--net mynet.
  • 当容器需要相互通信时,它们可以使用其他容器的--name作为 DNS 名称(您可以连接到http://other-container-name)。
  • 如果您需要从其他地方访问容器,请使用docker run -pDocker Composeports:部分发布其服务端口。可以使用主机的 DNS 名称或 IP 地址以及发布的端口来访问它。
  • 永远不要(直接)使用容器专用 IP 地址。
  • localhost除非您完全确定它的含义,否则切勿使用。(这是从运行容器的主机上运行的浏览器访问已发布端口的正确方法;这几乎绝对不是您在容器内的意思。)

我在容器私有 IP 地址上看到的问题往往是在您第二次使用它们时出现的:因为您重新启动了容器并且 IP 地址发生了变化;因为它从您的本地主机工作,现在您想从其他地方访问它。

简要回答您最初的问题: (1-2) Docker 从可配置但通常默认为 172.17.0.0/16 的网络自行分配它们;(3)不同的容器有不同的私有IP地址;(4-5) Docker提供自己的DNS服务并/etc/resolv.conf指向那里;(6) ICMP 连接性通常不会证明太多,并且您不需要ping容器(使用dignslookup用于 DNS 调试,curl用于实际的 HTTP 请求)。


推荐阅读