我有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请求google,我会得到正确答案。
感谢您的帮助
已更新 好的我可以解决这个问题,创建一个网络并在两个容器中使用这个网络,然后我将8022容器的主机文件添加到端口80容器的IP中。
感谢@ zero298寻求帮助!!
答案 0 :(得分:2)
您的容器未在端口8022上侦听,您已将端口8022推送到容器的端口80.从容器到容器,您连接到容器端口,而不是已发布的端口主人。因此,从curl命令中删除8022以转到默认端口80。
对于容器到容器网络,您需要将容器放在公共docker网络上。对于docker的内部DNS,您需要位于除名为" bridge"的默认桥接网络之外的docker网络上。 ("网桥"网络有一些没有启用DNS的历史属性)。您可以([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.NTAccount] "Enterprise Admins")
True
然后使用docker network create $network_name
选项运行容器来实现此目的。
您无需修改主机文件或使用已弃用的"链接"容器到容器网络的功能。
答案 1 :(得分:2)
这是如何通过用户定义的桥接网络进行容器间通信的一个非常简单的示例。以下是我为此定义的3个文件:
~/Desktop/code/bootstrap.sh
这将启动演示,首先创建一个用户定义的隔离网络,您的容器可以通过名为example_nw
进行对话。然后它创建一个名为“servertest”的新容器,它将保存我们将curl
的服务器。我正在使用node
容器,因为我对它更熟悉。
它还将创建一个绑定到您的计算机~/Desktop/code/
目录的卷,该目录应包含我们正在使用的所有代码,包括节点server.js
脚本。服务器侦听端口3000并响应:“Hello World”。
创建服务器之后,它将启动另一个名为“curler”的容器,它将安装curl(debian不会随附它)。之后,它会卷曲到servertest:3000
并获得正确的回复,因为它们都连接到相同的泊坞窗,用户定义的网络:example_nw
。
完成后,它会通过终止服务器容器并删除example_nw
网络来清理它。
#!/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脚本,它将创建一个侦听端口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
这只是在容器中安装卷曲,然后卷曲到servertest:3000
。
#!/usr/bin/env bash
apt update
apt install -y curl
curl servertest:3000
正在运行~/Desktop/code/bootstrap.sh
将演示通信。
我建议阅读Docker文档:Work with network commands因为它提供了很多很好的示例和用例。
答案 2 :(得分:1)
这是使用用户生成的网络
的示例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