Docker compose docker容器A可以使用哪个URL访问另一个docker容器B(相同的开发机器,不同的项目)
假设我们只在开发的某些阶段(冒烟测试几个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 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
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容器可以使用urlhttp://host.docker.internal:3000/api_test
但仍然希望能够将静态IP分配给每个容器,因此我保留问题。您可以使用docker网络访问容器A到B 使用docker网络——帮助
docker网络创建mynetwork
docker网络连接mynetwork containerA
docker网络连接我的网络容器b
apt获取更新
apt get install iputils ping
ProxyPass”/http://containerB:3000“
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应用程序为我提供了连接地址的所有源代码。它正在处理containermyphp
。以下是代码:
'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