如何在Docker容器内部连接主机上的服务?

15

我有一个Docker守护程序在主机上启动,监听一些IP地址和端口,例如10.10.10.10和端口1234,然后我通过调用以下命令启动容器:

sudo docker -H 10.10.10.10:1234 centos /bin/bash

同时,我在主机上运行一个Web服务,端口为8080。然而,在容器内部,我无法连接到该服务器。我尝试过:

curl http://10.10.10.10:8080

但是收到了错误消息:

curl: (7) couldn't connect to host

但是我可以在其他机器上访问该服务器,例如http://10.10.10.11:8080。似乎 Docker 容器不能访问其所在的主机服务?有没有什么办法解决这个问题?谢谢。


1
请见https://dev59.com/N14c5IYBdhLWcg3wx8pU#27564532。 - Bryan
2个回答

7

这个问题在问题1143中讨论过,可能有一天会有一个--link-host选项。

同时,博客文章“在容器内部访问Docker主机服务器”列出了一些选项:

  • 网关方法:netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'
  • IP方法:boot2docker IP地址为192.168.59.103。

虽然目前没有办法内省主机的IP地址,但你可以通过环境变量传递它:

docker@boot2docker:~$  docker run -i -t -e DOCKER_HOST=192.168.59.103 ubuntu /bin/bash
root@07561b0607f4:/# env
HOSTNAME=07561b0607f4
DOCKER_HOST=192.168.59.103

在主机上,您可以在 "网络配置" 中使用名为 docker0 的虚拟接口来选择其他选项。


0
八年过去了,对于这个问题已经有了一个得到广泛支持的解决方案。
根据Docker官方文档的说明:
echo "hello from host!" > ./hello
python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
docker run \
  --add-host host.docker.internal:host-gateway \
  curlimages/curl -s host.docker.internal:8000/hello
hello from host!

一个回答另一个问题的答案展示了如何在Docker Compose中完成相同的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接