(一) Docker架构介绍
一、Docker架构图示
+-------------------+ +-------------------+ +-------------------+
| Docker客户端 | <---> | Docker守护进程 | <---> | Docker Registry |
| (Docker CLI) | | (Docker Daemon) | | (镜像仓库) |
+-------------------+ +-------------------+ +-------------------+
| | |
v v v
+-------------------+ +-------------------+ +-------------------+
| 用户指令 | | 镜像管理 | | 镜像存储 |
| (docker run等) | | (构建、运行容器) | | (Docker Hub等) |
+-------------------+ +-------------------+ +-------------------+
二、核心组件详解
-
Docker客户端(Docker CLI)
- 用户交互工具,通过命令行发送指令(如
docker build
、docker run
)。 - 与守护进程通信(默认通过Unix Socket或TCP)。
- 用户交互工具,通过命令行发送指令(如
-
Docker守护进程(Docker Daemon)
- 后台服务,负责管理镜像、容器、网络和存储。
- 核心功能:
- 镜像构建(
docker build
) - 容器生命周期管理(启动、停止、删除)
- 网络配置(桥接、主机、自定义网络)
- 存储管理(卷、绑定挂载)
- 镜像构建(
-
Docker Registry
- 镜像仓库,存储和分发Docker镜像。
- 公共仓库:Docker Hub
- 私有仓库:Harbor、Nexus等。
三、关键技术与流程
-
分层存储(UnionFS)
- 镜像由多个只读层叠加组成,容器在顶层添加可写层。
- 优势:高效复用、节省存储空间。
-
命名空间(Namespaces)与控制组(Cgroups)
- Namespaces:隔离容器的进程、网络、文件系统等资源。
- Cgroups:限制容器的CPU、内存、磁盘I/O等资源使用。
-
镜像构建流程
- 用户编写
Dockerfile
定义应用环境。 - 守护进程逐层执行指令生成镜像。
- 用户编写
四、典型工作流程
-
构建镜像
- 用户编写
Dockerfile
→docker build
生成镜像 → 推送至Registry。
- 用户编写
-
运行容器
docker pull
拉取镜像 →docker run
启动容器。
-
管理容器
- 守护进程管理容器的运行、网络和存储。
五、Docker架构优势
- 轻量级:基于分层存储,启动快、体积小。
- 隔离性:通过Namespaces实现进程、网络等资源隔离。
- 可移植性:镜像可在任何支持Docker的环境中运行。
- 自动化:支持CI/CD流水线集成,快速部署。
六、补充说明
- Docker网络:支持桥接、主机、覆盖网络(Overlay)等多种模式。
- Docker存储:支持卷(Volume)、绑定挂载(Bind Mount)等存储方式。
Docker通过分层存储、命名空间和控制组等技术,实现了高效、隔离的应用容器化运行。
(二) Docker网络架构与机制
一、Docker网络核心概念
-
网络驱动(Network Driver)
Docker提供多种网络驱动实现不同隔离级别:bridge
:默认驱动,容器通过虚拟网桥连接(类似NAT)host
:容器直接使用主机网络(无隔离)overlay
:跨主机的容器通信(用于Swarm集群)macvlan
:给容器分配MAC地址(直接接入物理网络)none
:完全隔离(无网络)
-
网络模式对比表
模式 隔离性 IP分配 适用场景 bridge 中 Docker分配 单机开发测试 host 低 主机IP 高性能网络应用 overlay 高 Swarm分配 跨主机容器通信 macvlan 高 物理网络IP 需要直接接入物理网络 none 最高 无 完全隔离环境
二、Docker网络工作原理
-
三层网络架构
-
关键组件
- veth pair:虚拟网卡对,一端在容器内,一端连接到Docker网桥
- Docker网桥(docker0):默认的Linux网桥,管理容器间通信
- NAT规则:实现容器访问外网时的地址转换
三、常用网络操作命令
# 查看所有网络
docker network ls
# 创建自定义网络(bridge模式)
docker network create --driver bridge my-network
# 运行容器并连接到指定网络
docker run -d --name web --network my-network nginx
# 查看容器网络详情
docker inspect web | grep IPAddress
# 连接已有容器到网络
docker network connect my-network another-container
四、跨主机通信方案
-
Overlay网络(Swarm模式)
- 使用VXLAN技术实现跨主机通信
- 需要先初始化Swarm集群:
docker swarm init
- 创建overlay网络:
docker network create --driver overlay my-overlay-net
-
Host模式直接通信
- 容器直接使用主机网络,适合高性能场景
- 示例:
docker run --network host my-app
五、网络故障排查
-
常见命令
# 查看容器网络配置 docker inspect <容器ID> | grep -A 10 NetworkMode # 测试网络连通性 docker exec -it <容器ID> ping <目标IP> # 查看Docker网络详细信息 docker network inspect <网络名>
-
典型问题解决
-
容器无法访问外网:
- 检查主机网络是否正常
- 检查Docker的DNS配置(
/etc/docker/daemon.json
) - 检查NAT规则是否生效
-
跨主机通信失败:
- 确认Swarm集群已正确初始化
- 检查overlay网络是否创建在所有节点上
- 检查防火墙是否放行VXLAN端口(默认4789)
-
六、最佳实践建议
- 开发环境:使用bridge模式+自定义网络
- 生产环境:
- 单机:使用bridge模式+固定IP分配
- 多机:使用overlay网络+Swarm/Kubernetes编排
- 安全建议:
- 避免使用host模式除非必要
- 为不同应用创建独立网络
- 使用网络策略限制容器间通信
Docker网络通过灵活的驱动机制和分层架构,既满足了开发测试的便捷性需求,也能支持复杂的生产环境部署场景。理解其底层原理有助于更好地设计和排查网络问题。
(三) Docker网络与Kubernetes网络的区别
一、设计目标差异
-
Docker网络
- 定位:单机容器网络解决方案
- 核心目标:解决单个主机上多个容器间的通信问题
- 典型场景:开发测试环境、单机微服务部署
-
Kubernetes网络
- 定位:集群级容器网络解决方案
- 核心目标:实现跨主机、跨Pod的统一网络模型
- 典型场景:生产环境、大规模分布式系统
二、网络模型对比
对比维度 | Docker网络 | Kubernetes网络 |
---|---|---|
网络范围 | 单机 | 跨主机集群 |
通信方式 | 基于Docker网桥/NAT | 基于Pod IP直接通信(无NAT) |
IP分配 | Docker管理(默认动态分配) | 集群统一管理(通常静态分配) |
服务发现 | 需手动配置或使用Docker Compose | 内置Service机制自动服务发现 |
跨主机通信 | 需借助overlay网络(如Flannel) | 原生支持跨主机Pod通信 |
网络策略 | 需借助第三方工具(如Calico) | 原生支持NetworkPolicy |
三、关键技术差异
-
Pod网络模型(Kubernetes特有)
- Kubernetes将容器分组为Pod,每个Pod拥有独立IP
- Pod内所有容器共享网络命名空间(可直接通过
localhost
通信) - 与Docker的区别:Docker的容器默认是独立网络命名空间
-
Service机制
- Kubernetes通过Service提供稳定的虚拟IP(ClusterIP)
- 自动负载均衡到后端Pod
- Docker替代方案:需手动配置负载均衡或使用Docker Compose
-
网络策略(NetworkPolicy)
- Kubernetes原生支持基于标签的网络访问控制
- 可精细控制Pod间通信规则
- Docker替代方案:需借助Calico等第三方工具
四、典型架构对比
五、实际应用场景
-
选择Docker网络的场景
- 本地开发测试
- 单机运行的微服务
- 不需要跨主机通信的简单应用
-
选择Kubernetes网络的场景
- 生产环境部署
- 需要跨主机/跨节点的服务通信
- 需要服务发现和负载均衡
- 需要网络策略控制
六、集成方式
当需要在Kubernetes中使用Docker作为容器运行时:
- Kubernetes会调用Docker API创建Pod内的容器
- 但网络层由Kubernetes的CNI插件(如Flannel、Calico)管理
- 最终形成:Docker管理容器,Kubernetes管理网络的分层架构
七、总结
- Docker网络:解决单机容器通信问题,简单易用
- Kubernetes网络:解决集群级容器通信问题,功能强大但复杂
- 关系:Kubernetes可以基于Docker运行,但会覆盖其网络层实现
两者本质是不同层次的网络解决方案,Kubernetes在Docker基础上构建了更完整的分布式网络模型。