Docker多环境容器间通信实战:打通管理服务与API服务的网络链路

老瑶小哥_8494

老瑶小哥_8494

2026-07-14

377人浏览

原创

Docker多环境容器间通信实战:打通管理服务与API服务的网络链路

本文详解如何在docker开发环境中让两个独立的compose项目(管理前端+后端api)通过自定义桥接网络实现可靠、可解析的容器间通信,重点解决enotfound域名解析失败、服务不可达等常见问题。

本文详解如何在docker开发环境中让两个独立的compose项目(管理前端+后端api)通过自定义桥接网络实现可靠、可解析的容器间通信,重点解决enotfound域名解析失败、服务不可达等常见问题。

在微服务或模块化前端开发中,常需将管理控制台(如Next.js + Express)与独立API服务(如Express后端)拆分为两个Docker Compose项目进行并行开发。但若未正确配置网络拓扑,容器将无法通过服务名相互发现——正如你遇到的错误 Error: getaddrinfo ENOTFOUND ocd-api-service-app-1,本质是DNS解析失败:Docker内置DNS仅在同一Compose项目内自动注册服务别名,跨项目容器默认处于隔离网络,彼此不可见。

✅ 正确解法:复用外部网络 + 显式服务命名

核心原则是:让两个Compose项目接入同一个外部桥接网络,并为API服务赋予唯一、可被另一项目识别的服务名。

第一步:统一创建可共享的外部网络

在任意一方(推荐在API服务侧)先创建命名网络(仅需执行一次):

docker network create ocd-network

⚠️ 注意:此网络必须显式创建,不能仅靠networks: { ocd-network: { driver: bridge } }在Compose中声明——后者会创建同名但互不关联的“内部”网络。

第二步:修改双方 compose-dev.yaml,接入外部网络

✅ API服务(api-service/compose-dev.yaml)
重命名服务为 api(避免与mgmt-service中的app冲突),并绑定到外部网络:

networks:
  ocd-network:
    external: true  # 关键:声明为已存在外部网络

services:
  api:  # ← 唯一且语义清晰的服务名
    entrypoint: ["sleep", "infinity"]
    image: docker/dev-environments-javascript:stable-1
    networks:
      - ocd-network  # 加入共享网络
    init: true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - "3001:3001"  # 可选:便于本地调试访问

✅ 管理服务(mgmt-service/compose-dev.yaml)
同样接入同一外部网络,并确保服务名不冲突(保留app即可):

networks:
  ocd-network:
    external: true

services:
  app:
    entrypoint: ["sleep", "infinity"]
    image: docker/dev-environments-javascript:stable-1
    networks:
      - ocd-network  # 关键:与API服务同网
    init: true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

第三步:更新代码中的请求地址

在 mgmt-service/app.cjs 中,将硬编码的错误主机名 ocd-api-service-app-1 替换为Compose中定义的服务名 api(Docker DNS会自动解析为对应容器IP):

Dolphindb Docker
Dolphindb Docker

自动化 DolphinDB Docker 部署,支持自动架构检测(ARM64/x86_64),智能内存分配(50% 规则)以及完整数据持久化。

下载
// ✅ 正确:使用服务名 + 端口(注意:端口是容器内监听端口,非宿主机映射端口)
const response = await axios.get("http://api:3001/test");

? 验证技巧:进入mgmt-service容器手动测试连通性

docker exec -it ocd-mgmt-service-app-1 sh
# 在容器内执行:
ping api          # 应能解析并ping通
curl http://api:3001/test  # 应返回预期JSON

第四步:确保API服务实际监听正确端口

你的 api-service/index.ts 中使用了 process.env.PORT,但未提供默认值或验证。务必确认该环境变量已设置为 3001,或显式指定:

const port = parseInt(process.env.PORT || '3001', 10); // 显式fallback
app.listen(port, () => {
  console.log(`✅ API service running on port ${port}`);
});

同时,在API服务的Compose中添加环境变量声明(推荐):

services:
  api:
    # ... 其他配置
    environment:
      - PORT=3001

? 关键注意事项总结

问题现象 根本原因 解决方案
ENOTFOUND ocd-api-service-app-1 跨Compose项目无DNS互通 使用同一外部网络 + 服务名直连
Connection refused API容器未监听3001端口或未暴露 检查app.listen()端口与环境变量一致性
请求超时/500错误 容器间网络策略拦截(极少见) 确认Docker守护进程未启用--icc=false(默认开启)
本地浏览器访问/api/proxy失败 请求由浏览器发起(非Node.js服务器) 你当前逻辑正确:/api/proxy是服务端代理,需确保Next.js API路由走Node层

✅ 最终验证流程

  1. 启动API服务:cd api-service && docker compose -f compose-dev.yaml up -d
  2. 启动管理服务:cd mgmt-service && docker compose -f compose-dev.yaml up -d
  3. 查看网络连接:docker network inspect ocd-network → 确认两容器均在Containers列表中
  4. 点击UI按钮触发/api/proxy → 控制台应输出 "Winner, winner chicken dinner"

至此,两个Docker开发环境已构建起稳定、可维护的内部通信链路,为后续集成测试、灰度发布及Swarm/K8s迁移奠定坚实基础。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

2023.07.24

685

4

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

5039

6

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

5997

6

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

2273

7

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

2026.02.11

239

16

Docker 容器部署
Docker 容器部署

本专题整合了Docker容器部署相关内容,阅读专题下面的文章了解更多详细操作教程。

2026.03.31

431

14

Java容器化部署与Docker实践教程合集
Java容器化部署与Docker实践教程合集

聚焦 Java 应用的容器化与云原生部署,讲解 Dockerfile 编写规范与 Java 应用镜像构建、多阶段构建(Multi-stage Build)减小镜像体积、Jib / Buildpacks 免 Dockerfile 镜像构建方案、JVM 容器感知参数(-XX:MaxRAMPercentage)配置、Docker Compose 编排多服务(应用 + MySQL + Redis)、容器健康检查与资源限制、Kubernetes

2026.05.11

380

26

Go Docker与容器化部署教程合集
Go Docker与容器化部署教程合集

聚焦 Go 应用的容器化部署优势与实践,讲解 Go 静态编译特性(CGO_ENABLED=0)与 scratch / distroless 极小基础镜像构建、多阶段 Dockerfile 编写规范、交叉编译生成目标平台二进制、镜像安全扫描(Trivy)与漏洞修复、Docker Compose 本地编排开发环境、Kubernetes Deployment / Service / ConfigMap 部署 Go 服务、健康检查(Livene

2026.05.15

285

24

Hyperf 项目部署运维与性能调优手册
Hyperf 项目部署运维与性能调优手册

聚焦 Hyperf 在生产环境的落地,包含 Docker 高效打包、Swoole 配置优化、常见的内存溢出(OOM)问题排查方法以及热更新方案。

2026.05.19

425

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpMyAdmin 安装文档
phpMyAdmin 安装文档

共0课时 | 0人学习

Docker 官方文档
Docker 官方文档

共0课时 | 0人学习

宝塔 Docker 模块使用手册
宝塔 Docker 模块使用手册

共0课时 | 0人学习