当前位置: 首页 > ai >正文

Docker 入门教程(九):容器网络与通信机制

文章目录

  • 🐳 Docker 入门教程(九):容器网络与通信机制
    • 一、Docker 网络模型
    • 二、Docker 的四种网络类型
    • 三、容器间通信机制
    • 四、相关指令

🐳 Docker 入门教程(九):容器网络与通信机制


一、Docker 网络模型

Docker 网络建立在 Linux 的标准网络堆栈之上。

你可以把 Docker 的默认网络结构理解为这样:

[容器A] -- vethA --┐│[docker0] -- [eth0/eth1] -- 外网│
[容器B] -- vethB --┘
  • 每个容器都有自己的虚拟网卡(veth)
  • 它连到一个桥接设备(如 docker0)
  • Docker 使用 NAT 和 iptables 把容器网络流量转发出去

二、Docker 的四种网络类型

1. bridge(默认网络)

docker run -it ubuntu
  • 容器会被接入 docker0 网桥
  • 它会获得一个私有 IP,如 172.17.0.2
  • 容器与容器通信需要通过 IP 地址
  • 不支持容器名通信(除非用 extra hosts)

原理:

  • veth pair 虚拟网卡连接容器与宿主的 docker0 网桥
  • iptables + NAT 转发出网流量

2. host 网络(共享主机)

docker run --network host nginx
  • 容器直接用宿主的网络协议栈
  • 没有独立 IP,容器中的 localhost 就是宿主
  • 所有端口直接暴露在宿主上
  • 性能高(少一层 NAT)
  • 安全性低,容易冲突

3. none 网络(禁用)

docker run --network none alpine
  • 容器没有任何网络接口(除了 lo
  • 它无法 ping、curl、connect 到任何外部主机
  • 完全隔离

用于:

  • 极端安全场景(如跑本地算法模型)
  • 自己配置网络(如 macvlan)

4. 自定义 bridge 网络(推荐)

docker network create mynet
  • 容器获得独立私有 IP(如 172.18.x.x)
  • 自动启用 Docker 内建 DNS 服务器
  • 可以通过容器名通信
  • 网络隔离,跨网络无法互通(unless connect)

这是生产中建议的做法


三、容器间通信机制

默认网络:不能用容器名通信

docker run -dit --name a1 busybox
docker run -dit --name a2 busybox
docker exec -it a1 ping a2  # 无法解析

因为默认网络没有 DNS 解析;只能用 IP 访问,但 IP 每次变化

自定义网络下:支持 DNS 容器名通信

docker network create mynet
docker run -dit --name a1 --network mynet busybox
docker run -dit --name a2 --network mynet busybox
docker exec -it a1 ping a2 # 成功

Docker 会在该网络中启用 DNS 服务,自动解析容器名;每个容器注册自己的名字


四、相关指令

docker network ls

列出所有网络,包括系统默认和自定义的:

docker network ls

输出示例:

NETWORK ID     NAME        DRIVER    SCOPE
d72e7e0a6f8b   bridge      bridge    local
d8c7d1ed43e7   host        host      local
192e5ee1525d   none        null      local
ac28c2fbad1f   mynet       bridge    local

docker network inspect <网络名>

查看网络的详细信息,包括:

  • 连接了哪些容器
  • 分配了哪些 IP
  • DNS 名称等
docker network inspect mynet

docker network create [参数] <网络名>

创建一个自定义网络(推荐):

docker network create mynet

也可以加参数:

docker network create \--driver bridge \--subnet 192.168.100.0/24 \--gateway 192.168.100.1 \mynet

Docker 默认使用 bridge 驱动,你也可以用 overlay(Swarm)或 macvlan(高级网络映射)


docker network rm <网络名>

删除网络(网络中不能有容器,否则会失败):

docker network rm mynet

docker network connect

将某个容器连接到另一个网络:

docker network connect mynet mycontainer
  • 容器可以连接多个网络
  • 可用于跨网段打通通信

docker network disconnect

将容器从某网络断开:

docker network disconnect mynet mycontainer

如果容器只连接了一个网络,断开后它将失去网络功能。


调试

docker exec 进入容器内测试连接

docker exec -it myapp ping otherapp
docker exec -it myapp nslookup otherapp
docker exec -it myapp curl http://otherapp:5000

docker inspect <容器名> 查看网络配置

docker inspect myapp

重点字段:

"Networks": {"mynet": {"IPAddress": "172.18.0.2",...}
}
http://www.xdnf.cn/news/14709.html

相关文章:

  • React-Find 一款能快速在网页定位到源码的工具,支持React19.x/next 15
  • 【AI时代速通QT】第四节:Windows下Qt Creator调试指南
  • 【c/c++3】类和对象,vector容器,类继承和多态,systemd,stdboost
  • 「Java案例」输出24个希腊字母
  • 双指针的用法
  • Vue 3 Teleport 特性
  • 人工智能之数学基础:如何判断正定矩阵和负定矩阵?
  • 矩阵的逆 线性代数
  • LRU缓存设计与实现详解
  • Spring Cloud:服务监控与追踪的高级实践
  • C# 合并两个byte数组的几种方法
  • 零基础学习RabbitMQ(5)--工作模式(1)
  • C/C++数据结构之动态数组
  • ali PaddleNLP docker
  • vue-31(Nuxt.js 中的数据获取:asyncData和fetch)
  • XIP (eXecute In Place)
  • Spring AI Alibaba Nacos 集成实践
  • 【C++ 基础】 C++ 与 C 语言差异面试题(附大厂真题解析)
  • 【智能协同云图库】智能协同云图库第三弹:基于腾讯云 COS 对象存储—开发图片模块
  • 【Linux高级全栈开发】2.3.1 协程设计原理与汇编实现2.3.2 协程调度器实现与性能测试
  • 原型设计Axure RP网盘资源下载与安装教程共享
  • 【记录】服务器多用户共享Conda环境——Ubuntu24.04
  • 进阶向:Django入门,从零开始构建一个Web应用
  • Word之电子章制作——1
  • kubectl exec 原理
  • 力扣第73题-矩阵置零
  • Flutter基础(Children|​​Actions|Container|decoration|child)
  • git使用详解和示例
  • 【区块链】区块链交易(Transaction)之nonce
  • 【Docker基础】Docker容器管理:docker stats及其参数详解