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_nw
networking来清理。
#!/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