docker - 无法连接到 Docker 服务
问题描述
我在 MAC 机器上运行 Docker 映像,当我登录到容器时,我看到 IP 地址为“172.17.0.2”(cat /etc/hosts)。
docker是如何选择IP的?
Docker 是否有任何 IP 范围可供选择?
如果我在同一主机上运行多个容器怎么办?会有所不同吗?
/etc/resolve.conf 提供了一些 IP。该 IP 是什么,它从哪里获得?
如何使用内部 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>
解决方案
Docker 自己管理所有这些内部网络机制。这包括从私有范围分配 IP(v4) 地址、用于出站连接的 NAT 设置以及允许容器相互通信的 DNS 服务。
一个稳定、合理的设置是:
- 运行
docker network create mynet
一次,创建一个非默认网络。(Docker Compose 会自动为你做这件事。) - 使用
--net mynet
. - 当容器需要相互通信时,它们可以使用其他容器的
--name
作为 DNS 名称(您可以连接到http://other-container-name
)。 - 如果您需要从其他地方访问容器,请使用
docker run -p
Docker 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
容器(使用dig
或nslookup
用于 DNS 调试,curl
用于实际的 HTTP 请求)。
推荐阅读
- docker - 在运行 docker 的多台裸机机器上时 KSQLDB 集群失败
- reactjs - 如何将填充颜色传递给 recharts Pie 组件
- linux - 使用 Cron 和 Pgrep 重新启动服务会产生许多 pgrep 进程
- java - 获取目录java中的资源
- firebase - 如何使 gcloud firestore 导入/导出递归?
- c - 缓冲区溢出工作。但是当我添加一个语句时,我得到了分段错误
- elasticsearch - 在 Spring Data Elasticsearch 中创建模式
- pandas - 为什么索引只有一个行标签的数据框不起作用?
- python - Maya - 聆听动画曲线的变化
- java - 并非所有语句都添加到 Esper 运行时 V8.5