jpw*_*ynn 14 docker-compose docker-networking
假设我们只在开发的某些阶段很少需要这样做(以冒烟测试一些 api 调用),那么让项目 Bar 中的 dockerized web 服务访问 Project Foo 中的 dockerized web 服务的最简单方法是什么?
在开发 Mac 上,Docker Engine:18.09.2,Compose:1.23.2,我们有 Project Foo 和 Project Bar,它们都有自己的 docker-compose 文件,每个文件都有一个 Web 服务和一个数据库服务。
通常它们是独立运行的,并且是独立开发的。
然而,Project Foo 的 Web 服务托管了一个 API,我们只是偶尔想从 Project Bar 的 Web 容器中访问它
它们被分配到不同的主机端口, docker ps
显示 Project Foo 使用端口 0.0.0.0:3000->3000/tcp(例如,我们使用 localhost:3000 从 Mac 浏览器访问 web 服务。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
显示他们都使用相同的“桥接”驱动程序。
这两个项目都在 Mac 上运行,总共 4 个容器,(Foo 上的 web+db,Bar 上的 web+db)
如果在 Bar 上运行的程序(Ruby)需要访问 Foo 上的 REST URL,那么 Foo 上“/api_test”的 URL 是什么?
从我尝试过的 Bar web 容器http://localhost:3000/api_test
和http://127.0.0.1:3000/api_test
(这是我们在 web 浏览器中使用的,所以并没有真正期望它可以从容器到容器工作)并且我已经尝试过http://172.18.0.3:3000/api_test
,http://172.18.0.3/api_test
但都没有奏效。
我看到了关于设置链接或 docker 网络的在线参考资料,但所有示例都是针对使用 docker run 而不是使用 docker-compose 时的。我希望如果您知道每个容器的 Web 服务器的 IP 和端口,那么应该是使用正确的 URL 而无需任何额外网络设置的问题?
任何帮助,将不胜感激。
首选手动分配的静态 IP 解决方案……在 Docker 之前,我们使用 Vagrant,这很简单,在每个项目的 Vagrantfile 中,我们只需手动为它们分配同一私有子网 192.168.50.50 和 192.168.50.51 上的 IP,然后他们“交谈” “对彼此来说很好,我们可以简单地将这些 IP '编码'到我们的开发代码中。Docker 似乎有一个额外的抽象层,这让我感到困惑。
joe*_*joe 12
TLDR:使用http://host.docker.internal
从https://docs.docker.com/docker-for-mac/networking/,
主机有一个不断变化的 IP 地址(如果您没有网络访问权限,则没有)。从 18.03 开始,我们的建议是连接到特殊的 DNS 名称 host.docker.internal,它解析为主机使用的内部 IP 地址。这是出于开发目的,不适用于 Docker Desktop for Mac 之外的生产环境。
我试过了,这也适用于 Windows。
例如,如果您在端口 5000 上的容器中运行 python 应用程序/微服务,您可以使用它来连接到它:
requests.get('http://host.docker.internal:5000')
Run Code Online (Sandbox Code Playgroud)
我终于找到了一个针对较新版本 Docker 提到的 SO 线程,例如我使用主机名host.docker.internal
访问主机,所以我的问题的一个答案是 - 因为我已经为 Foo 和 Bar 分配了不同的端口 - Bar 容器可以使用网址http://host.docker.internal:3000/api_test
但是仍然首选能够为每个容器分配静态 IP,因此我将问题悬而未决。
您可以使用 docker network 访问容器 A 到 B。https://docs.docker.com/network/
使用 docker 网络 --help。
创建网络
docker network create mynetwork
将容器 A 和容器 B 都放在这个网络中,在这种情况下是 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
命名。我在 port 上的基本容器中运行 nodejs 应用程序3000
。我在第二个容器 myphp 上运行 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}`);
Run Code Online (Sandbox Code Playgroud)
基本上,我的 php 应用程序为我提供了所有源代码的连接地址。它正在处理 container 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>";
?>
Run Code Online (Sandbox Code Playgroud)
然后我把这两个容器放在同一个网络中。当我运行这个 index.php 时,它是 myphp 容器应用程序。它给了我“Hello Word”;
因此,如果您将容器放在同一个网络中,您可以使用其名称相互访问,"http://containerB:3000"
或者您的路由器正在侦听 "/api_test" "http://containerB:3000/api_test"
。
最后,这就是我正在做的通信容器。我希望它也适用于你。
归档时间: |
|
查看次数: |
10249 次 |
最近记录: |