docker 容器 A 可以使用什么 URL 来访问另一个 docker 容器 B(相同的开发机器,不同的项目)

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_testhttp://127.0.0.1:3000/api_test(这是我们在 web 浏览器中使用的,所以并没有真正期望它可以从容器到容器工作)并且我已经尝试过http://172.18.0.3:3000/api_testhttp://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)


jpw*_*ynn 8

我终于找到了一个针对较新版本 Docker 提到的 SO 线程,例如我使用主机名host.docker.internal访问主机,所以我的问题的一个答案是 - 因为我已经为 Foo 和 Bar 分配了不同的端口 - Bar 容器可以使用网址http://host.docker.internal:3000/api_test

但是仍然首选能够为每个容器分配静态 IP,因此我将问题悬而未决。


Utk*_*taş 8

您可以使用 docker network 访问容器 A 到 B。https://docs.docker.com/network/

使用 docker 网络 --help。

  1. 创建网络

    • docker network create mynetwork
  2. 将容器 A 和容器 B 都放在这个网络中,在这种情况下是 mynetwork。

    • docker network connect mynetwork containerA

    • docker network connect mynetwork containerB

  3. 您现在可以使用容器名称将一个容器访问到另一个容器。

你也可以用ping测试它。去 A 或 B 容器 bash 并使用;

  1. apt-get update

  2. apt-get install iputils-ping

  3. 测试它就像你在 containerA 中使用ping containerB.

例如-1:

如果你想在带有端口的 apache 虚拟主机设置中使用它;

  • ProxyPass "/" "http://containerB:3000"

例如-2:

我有两个容器;basemyphp命名。我在 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"

最后,这就是我正在做的通信容器。我希望它也适用于你。