如何解决在 docker 容器内无法访问 kubectl port-forward
鉴于有一个 pod(例如 postgres)在 Kubernetes 中运行,kubectl port-forward pod 15432:5432
用于将 pod 暴露给主机。
通常情况下,可以通过运行postgres客户端:psql -h 127.0.0.1 -p 15432
,或通过访问http://127.0.0.1:15432
,或直接建立TCP连接:echo > /dev/tcp/127.0.0.1/15432 && echo yes
在主机中访问它。如果连接建立成功,kubectl 会提示一条消息 Handling connection for 15432
进行验证。
但是,无论是否使用了 127.0.0.1
标志,都无法在容器内使用 172.17.0.1
/ --network=host
访问端口转发的 pod。它只能通过 host.docker.internal
这可能是 docker for mac 独有的问题。我还没有在linux上验证过。
这是我在 docker 中运行连接测试时的日志。很明显,TCP连接无法建立。
$ docker run --network=host -it --rm postgres:12.4 /bin/bash
# inside container
# unsuccessful for establishing TCP connection to 127.0.0.1:15432
root@docker-desktop:/# echo > /dev/tcp/127.0.0.1/15432 && echo yes
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/15432: Connection refused
# unsuccessful for establishing TCP connection to 172.17.0.1:15432
[root@docker-desktop /]# echo > /dev/tcp/172.17.0.1/15432 && echo yes
bash: connect: Connection refused
bash: /dev/tcp/172.17.0.1/15432: Connection refused
# no surprise: unsuccessful for psql 127.0.0.1
root@docker-desktop:/# psql -h 127.0.0.1 -p 15432
psql: error: Could not connect to server: Could not connect to server: Connection refused
Is the server running on host "127.0.0.1" and accepting
TCP/IP connections on port 15432?
# successful for host.docker.internal
root@docker-desktop:/# psql -h host.docker.internal -p 15432
Password for user root:
以下是一些可能有用的 nslookup/ifconfig 日志:
Server: 192.168.65.1
Address: 192.168.65.1#53
Non-authoritative answer:
Name: host.docker.internal
Address: 192.168.65.2
bash-5.0# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP broADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:984 (984.0 B) TX bytes:202 (202.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:1 errors:0 dropped:0 overruns:0 frame:0
TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:29 (29.0 B) TX bytes:29 (29.0 B)
为什么 docker 容器和主机之间的连接性存在差异? host.docker.internal 如何解决底层问题?是否有其他方法可以通过提供 docker run 标志来解决问题?
解决方法
在 Mac 或 Windows 上使用 Docker 时,将使用虚拟机来运行您的容器。
即使使用 --net=host
,容器也不会直接在您的桌面上运行,而是在 VM 上运行。因此,127.0.0.1 是 VM IP,而不是主机 IP。如你所说,你可以在Mac/Windows 上使用host.docker.internal
来获取真机的IP。
在 Linux 上,容器在没有虚拟机的情况下运行,因此直接在真实主机上运行。
您可能想调查网真是否可以以更通用和更强大的方式解决您的用例:https://www.telepresence.io/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。