Dockercurl到同一主机中的其他容器

我有2个容器,第一个在端口80上运行,另一个在端口8022上运行,我尝试从容器运行8022端口到容器80端口,并得到一个空的响应。

对于端口8022上的容器,我运行这个命令:

docker run -d -it --privileged -p 0.0.0.0:8022:80 -v ~/path/to/my/app:/var/www/app --network=bridge --memory 1073741824 my/app:latest 

如果一个curl请求到其他主机forms的例子谷歌,我得到正确的答复。

感谢帮助

更新好了我可以解决这个问题,创build一个networking,并在这两个容器中使用此networking,然后我添加到8022容器的主机文件的端口80容器的IP。

感谢@ zero298的帮助!

这是如何在用户定义的桥接networking上进行容器间通信的一个非常简单的例子。 这里是我已经定义,使这成为可能的3个文件:

~/Desktop/code/bootstrap.sh

这将启动演示,首先创build一个用户定义的隔离networking,您的容器可以通过名为example_nw 。 然后创build一个名为“servertest”的新容器,它将容纳我们将要curl的服务器。 我正在使用node容器,因为我只是更熟悉它。

它还会创build一个绑定到你的机器的卷~/Desktop/code/目录,它应该包含我们正在使用的所有代码,包括节点server.js脚本。 服务器在端口3000上进行侦听,并响应:“Hello World”。

创build服务器后,它启动另一个名为“curler”的容器,它将安装curl(debian不会随其安装)。 之后,卷起到servertest:3000并得到正确的答复,因为它们都连接到同一个docker,用户定义的networking: example_nw

完成后,通过杀死服务器容器并删除example_nwnetworking来清理。

 #!/usr/bin/env bash # Create user-defined network docker network create example_nw # Create server to listen to pings on our network docker run \ --rm \ -d \ -v ~/Desktop/code:/my/stuff \ --name servertest \ --expose 3000 \ --network example_nw \ node node /my/stuff/server # Create a curler docker run \ -it \ --rm \ -v ~/Desktop/code:/my/stuff \ --name pingtest \ --network example_nw debian \ /my/stuff/curler.sh # Clean up docker container stop servertest docker network rm example_nw 

~/Desktop/code/server.js

这是一个非常简单的node.js脚本,它将创build一个在端口3000上侦听的服务器。

 /*jslint node:true, esversion:6*/ "use strict"; const http = require("http"), port = 3000; // Make a server const server = http.createServer((req, res) => { console.log("Got request"); res.end("Hello World!\n"); }); // Have the server listen server.listen(port, (err) => { if (err) { return console.error(err); } console.log(`Listening on port: ${port}`); }); 

~/Desktop/code/curler.sh

这只是安装curl的容器,然后curl到servertest:3000

 #!/usr/bin/env bash apt update apt install -y curl curl servertest:3000 

运行~/Desktop/code/bootstrap.sh将演示通信。


我build议阅读Docker文档: 使用networking命令,因为它提供了很多很好的例子和用例。

您的容器不在端口8022上侦听,您已经将端口8022推送到容器的端口80.从容器到容器,您连接到容器端口,而不是主机上的发布端口。 因此,从curl命令中删除8022以转到默认端口80。


对于容器到集装箱的联网,你需要将容器放在一个普通的dockernetworking上。 而对于docker的内部DNS,您需要位于名为“bridge”(即“bridge”networking具有一些未启用DNS的历史属性)的默认网桥以外的dockernetworking上。 您可以在--net $network_name docker network create $network_name ,然后使用--net $network_name选项来运行您的容器来实现这个function。

您不需要修改主机文件,也不需要对容器networking使用弃用的“链接”function。

这是使用用户生成的networking的一个例子

 docker network create mynetwork docker run --network=mynetwork -d -p 127.0.0.1:8022:80 --name mynginx nginx docker run -it --network=mynetwork appropriate/curl http://mynginx 

否则,您可以使用旧的–link选项

 docker run -d -p 127.0.0.1:8022:80 --name mynginx nginx docker run -it --link=nginx appropriate/curl http://mynginx