Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker compose docker容器A可以使用哪个URL访问另一个docker容器B(相同的开发机器,不同的项目)_Docker Compose_Docker Networking - Fatal编程技术网

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

Docker compose docker容器A可以使用哪个URL访问另一个docker容器B(相同的开发机器,不同的项目),docker-compose,docker-networking,Docker Compose,Docker Networking,假设我们只在开发的某些阶段(冒烟测试几个api调用)很少需要这样做,那么让project Bar中的dockerized web服务访问project Foo中的dockerized web服务的最简单方法是什么 在开发Mac上,Docker Engine:18.09.2,Compose:1.23.2,我们有ProjectFoo和ProjectBar,它们都有自己的Docker Compose文件,每个文件都有一个web服务和一个数据库服务 通常,它们是独立运行的,并且是独立开发的 然而,Pro

假设我们只在开发的某些阶段(冒烟测试几个api调用)很少需要这样做,那么让project Bar中的dockerized web服务访问project Foo中的dockerized web服务的最简单方法是什么

在开发Mac上,Docker Engine:18.09.2,Compose:1.23.2,我们有ProjectFoo和ProjectBar,它们都有自己的Docker Compose文件,每个文件都有一个web服务和一个数据库服务

通常,它们是独立运行的,并且是独立开发的

然而,ProjectFoo的web服务承载一个API,我们只是偶尔希望从ProjectBar的web容器访问它

它们被分配到不同的主机端口,
docker ps
显示Project Foo使用端口0.0.0:3000->3000/tcp(例如,我们使用localhost:3000从Mac浏览器访问web服务。Project Bar使用端口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\u 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,这很简单,在每个项目的Vagrant文件中,我们只是在同一个私有子网192.168.50.50和192.168.50.51上手动分配给他们一个IP,他们“交谈”我们可以简单地将这些IP“编码”到我们的开发代码中。Docker似乎有一个额外的抽象层,这让我感到困惑。

我终于找到了一个SO线程,它提到了更新版本的Docker,比如我正在使用主机名
host.Docker.internal
访问主机,所以一个answ呃,我的问题是——因为我已经为Foo和Bar分配了不同的端口——Bar容器可以使用url
http://host.docker.internal:3000/api_test


但仍然希望能够将静态IP分配给每个容器,因此我保留问题。

您可以使用docker网络访问容器A到B

使用docker网络——帮助

  • 创建网络

    • docker网络创建mynetwork
  • 将containerA和containerB两个容器都放在这个网络中,在本例中是mynetwork

    • docker网络连接mynetwork containerA

    • docker网络连接我的网络容器b

  • 现在,您可以使用容器名称将一个容器访问到另一个容器

  • 你也可以用ping来测试它

  • apt获取更新

  • apt get install iputils ping

  • 测试它就像在containerA中使用ping containerB一样

  • 例如-1:

    如果要在apache virtualhost设置中使用它,请使用端口

    • ProxyPass”/http://containerB:3000“
    例如-2:

    我有两个容器;
    base
    myphp
    命名。我在端口
    3000
    的base容器中运行nodejs应用程序。我在第二个容器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}`); 
    
    <?php
        $domain = 'http://base:3000';
        $handle = fopen($domain, 'r');
        $content = stream_get_contents($handle);
        fclose($handle);
    
        echo "<textarea rows='20' cols='80'>$content</textarea>";
    ?>
    
    基本上,我的php应用程序为我提供了连接地址的所有源代码。它正在处理container
    myphp
    。以下是代码:

    '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
        $domain = 'http://base:3000';
        $handle = fopen($domain, 'r');
        $content = stream_get_contents($handle);
        fclose($handle);
    
        echo "<textarea rows='20' cols='80'>$content</textarea>";
    ?>
    

    TLDR:使用

    主机的IP地址正在更改(如果您没有网络访问权限,则无IP地址)。从18.03起,我们建议连接到特殊DNS名称host.docker.internal,该名称解析为主机使用的内部IP地址。这是出于开发目的,在Mac docker Desktop之外的生产环境中不起作用

    我试过了,这也适用于windows

    例如,如果您正在端口5000上的容器中运行python应用程序/微服务,则可以使用此连接到它:

    requests.get('http://host.docker.internal:5000')
    
    谢谢,看起来很有趣……但是你能在回答中添加容器A用来访问容器B中的web应用程序的URL吗?假设我已经有了一个网络并将其连接到两个容器,我如何通过自定义域从另一个容器访问?例如访问域:foo.bar.com