如何让两个 docker-compose 项目中的容器互相通信

在使用 Docker 时,创建一个共享的外部网络。让不同应用能轻松地通过容器名互相访问。

Author Avatar

ghung

  ·  1 min read

由于部署了很多中转代理服务以及各种客户端,常常会遇到多个docker容器间通信的问题。例如,为了解决New-API以及OpenWebUI两个容器间的通信,减少API时延,之前都是采用放在同一个docker-compose中管理,在内部创建一个网络并接入。

这样也可以实现使用http://newapi:3000/v1的优雅方式访问。

随着docker-compose文件的越来越长,维护难度越来越高,越来越像一个大杂烩。我又学习了另外一种创建外部网络的方式。


思路是:我们创建一个独立于任何 docker-compose 文件的共享网络,然后让两个不同的 docker-compose 项目都连接到这个网络上。

创建共享网络 #

运行以下命令来创建一个新的桥接网络。我们就叫它 shared-net。

docker network create shared-net

这个网络现在独立存在,不受任何 docker-compose 文件的 up 或 down 命令影响。

修改不同容器所在的 docker-compose.yml #

编辑容器的 docker-compose.yml 文件,让它连接到我们刚刚创建的 shared-net。

只需要编辑两个地方:

# 例如在 new-api 项目的 docker-compose.yml 文件中

services:
  new-api:
    # ... (它所有现有的配置都保持不变) ...
    networks: # 1.给 new-api 服务添加这个 networks 块
      - some-other-network # 它可能已经连接了其他网络,保留它们
      - shared-net # 额外连接到我们的共享网络

# 2. 在文件末尾声明这个网络是外部的
networks:
  some-other-network:
    # ...
  shared-net:
    external: true

之后,重启容器。

现在,因为不同容器都在 shared-net 这个网络里,它们可以通过容器名直接通信。要访问 「new-api」 ,地址应该填写:http://new-api:3000