Networking 多个docker compose项目之间的通信
我在两个不同的文件夹中有两个独立的Networking 多个docker compose项目之间的通信,networking,docker,docker-compose,Networking,Docker,Docker Compose,我在两个不同的文件夹中有两个独立的docker compose.yml文件: ~/front/docker compose.yml ~/api/docker compose.yml 如何确保front中的容器可以向api中的容器发送请求 我知道可以使用docker run为单个容器设置--默认网关选项,以便为该容器分配特定的IP地址,但在使用docker compose时,该选项似乎不可用 目前,我做了一个docker检查我的\u api\u容器\u id,并查看输出中的网关。它工作,但问题
docker compose.yml
文件:
~/front/docker compose.yml
~/api/docker compose.yml
front
中的容器可以向api
中的容器发送请求
我知道可以使用docker run
为单个容器设置--默认网关
选项,以便为该容器分配特定的IP地址,但在使用docker compose
时,该选项似乎不可用
目前,我做了一个docker检查我的\u api\u容器\u id
,并查看输出中的网关。它工作,但问题是,这个IP是随机属性,所以我不能依赖它
因此,这个问题的另一种形式可能是:
- 我可以使用docker compose为特定容器指定固定IP地址吗
- 两个不同的docker compose项目如何相互通信
#front/docker-compose.yml
版本:“2”
服务:
正面:
...
网络:
-一些网
网络:
一些网络:
司机:驾驶台
#api/docker-compose.yml
版本:“2”
服务:
应用程序编程接口:
...
网络:
-前网络
网络:
前端网络:
外部:正确
注意:您的应用程序网络的名称基于“项目名称”,该名称基于其所在目录的名称,在这种情况下,添加了前缀front\uu
然后,他们可以使用服务名称相互交谈。从
前端
可以执行ping api
操作,反之亦然。我将确保所有容器都是docker compose
,通过同时将它们组合在一起,使用:
docker compose --file ~/front/docker-compose.yml --file ~/api/docker-compose.yml up -d
只是@johnharis85伟大答案的一小部分, 运行docker compose文件时,将创建一个“
默认值”
”网络
因此,您可以将其作为外部网络添加到另一个compose文件中:
# front/docker-compose.yml
version: '2'
services:
front_service:
...
对我来说,这种方法更合适,因为我没有第一个docker compose文件,希望与它通信。来自
api
的所有容器都可以通过以下配置加入前端
默认网络:
# api/docker-compose.yml
...
networks:
default:
external:
name: front_default
参见docker compose guide:(参见底部)之前的帖子信息是正确的,但没有关于如何链接容器的详细信息,容器应作为“外部链接”连接 希望这个例子能让你更清楚:
- 假设您有app1/docker-compose.yml和app2/docker-compose.yml,其中包含两个服务(svc11和svc12),以及另外两个服务(svc21和svc22),并且假设您需要以交叉方式连接:
- svc11需要连接到svc22的容器
- svc21需要连接到svc11的容器
version: '2'
services:
svc11:
container_name: container11
[..]
networks:
- default # this network
- app2_default # external network
external_links:
- container22:container22
[..]
svc12:
container_name: container12
[..]
networks:
default: # this network (app1)
driver: bridge
app2_default: # external network (app2)
external: true
version: '2'
services:
svc21:
container_name: container21
[..]
networks:
- default # this network (app2)
- app1_default # external network (app1)
external_links:
- container11:container11
[..]
svc22:
container_name: container22
[..]
networks:
default: # this network (app2)
driver: bridge
app1_default: # external network (app1)
external: true
这是app2/docker compose.yml:
version: '2'
services:
svc11:
container_name: container11
[..]
networks:
- default # this network
- app2_default # external network
external_links:
- container22:container22
[..]
svc12:
container_name: container12
[..]
networks:
default: # this network (app1)
driver: bridge
app2_default: # external network (app2)
external: true
version: '2'
services:
svc21:
container_name: container21
[..]
networks:
- default # this network (app2)
- app1_default # external network (app1)
external_links:
- container11:container11
[..]
svc22:
container_name: container22
[..]
networks:
default: # this network (app2)
driver: bridge
app1_default: # external network (app1)
external: true
更新:自撰写文件版本3.5起: 现在可以这样做了:
版本:“3.5”
服务:
代理:
图片:你好,世界
端口:
- "80:80"
网络:
-proxynet
网络:
proxynet:
名称:自定义网络
docker compose up-d
将加入一个名为“自定义网络”的网络。如果它不存在,它将被创建
root@ubuntu-s-1vcpu-1gb-tor1-01:~#docker compose up-d
使用默认驱动程序创建网络“自定义网络”
正在创建根目录\u代理\u 1。。。完成
现在,您可以执行以下操作:
版本:“2”
服务:
网状物:
图片:你好,世界
网络:
-我的代理网络
网络:
我的代理网络:
外部:
名称:自定义网络
这将在外部网络上创建一个容器
我在文档中还找不到任何参考资料,但它很有效 自Compose 1.18(规范3.5)以来,您可以使用自己的自定义名称覆盖所有需要的Compose YAML文件的默认网络。只需在其后面附加以下内容即可:
networks:
default:
name: my-app
以上假设您已将版本设置为3.5
(或更高版本,如果他们没有在4+中弃用)
其他答案也指出了同样的问题;这是一个简化的摘要
version: '2'
services:
bot:
build: .
volumes:
- '.:/home/node'
- /home/node/node_modules
networks:
- my-rede
mem_limit: 100m
memswap_limit: 100m
cpu_quota: 25000
container_name: 236948199393329152_585042339404185600_bot
command: node index.js
environment:
NODE_ENV: production
networks:
my-rede:
external:
name: name_rede_externa
要使用另一个docker compose网络,只需执行以下操作(在docker compose之间共享网络):
通过up-d运行第一个docker compose项目
查找第一个docker compose by的网络名称:docker network ls
(它包含根目录项目的名称)
然后在下面的第二个docker compose文件中使用该名称
第二个docker-compose.yml
version: '3'
services:
service-on-second-compose: # Define any names that you want.
.
.
.
networks:
- <put it here(the network name that comes from "docker network ls")>
networks:
- <put it here(the network name that comes from "docker network ls")>:
external: true
版本:“3”
服务:
第二次合成时的服务:#定义您想要的任何名称。
.
.
.
网络:
-
网络:
- :
外部:正确
更新:自docker compose文件版本3.5起:
我遇到了一个类似的问题,我通过在我的docker-compose.yml项目中添加一个小更改来解决它
例如,我们有两个API评分和ner
Scoring
API需要向ner
API发送请求以处理输入请求。为了做到这一点,他们都应该共享同一个网络
注意:每个容器都有自己的网络,该网络在docker内部运行应用程序时自动创建。例如,ner API网络将像ner\u default
一样创建,评分API网络将命名为scoring defaultversion: '3'
services:
ner:
container_name: "ner_api"
build: .
...
networks:
default:
external:
name: scoring_default
version: '3'
services:
api:
build: .
...
{
"Name": "scoring_default",
....
"Containers": {
"14a6...28bf": {
"Name": "ner_api",
"EndpointID": "83b7...d6291",
"MacAddress": "0....",
"IPv4Address": "0.0....",
"IPv6Address": ""
},
"7b32...90d1": {
"Name": "scoring_api",
"EndpointID": "311...280d",
"MacAddress": "0.....3",
"IPv4Address": "1...0",
"IPv6Address": ""
},
...
}
import socket
def get_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
# doesn't even have to be reachable
s.connect(('10.255.255.255', 1))
IP = s.getsockname()[0]
except:
IP = '127.0.0.1'
finally:
s.close()
return IP
networks:
app-tier:
driver: bridge
services:
api:
container_name: api_a
image: api_a:latest
depends_on:
- postgresql
networks:
- app-tier
networks:
app-tier:
driver: bridge
services:
api:
container_name: api_b
image: api_b:latest
depends_on:
- postgresql
networks:
- app-tier