从Docker容器通信到Docker主机
我正在尝试与dockernetworking,我似乎无法find一种方法来完成以下内容:
在主机上启动一个简单的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
选项启动--net=host
,它可以工作:
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
)的情况下从--net=bridge
容器内与简单主机netcat服务器进行通信?
(fyi:我正在运行docker服务器/客户端1.11.2)
Potentailly我研究过的相关资源寻找答案:
- 文档如何从容器连接到docker主机(github问题)
- 如何从容器连接到Docker主机(github问题)
- 允许Docker容器连接到本地Postgres数据库
- Docker容器networking文档
据我了解,根据两条评论[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 – 截至撰写时,这个问题仍然是开放的,所以在将来某个时候有可能成为正式的取代任何解决方法; 尽pipe它也可能像其前辈一样被封闭和解散。
为了解决这个问题,你需要研究几件事情。
- Netcat必须监听所有接口(或者至less在Docker客户端可以连接的接口上)。 不在本地主机上。 运行
netcat -l -p 5555
如果在另一个terminal上运行netstat -a -l -n | grep 5555
netstat -a -l -n | grep 5555
你应该看到0.0.0.0:5555
或*:5555
。 如果您看到127.0.0.1:5555
那么它将无法正常工作,您需要在查看Docker之前先解决此问题。 - Docker必须能够ping
docker
主机,并且不能parsing为127.0.0.1
。 尝试docker run --net=host --rm -it hiromasaono/curl ping docker
。 如果你看到它正在ping127.0.0.1
那么你的configuration是错误的,你需要修复这一行:hostip=$(ip route | awk '/docker0/ { print $NF }')
。 如果它不是127.0.0.1,但ping不成功,那么你的networking设置是错误的或者hostip是错误的。
- docker – 组成networking/端口处理
- 无法在Docker中使用“umount”卸载设备
- 为什么Docker / Containers拥有自己的networking概念(CNM / CNI),而不是使用VMnetworking?
- 如何删除接口docker0
- 在不同的docker集装箱中无缝地托pipe网站的不同部分
- 用prometheus监控docker – cpu使用情况对于不同的容器看起来是一样的
- Docker运行时configuration文件
- level = fatal msg =“ipset failed:ipset v6.29:集合不能被销毁:内核组件正在使用\ n:退出状态1”
- 使用API获取的标签列表中的Artifactory API(curl)删除Artifactory泊坞窗图像