docker多个容器的相互通信

ops/2025/2/9 13:38:34/

在同一台宿主机上运行多个 Docker 容器时,容器之间可以通过以下几种方式实现通信:


1. 使用 Docker 默认网络(Bridge 网络)

Docker 默认会为每个容器分配一个 bridge 网络,容器可以通过 IP 地址或容器名称互相通信。

实现步骤
  1. 创建容器时,Docker 会自动将其连接到默认的 bridge 网络。
  2. 容器之间可以通过 容器名称IP 地址 通信。
示例
  • 启动两个容器
    docker run -d --name container1 nginx
    docker run -d --name container2 nginx
    
  • container1 中访问 container2
    docker exec -it container1 ping container2
    
注意事项
  • 默认的 bridge 网络不支持通过容器名称直接通信(需要使用 --link,但已不推荐)。
  • 推荐使用自定义网络(见下文)。

2. 使用自定义 Docker 网络

Docker 允许用户创建自定义网络,容器连接到同一自定义网络后,可以通过容器名称直接通信。

实现步骤
  1. 创建自定义网络:
    docker network create mynetwork
    
  2. 启动容器并连接到自定义网络:
    docker run -d --name container1 --network mynetwork nginx
    docker run -d --name container2 --network mynetwork nginx
    
  3. 容器之间通过容器名称通信:
    • container1 中访问 container2
      docker exec -it container1 ping container2
      
优点
  • 支持通过容器名称直接通信。
  • 网络隔离性好,安全性高。

3. 使用 --link 参数(不推荐)

Docker 早期支持通过 --link 参数将容器连接在一起,但这种方式已被弃用,推荐使用自定义网络。

示例
  • 启动容器并使用 --link
    docker run -d --name container1 nginx
    docker run -d --name container2 --link container1 nginx
    
  • container2 中访问 container1
    docker exec -it container2 ping container1
    
缺点
  • 功能有限,不支持动态更新。
  • 已不推荐使用。

4. 使用 Host 网络

容器连接到宿主机的网络栈,容器直接使用宿主机的网络接口。

实现步骤
  • 启动容器时使用 --network host
    docker run -d --name container1 --network host nginx
    docker run -d --name container2 --network host nginx
    
  • 容器之间可以通过 localhost 或宿主机的 IP 地址通信。
注意事项
  • 容器与宿主机共享网络栈,可能会导致端口冲突。
  • 安全性较低,不推荐在生产环境中使用。

5. 使用 Docker Compose

Docker Compose 是管理多容器应用的理想工具,它会自动为容器创建自定义网络,并通过服务名称实现容器通信。

实现步骤
  1. 创建 docker-compose.yml 文件:
    version: '3'
    services:web:image: nginxports:- "8080:80"db:image: mysqlenvironment:MYSQL_ROOT_PASSWORD: example
    
  2. 启动服务:
    docker-compose up -d
    
  3. web 服务中访问 db 服务:
    • 直接使用服务名称 db 作为主机名:
      docker-compose exec web ping db
      
优点
  • 自动创建自定义网络,容器之间通过服务名称通信。
  • 简化多容器应用的管理。

6. 使用共享数据卷(间接通信)

如果容器之间需要共享数据,可以通过挂载同一个数据卷实现间接通信。

实现步骤
  1. 创建数据卷:
    docker volume create mydata
    
  2. 启动容器并挂载数据卷:
    docker run -d --name container1 -v mydata:/app/data nginx
    docker run -d --name container2 -v mydata:/app/data nginx
    
  3. 容器之间通过共享的文件系统通信。

总结

通信方式实现方法优点缺点
默认 Bridge 网络容器通过 IP 或名称通信简单易用默认不支持容器名称通信
自定义网络创建自定义网络,容器通过名称通信支持容器名称通信,网络隔离性好需要手动创建网络
–link(不推荐)使用 --link 连接容器早期支持容器名称通信功能有限,已弃用
Host 网络容器共享宿主机网络栈直接使用宿主机网络安全性低,可能导致端口冲突
Docker Compose自动创建网络,容器通过服务名通信简化多容器管理,支持服务名称通信需要编写 docker-compose.yml 文件
共享数据卷容器通过共享文件系统通信适合共享数据场景仅适用于文件系统通信

推荐方案

  • 开发环境:使用 Docker Compose,简化多容器管理。
  • 生产环境:使用自定义网络,确保网络隔离和安全性。
  • 特殊场景:如果需要共享数据,可以使用共享数据卷。

http://www.ppmy.cn/ops/156984.html

相关文章

大模型Dense、MoE 与 Hybrid-MoE 架构的比较

在大模型架构设计中,Dense(全连接)、MoE(混合专家)和Hybrid-MoE(混合式MoE)是三种主流的参数组织方式,它们在模型容量、计算效率和应用场景上存在显著差异。以下从核心原理、技术特点…

使用服务器部署DeepSeek-R1模型【详细版】

文章目录 引言deepseek-r1IDE或者终端工具算力平台体验deepseek-r1模型总结 引言 在现代的机器学习和深度学习应用中,模型部署和服务化是每个开发者面临的重要任务。无论是用于智能推荐、自然语言处理还是图像识别,如何高效、稳定地将深度学习模型部署到…

21.2.7 综合示例

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 【例 21.7】【项目:code21-007】填充职员表并打印。 本例使用到的Excel文件为:职员信息登记表.xlsx&#x…

鸿蒙接入支付宝SDK后模拟器无法运行,报错error: install parse native so failed.

鸿蒙项目接入支付宝后,运行提示error: install parse native so failed. 该问题可能由于设备支持的 Abi 类型与 C 工程中的不匹配导致. 官网error: install parse native so failed.错误解决办法 根据官网提示在模块build-profile.json5中添加“x86_64”依然报错 问…

回退 android studio emulator 的版本

前情提要 最近用 frida 需要一个完全跑 arm64 的手机 os,因为雷电实时转义 arm 到 x64 的方案本质上还是 x64,会导致 frida 有 bug。查了一下有帖子说 android studio 自带的模拟器支持直接跑 arm64 的镜像 (Other Images) 直接跑跑不通,调…

使用 Apache Spark 进行大数据分析

使用 Apache Spark 进行大数据分析 环境准备 为了能够在本地环境中运行Spark程序,需要先完成环境搭建。确保已经安装了Jupyter Notebook和Apache Spark,并完成了两者之间的集成。 创建 SparkSession 在 Python 中使用 PySpark 时,通常会创…

【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具演示05

SQLSERVER的ImpDp和ExpDp工具演示 1、表部分数据导出 (-query) ※「-query」和「-include_table」必须一起使用 「-query」后面字符串是sql文的where语句,但要注意要使用%,需要写%% 验证用:导出的表,导入到新的数据库 db的数…

4.Python字符串和列表:字符串输入、字符串输出、下标和切片、字符串常见函数、列表(list)、列表的循环遍历、列表的增删改查、列表的嵌套、列表的切片

1. Python 字符串 1.1 字符串输入 input() 函数用于从用户获取字符串输入。它总是返回一个字符串类型的值。 # 从用户输入字符串 name input("请输入你的名字:") print(f"你好, {name}")1.2 字符串输出 字符串的输出通常使用 print() 函数…