URL docker 容器 A 可以使用什么来访问另一个 docker 容器 B(相同的开发机器,不同的项目)
what URL can docker container A use to access another docker container B (same dev machine, different projects)
假设我们很少需要在某些开发阶段这样做(冒烟测试一些 api 调用),让 docker 化的 Web 服务最简单的方法是什么在项目 Bar 中访问项目 Foo 中的 docker 化 Web 服务?
在开发中 Mac,Docker Engine:18.09.2,Compose:1.23.2,我们有 Project Foo 和 Project Bar,每个都有自己的 docker-compose文件,每个文件都有一个网络服务和一个数据库服务。
通常它们运行是独立的,并且是独立开发的。
然而,Project Foo 的 Web 服务托管了一个 API 我们只是偶尔想从 Project Bar 的 Web 容器中访问它
它们被分配到不同的主机端口,docker ps
显示 Project Foo 使用端口 0.0.0.0:3000->3000/tcp(例如,我们使用 localhost:3000 从Mac的浏览器。Project Bar使用端口0.0.0.0:3010->3010/tcp
docker inspect
对于 Foo 显示它的 IP 地址是“172.18.0.3”(网关“172.18.0.1”),对于 Bar 显示它的 IP 地址是“172.22.0.4”(网关“172.22.0.1” )
docker network ls
表明它们都使用相同的 "bridge" 驱动程序。
两个项目都在 运行ning Mac 上,总共 4 个容器(web+db 在 Foo 上,web+db 在 Bar 上)
如果Bar上的程序(Ruby)运行ning需要访问Foo上的RESTURL,"/[=52的URL是什么=]" 在 Foo 上?
我已经尝试从 Bar 网络容器 http://localhost:3000/api_test
和 http://127.0.0.1:3000/api_test
(这是我们在网络浏览器中使用的,所以我真的没想到它能从容器到-container) 我试过 http://172.18.0.3:3000/api_test
和 http://172.18.0.3/api_test
都没有用。
我在网上看到有关设置 link 或 docker 网络的参考资料,但所有示例都是针对使用 docker 运行 而不是使用 docker-撰写。我希望如果您知道每个容器的 Web 服务器的 IP 和端口,那么在没有任何额外网络设置的情况下使用正确的 URL 应该是个问题?
如有任何帮助,我们将不胜感激。
首选手动分配静态IP的方案... 在Docker之前,我们使用Vagrant,很简单,在每个项目的Vagrantfile中我们只是手动分配它们在同一个私有子网 192.168.50.50 和 192.168.50.51 上有一个 IP,它们 "talked" 彼此很好,我们可以简单地 'code' 这些 IP 到我们的开发代码中。 Docker 似乎多了一层抽象,让我很困惑。
我终于找到了一个 SO 线程,它提到了 Docker 的较新版本,例如我正在使用主机名 host.docker.internal
访问主机,所以我的问题的一个答案是 - 因为我已经为 Foo 和 Bar 分配了不同的端口 - Bar 容器可以使用 url http://host.docker.internal:3000/api_test
但最好还是能够为每个容器分配静态 IP,因此我将问题悬而未决。
您可以使用docker网络访问容器A到B。https://docs.docker.com/network/
使用 docker network --help.
创建网络
docker network create mynetwork
将容器 containerA 和 containerB 都放在这个网络中,在本例中是 mynetwork。
docker network connect mynetwork containerA
docker network connect mynetwork containerB
您现在可以使用容器名称访问一个容器到另一个容器。
你也可以用ping测试一下。转到 A 或 B 容器 bash 并使用;
apt-get update
apt-get install iputils-ping
测试它就像你在 containerA 中使用 ping containerB
.
例如-1:
如果你想在带有端口的apache虚拟主机设置中使用它;
ProxyPass "/" "http://containerB:3000"
例如-2:
我有两个容器; base
和 myphp
命名。我在端口 3000
上的基础容器中 运行ning nodejs 应用程序。我在第二个容器 myphp.
上 运行ning apache 和 php
基本上我的 nodejs 应用程序给我一个 "Hello Word" 输出。它正在容器 base
上运行,代码如下:
'use strict';
const express = require('express');
// Constants
const PORT = 3000;
const HOST = '0.0.0.0';
// App
const app = express();
app.get('/', (req, res) => {
res.send('Hello world\n');
});
app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);
基本上我的 php 应用程序为我提供了连接地址的所有源代码。它正在容器 myphp
上工作。这是代码:
<?php
$domain = 'http://base:3000';
$handle = fopen($domain, 'r');
$content = stream_get_contents($handle);
fclose($handle);
echo "<textarea rows='20' cols='80'>$content</textarea>";
?>
然后我把这两个容器放在同一个网络。当我 运行 这个 index.php 这是我的 php 容器应用程序。它给了我 "Hello Word";
因此,如果您将容器放在同一个网络中,您可以使用其名称相互访问,例如 "http://containerB:3000"
或者如果您的路由器侦听“/api_test” "http://containerB:3000/api_test"
.
最后,这就是我正在做的通信容器。我希望它也对你有用。
TLDR:使用http://host.docker.internal
来自 https://docs.docker.com/docker-for-mac/networking/、
The host has a changing IP address (or none if you have no network access). From 18.03 onwards our recommendation is to connect to the special DNS name host.docker.internal, which resolves to the internal IP address used by the host. This is for development purpose and will not work in a production environment outside of Docker Desktop for Mac.
我试过了,这也适用于 windows。
例如,如果你是 运行 一个 python app/microservice 在端口 5000 上的容器中,你可以使用它来连接它:
requests.get('http://host.docker.internal:5000')
假设我们很少需要在某些开发阶段这样做(冒烟测试一些 api 调用),让 docker 化的 Web 服务最简单的方法是什么在项目 Bar 中访问项目 Foo 中的 docker 化 Web 服务?
在开发中 Mac,Docker Engine:18.09.2,Compose:1.23.2,我们有 Project Foo 和 Project Bar,每个都有自己的 docker-compose文件,每个文件都有一个网络服务和一个数据库服务。
通常它们运行是独立的,并且是独立开发的。
然而,Project Foo 的 Web 服务托管了一个 API 我们只是偶尔想从 Project Bar 的 Web 容器中访问它
它们被分配到不同的主机端口,docker ps
显示 Project Foo 使用端口 0.0.0.0:3000->3000/tcp(例如,我们使用 localhost:3000 从Mac的浏览器。Project Bar使用端口0.0.0.0:3010->3010/tcp
docker inspect
对于 Foo 显示它的 IP 地址是“172.18.0.3”(网关“172.18.0.1”),对于 Bar 显示它的 IP 地址是“172.22.0.4”(网关“172.22.0.1” )
docker network ls
表明它们都使用相同的 "bridge" 驱动程序。
两个项目都在 运行ning Mac 上,总共 4 个容器(web+db 在 Foo 上,web+db 在 Bar 上)
如果Bar上的程序(Ruby)运行ning需要访问Foo上的RESTURL,"/[=52的URL是什么=]" 在 Foo 上?
我已经尝试从 Bar 网络容器 http://localhost:3000/api_test
和 http://127.0.0.1:3000/api_test
(这是我们在网络浏览器中使用的,所以我真的没想到它能从容器到-container) 我试过 http://172.18.0.3:3000/api_test
和 http://172.18.0.3/api_test
都没有用。
我在网上看到有关设置 link 或 docker 网络的参考资料,但所有示例都是针对使用 docker 运行 而不是使用 docker-撰写。我希望如果您知道每个容器的 Web 服务器的 IP 和端口,那么在没有任何额外网络设置的情况下使用正确的 URL 应该是个问题?
如有任何帮助,我们将不胜感激。
首选手动分配静态IP的方案... 在Docker之前,我们使用Vagrant,很简单,在每个项目的Vagrantfile中我们只是手动分配它们在同一个私有子网 192.168.50.50 和 192.168.50.51 上有一个 IP,它们 "talked" 彼此很好,我们可以简单地 'code' 这些 IP 到我们的开发代码中。 Docker 似乎多了一层抽象,让我很困惑。
我终于找到了一个 SO 线程,它提到了 Docker 的较新版本,例如我正在使用主机名 host.docker.internal
访问主机,所以我的问题的一个答案是 - 因为我已经为 Foo 和 Bar 分配了不同的端口 - Bar 容器可以使用 url http://host.docker.internal:3000/api_test
但最好还是能够为每个容器分配静态 IP,因此我将问题悬而未决。
您可以使用docker网络访问容器A到B。https://docs.docker.com/network/
使用 docker network --help.
创建网络
docker network create mynetwork
将容器 containerA 和 containerB 都放在这个网络中,在本例中是 mynetwork。
docker network connect mynetwork containerA
docker network connect mynetwork containerB
您现在可以使用容器名称访问一个容器到另一个容器。
你也可以用ping测试一下。转到 A 或 B 容器 bash 并使用;
apt-get update
apt-get install iputils-ping
测试它就像你在 containerA 中使用
ping containerB
.
例如-1:
如果你想在带有端口的apache虚拟主机设置中使用它;
ProxyPass "/" "http://containerB:3000"
例如-2:
我有两个容器; base
和 myphp
命名。我在端口 3000
上的基础容器中 运行ning nodejs 应用程序。我在第二个容器 myphp.
基本上我的 nodejs 应用程序给我一个 "Hello Word" 输出。它正在容器 base
上运行,代码如下:
'use strict';
const express = require('express');
// Constants
const PORT = 3000;
const HOST = '0.0.0.0';
// App
const app = express();
app.get('/', (req, res) => {
res.send('Hello world\n');
});
app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);
基本上我的 php 应用程序为我提供了连接地址的所有源代码。它正在容器 myphp
上工作。这是代码:
<?php
$domain = 'http://base:3000';
$handle = fopen($domain, 'r');
$content = stream_get_contents($handle);
fclose($handle);
echo "<textarea rows='20' cols='80'>$content</textarea>";
?>
然后我把这两个容器放在同一个网络。当我 运行 这个 index.php 这是我的 php 容器应用程序。它给了我 "Hello Word";
因此,如果您将容器放在同一个网络中,您可以使用其名称相互访问,例如 "http://containerB:3000"
或者如果您的路由器侦听“/api_test” "http://containerB:3000/api_test"
.
最后,这就是我正在做的通信容器。我希望它也对你有用。
TLDR:使用http://host.docker.internal
来自 https://docs.docker.com/docker-for-mac/networking/、
The host has a changing IP address (or none if you have no network access). From 18.03 onwards our recommendation is to connect to the special DNS name host.docker.internal, which resolves to the internal IP address used by the host. This is for development purpose and will not work in a production environment outside of Docker Desktop for Mac.
我试过了,这也适用于 windows。
例如,如果你是 运行 一个 python app/microservice 在端口 5000 上的容器中,你可以使用它来连接它:
requests.get('http://host.docker.internal:5000')