Docker
Docker 是一个开源的容器化平台,用于开发、部署和运行应用程序,核心价值是把应用连同依赖打包成镜像,实现"一次构建、到处运行"。
适用场景:微服务架构部署、开发环境一致性、持续集成/持续部署(CI/CD)、应用隔离、快速扩缩容。
本目录下还有 Dockerfile(镜像构建语法与多阶段构建)和 Docker命令(安装、镜像、容器、网络、Compose 等命令参考),可配合阅读。
安装与配置
不同系统(CentOS、Ubuntu、macOS/Windows)的安装步骤、一键安装脚本、镜像加速器配置以及卸载方法,详见 Docker命令 的「Docker 安装」「配置镜像加速器」章节。
容器与虚拟机
容器与虚拟机都解决"应用隔离运行",但隔离层次不同:虚拟机虚拟化整台硬件,每个虚拟机自带完整操作系统;容器共享宿主机内核,只隔离进程及其视角(文件系统、网络、进程树)。
| 维度 | 虚拟机 | 容器 |
|---|---|---|
| 隔离层级 | 硬件级虚拟化(独立内核) | 进程级隔离(共享宿主机内核) |
| 资源开销 | 大:每台虚拟机一套完整 OS | 小:只多几个隔离层 |
| 启动速度 | 分钟级 | 秒级 |
| 镜像体积 | GB 级 | MB 级 |
| 隔离强度 | 强(内核完全独立) | 弱(共享内核,存在逃逸风险) |
直观类比:镜像像编程中的类,容器是类实例化的对象——模板定义"长什么样",实例才是真正运行的个体。
核心概念
镜像(Image)
镜像解决应用交付的一致性问题:把代码、运行时、库、环境变量和配置文件打包成 只读模板,任何机器上都能启动出相同环境,避免"在我机器上能跑"的差异。其工作方式是分层存储——每条构建指令新增一个只读层,构建时复用未变化的层,运行时所有层叠加,任何修改都发生在容器层。因为镜像是只读的,运行时不能直接改镜像,应用升级要靠构建新镜像。分层的价值在于复用与增量:构建时缓存复用未变层、镜像传输只传变化层、多个镜像可共享同一基础层——这也是 Docker 镜像比虚拟机镜像小得多的原因。
容器(Container)
容器是镜像的运行实例,解决"如何隔离运行应用"的问题:同一镜像可启动多个容器,相互独立互不干扰。工作时 Docker 在镜像的只读层上叠加一个可写层,并通过内核的进程/网络隔离与资源限制机制提供轻量级运行环境。边界在于:可写层随容器删除而丢失,需要持久化的数据必须用数据卷。一次 docker run 背后:守护进程拉取镜像 → 叠加可写层 → 创建隔离的进程/网络/文件系统视图 → 启动容器主进程。容器本质上是宿主机上的一个普通进程,只是看不见宿主机上的其他进程和资源。
仓库(Repository)
仓库是镜像的存储与分发中心,解决镜像共享问题:构建好的镜像推送到仓库,任何机器拉取即可运行,团队无需互相传递镜像文件。工作机制是 push/pull——docker push 上传、docker pull 下载;Docker Hub 是最大的公共仓库,也可用 Registry 自建私有仓库。
数据管理
Docker 提供数据卷(Volume)实现容器数据持久化。数据卷绕过容器的文件系统,直接写入宿主机,容器删除后数据不丢失。
⚠️ 注意:数据卷容器的生命周期持续到没有容器使用为止。一旦持久化到本地,本地数据不会自动删除。
数据卷的挂载方式(直接挂载、具名挂载、匿名挂载)、读写权限控制(ro/rw)、以及数据卷容器的共享机制,详见 Docker命令 中的「Docker 数据持久化」章节。
网络管理
Docker 提供 bridge(桥接,默认)、none、host、container 四种网络模式,区别在于容器网络与宿主机网络的关系:
| 模式 | 工作方式 | 适用场景 |
|---|---|---|
| bridge(默认) | 容器经 veth 虚拟网卡挂到 docker0 网桥,容器间通过网桥转发;外部访问需 -p 端口映射 | 单机多容器互联,最常用 |
| host | 容器直接使用宿主机网络栈,无独立 IP,性能最好 | 对网络性能敏感的服务 |
| none | 容器无任何网络接口 | 纯计算、无需网络的任务 |
| container | 与指定容器共享网络命名空间 | 需要与共享容器同网络环境(如边车代理) |
bridge 模式下的通信链路:容器 eth0 → veth 虚拟网卡对 → docker0 网桥 → 目标容器或宿主机网络。所有网络接口均为虚拟接口,容器删除后对应网桥随之消失。
Docker 的自定义网络、network 命令、以及 veth-pair 技术原理,详见 Docker命令 中的「Docker 网络」章节。
Docker Compose
Docker Compose 通过 YAML 文件声明式地定义多容器应用:镜像、端口、环境变量、依赖关系都写进一个文件,一条 docker-compose up 拉起整个应用栈,避免逐个 docker run 的手工操作。声明式的好处是可重复、可版本管理、服务依赖关系清晰,适合开发、测试和 CI 场景。Compose 的安装、YAML 语法、常用命令和编排示例,详见 Docker命令 中的「Docker Compose」章节。
镜像构建
Dockerfile 的指令体系、CMD 与 ENTRYPOINT 的区别、多阶段构建技巧和最佳实践,详见 Dockerfile。
镜像发布
将构建好的镜像推送到远程仓库供团队或生产环境使用:
# 登录仓库
docker login -u 用户名 -p 密码 仓库地址
# 打标签
docker tag 本地镜像ID 仓库地址/项目/镜像名:版本
# 推送
docker push 仓库地址/项目/镜像名:版本Docker Swarm
Docker Swarm 是 Docker 的原生集群管理功能,把多台 Docker 主机汇聚成一台"虚拟主机",解决单机容量有限、宕机即中断的问题。Swarm 使用 Raft 协议保证一致性:Raft 是分布式共识协议,集群状态变更必须得到多数节点确认才生效,因此管理节点数需 >= 3(3 节点中挂掉 1 台仍可工作),多数节点存活才能正常调度。
# 初始化管理节点
docker swarm init --advertise-addr 172.19.70.0
# 获取加入令牌
docker swarm join-token manager
docker swarm join-token worker
# 工作节点加入集群
docker swarm join --token SWMTKN-xxx 172.19.70.0:2377扩缩容服务:
docker service update --replicas 3 my-nginx
# 或
docker service scale my-nginx=3| 概念 | 说明 |
|---|---|
| swarm | 集群管理层,初始化后其他节点凭 token 加入,形成统一调度的主机池 |
| node | 集群中的一台 Docker 主机,分管理节点(manager)与工作节点(worker)两类 |
| service | 服务的抽象定义,声明镜像、副本数等期望状态,由管理节点调度 |
| task | 调度的最小单元,service 每部署一个副本产生一个 task,对应一个容器 |
常见问题处理
容器无法启动
- 检查端口是否被占用:
netstat -tulpn | grep 端口号 - 检查镜像是否存在:
docker images - 查看容器日志:
docker logs 容器ID
磁盘空间不足
- 清理未使用的镜像:
docker image prune - 清理未使用的容器:
docker container prune - 清理未使用的卷:
docker volume prune
网络连接问题
- 检查容器网络配置:
docker network inspect 网络名 - 检查容器端口映射:
docker port 容器ID - 测试容器间连通性:
docker exec 容器ID ping 目标容器