我正在尝试使用docker网络,而我似乎无法找到实现以下目标的方法:
在主机中启动一个简单的netcat服务器:
nc -l -p 5555
然后从在 docker容器中与此服务器通信,例如
# grab the docker network interface ip
hostip=$(ip route | awk '/docker0/ { print $NF }')
# pass in the docker network interface as a host and try a curl command
docker run --add-host=docker:"${hostip}" --rm -it hiromasaono/curl curl docker:5555
curl请求只是挂起,主机netcat服务器没有收到请求。
如果我使用--net=host
选项启动docker,它可以正常工作:
docker run --net=host --rm -it hiromasaono/curl curl 127.0.0.1:5555
并且netcat服务器接收
GET / HTTP/1.1
User-Agent: curl/7.35.0
Host: 127.0.0.1:5555
Accept: */*
如何在不使用--net=host
(默认为--net=bridge
)的情况下从docker容器内与简单主机netcat服务器进行通信?
(fyi:我正在运行docker server / client 1.11.2)
Potentailly相关资源我研究过以寻找答案:
答案 0 :(得分:0)
为了解决这个问题,您需要了解一些事项。
netcat -l -p 5555
后如果在另一个终端中运行netstat -a -l -n | grep 5555
,您应该会看到0.0.0.0:5555
或*:5555
。如果您看到127.0.0.1:5555
,那么它将无法工作,您需要先解决此问题,然后再查看Docker。docker
主机,并且无法解析为127.0.0.1
。试试docker run --net=host --rm -it hiromasaono/curl ping docker
。如果您看到它正在ping 127.0.0.1
,那么您的配置是错误的,您需要修复此行:hostip=$(ip route | awk '/docker0/ { print $NF }')
。如果它不是127.0.0.1但ping没有成功,那么您的网络设置错误或者hostip错误。答案 1 :(得分:0)
据我了解,基于两条评论[1] [2],以下非官方黑客似乎对我有用(截至今日)(2016.10.27):
在需要连接到Docker主机的应用的Dockerfile
中,我添加了以下几行:
...
# netstat
RUN apt-get update && apt-get install net-tools -y
...
CMD (netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2" dockerhost"}' >> /etc/hosts) && \
...old CMD line...
...
这似乎使得Docker主机可以从容器中以dockerhost
的形式对我提供。
请注意未来的读者:另请参阅https://github.com/docker/docker/issues/23177 - 截至撰写时,此问题仍未解决,因此未来某些时候可能成为正式的非零机会并取代任何变通办法;虽然它可能也会像其各个前辈那样被关闭和解雇。