Docker 完整深度详解
核心概念 Docker 是基于 Linux 内核隔离技术的容器化引擎,把应用、依赖、环境统一打包为镜像,一次构建随处运行。
1. Docker 核心定义与诞生背景
1.1. 什么是 Docker
Docker 是一套基于Linux内核隔离技术的容器化引擎,把应用、依赖、运行环境统一打包为镜像,一次构建、随处运行;
解决传统环境痛点:开发、测试、生产环境不一致、软件依赖冲突、部署繁琐、资源利用率低。
1.2. 容器 vs 虚拟机 核心区别
| 维度 | Docker容器 | KVM/VMware虚拟机 |
| 内核 | 共享宿主机Linux内核 | 自带完整独立操作系统内核 |
| 资源开销 | 轻量,MB级启动,秒级创建 | 重量级,GB级内存,分钟级启动 |
| 隔离粒度 | 用户态资源隔离(Namespace) | 硬件级完全隔离CPU/内存/磁盘 |
| 镜像体积 | MB级别 | GB级别 |
| 启动速度 | 毫秒/秒级 | 数十秒 |
1.3. 三大核心底层支撑(容器三大基石)
- Namespace 命名空间:资源隔离(PID、网络、挂载、用户等)
- Cgroup 控制组:限制容器CPU、内存、磁盘IO资源上限
- RootFS + 分层文件系统(overlay2):镜像分层读写、写时复制CoW
2. Docker 整体架构(C/S架构)
Docker 采用客户端/服务端分离架构:
- Docker Client(客户端)
docker命令行工具,用户输入docker run/images/ps等指令,通过REST API发送请求给服务端。 - Docker Daemon(dockerd 守护进程)
后台常驻服务,管理本地镜像、容器、网络、存储卷;处理客户端所有请求,调度底层内核接口创建容器。 - Docker Registry(镜像仓库)
存储镜像仓库:公共Docker Hub、企业私有Harbor/Registry;提供镜像pull拉取、push推送能力。 - Docker Objects 核心对象
镜像(Image)、容器(Container)、网络(Network)、数据卷(Volume)。
3. 四大核心对象完整详解
3.1. (一)镜像 Image:静态只读模板
- 定义
镜像为分层只读文件系统,打包应用代码、运行时、库、环境变量、配置;是创建容器的模板。 - 分层机制 overlay2(默认存储驱动)
- 每一条
RUN/COPY/ADD生成一层只读层; - 分层缓存:文件未修改,构建复用缓存,加速打包;
- 写时复制 CoW:容器修改文件时,把只读层文件复制到容器可写层修改,不改动原镜像。
- 镜像标识
仓库地址/项目/镜像名:标签,例nginx:1.25、harbor.com/web/demo:v1.0;
不推荐latest浮动标签,生产固定版本号保证一致性。 - 基础操作
# 拉取镜像
docker pull nginx:1.25
# 查看本地镜像
docker images
# 基于Dockerfile构建镜像
docker build -t demo:v1 .
# 删除镜像
docker rmi demo:v1
# 查看镜像分层历史
docker history nginx:1.25
# 导出/导入离线镜像
docker save -o nginx.tar nginx:1.25
docker load -i nginx.tar
3.2. (二)容器 Container:镜像运行实例
- 定义
镜像启动后的运行实体,拥有独立可写层;一个镜像可启动成千上百个独立容器,互相隔离。 - 容器生命周期
创建(create) → 启动(start) → 运行(running) → 暂停(pause) → 停止(stop) → 删除(rm) - 核心运行机制
- 共享镜像所有只读分层;
- 单独分配一层可读写层,容器删除,可写层数据丢失(不挂载卷情况下);
- 通过Namespace隔离网络、进程、挂载目录;Cgroup限制资源。
- 常用核心命令
# 交互式启动容器(前台)
docker run -it --name test centos:7 /bin/bash
# 后台守护运行容器
docker run -d --name nginx -p 8080:80 nginx:1.25
# 查看运行中容器
docker ps
# 查看所有容器(含停止)
docker ps -a
# 进入运行中容器终端
docker exec -it nginx /bin/bash
# 停止/启动/重启容器
docker stop nginx
docker start nginx
docker restart nginx
# 查看容器日志
docker logs -f nginx
# 删除容器
docker rm nginx
# 查看容器完整配置信息
docker inspect nginx
- 容器1号进程规则
容器内PID 1为镜像CMD/ENTRYPOINT程序;1号进程退出,容器直接销毁。
docker stop默认发送SIGTERM(15)优雅停止,超时后强制SIGKILL(9)杀死。
3.3. (三)网络 Network:容器通信隔离
Docker内置4种原生网络驱动,可自定义网桥隔离业务:
- bridge(默认网桥)
宿主机虚拟网桥docker0;所有容器默认接入;同网桥容器互通,通过iptables实现端口映射、外网SNAT转发。
原理:veth pair虚拟网卡,一端容器内eth0,一端宿主机网桥。 - host 共享宿主机网络
容器不创建独立网络命名空间,直接复用宿主机网卡、端口;无端口映射,性能高,但端口冲突风险大。 - none 无网络
容器禁用所有网络栈,无网卡,完全隔离网络。 - container 复用其他容器网络
新容器共享指定容器的netns,共用IP、localhost互通;K8s pause容器实现sidecar共享网络底层原理。
3.3.1. 高级网络拓展
- 自定义网桥:
docker network create web-net,实现多业务网络隔离; - macvlan/ipvlan:容器分配宿主机网段独立物理IP,无端口映射;
- DNS解析:同一自定义网桥内,容器名直接互相访问。
3.3.2. 端口映射原理
-p 宿主机端口:容器端口
底层配置iptables DNAT,外网访问宿主机端口转发至容器内部端口;容器访问外网通过SNAT转换源IP为宿主机IP。
3.4. (四)存储 Volume:容器持久化数据
容器可写层随容器删除丢失,数据持久化依靠三类挂载方案:
- Named Volume 命名数据卷(生产推荐)
Docker自行管理存储目录,独立于容器生命周期;删除容器卷数据保留,适合数据库、日志持久化。
# 创建卷
docker volume create mysql-data
# 挂载使用
docker run -v mysql-data:/var/lib/mysql mysql
- Bind Mount 宿主机目录绑定挂载
直接映射宿主机指定目录到容器;依赖宿主机目录结构,多节点调度数据不一致,生产慎用。
docker run -v /host/data:/container/data nginx
- tmpfs 内存临时挂载
数据存放宿主机内存,读写速度极高,重启/容器销毁数据丢失,用于缓存临时文件,对应K8s EmptyDir内存模式。
docker run --tmpfs /cache nginx
3.4.1. 关键区分
- docker volume:生命周期独立,Docker统一管理,推荐持久业务数据;
- bind mount:强耦合宿主机,环境迁移麻烦,有权限、数据丢失风险;
- 镜像分层只读,卷挂载会覆盖容器内对应目录文件。
4. Dockerfile 镜像构建脚本详解
Dockerfile 是文本构建指令,自动化打包镜像,核心指令分基础、运行、高级三类:
4.1. 基础核心指令
FROM:指定基础镜像,必须第一行;多阶段构建可写多个FROMWORKDIR:设置容器工作目录,自动创建COPY [源 目标]:复制本地文件到镜像,仅本地文件ADD:类似COPY,支持自动解压压缩包、远程URL文件RUN:构建阶段执行shell命令,生成镜像只读分层ENV:设置容器运行环境变量EXPOSE:声明容器监听端口,仅文档作用,不会自动映射端口
4.2. 运行指令(区分CMD/ENTRYPOINT)
ENTRYPOINT:容器启动主执行程序,不可被run命令覆盖CMD:默认启动参数,可被docker run 末尾参数覆盖
组合用法:ENTRYPOINT主程序 + CMD默认参数,灵活传参。
4.3. 进阶安全&优化指令
USER:指定非root用户运行容器,安全加固,禁止root容器ARG:构建阶段临时参数,仅build时生效,容器运行不可见HEALTHCHECK:容器健康自检,自动判定服务是否存活VOLUME:声明匿名挂载目录,不推荐业务使用
4.4. 多阶段构建(进阶核心,镜像瘦身)
解决编译工具、源码占用镜像体积问题:分构建阶段、运行阶段,仅拷贝编译产物,丢弃编译环境。
示例Go极简镜像:
# 编译阶段
FROM golang:1.22 as builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o demo main.go
# 运行空白镜像,仅拷贝二进制程序
FROM scratch
COPY --from=builder /app/demo /demo
CMD ["/demo"]
5. Docker Compose 单机多容器编排
5.1. 定位
单机多容器批量管理工具,通过compose.yaml统一定义多个服务、网络、卷;一键启停整套环境,适合本地开发、单机小型中间件集群。
5.2. 核心能力
- 一次性创建多个关联容器(Nginx+后端+MySQL+Redis)
- 统一自定义网络,容器通过服务名互通
- 管理命名数据卷持久化
- 配置服务启动依赖、重启策略、健康检查、资源限制
5.3. 常用命令
# 后台启动整套服务
docker compose up -d
# 停止并删除容器,保留卷
docker compose down
# 查看日志
docker compose logs -f
# 扩容副本
docker compose up --scale web=3
6. 底层三大隔离技术(面试高频)
6.1. Namespace 六大隔离空间
为每个容器创建独立资源视图,容器看不到宿主机与其他容器资源:
- PID Namespace:独立进程树,容器内PID 1≠宿主机PID
- Net Namespace:独立网卡、路由、iptables、端口栈
- Mount Namespace:独立文件系统挂载视图,屏蔽宿主机目录
- User Namespace:容器内root映射宿主机普通用户,降低逃逸风险
- IPC Namespace:独立进程通信队列、信号量
- UTS Namespace:独立主机名、域名
6.2. Cgroup 资源限制
限制容器硬件资源上限,防止单容器耗尽整机资源:
- cpu:限制CPU核心数、调度权重
- memory:内存上限,超出触发OOM杀死容器
- blkio:磁盘读写IO限速
- pids:容器最大进程数量限制
运行参数示例:
docker run --cpus 0.5 --memory 512m --pids-limit 100 nginx
6.3. RootFS 分层文件系统 overlay2
镜像分层只读,容器单独一层可写;修改文件触发写时复制CoW,不污染基础镜像;多个容器共享同一份镜像只读层,节省磁盘空间。
7. 容器安全进阶知识点
- 非root运行容器:Dockerfile USER 指定普通用户,规避root权限逃逸
- Capability 细粒度权限
容器默认剥离高危Linux权限(挂载、修改网络、内核操作);
--cap-drop ALL全部删除,--cap-add按需添加所需权限;禁止--privileged全开权限。 - 只读文件系统
--read-only容器整体只读,仅挂载卷目录可写,防止恶意写入篡改程序。 - Seccomp 系统调用过滤
限制容器可执行的内核系统调用,阻断高危操作。 - 镜像安全:固定版本标签、清理yum/apt缓存、trivy镜像漏洞扫描、私有仓库HTTPS鉴权。
8. 镜像仓库 Registry & Harbor
- 官方Registry:轻量私有仓库,无UI、权限、扫描能力,仅存储镜像。
- Harbor企业级仓库
可视化Web界面、多项目权限隔离、镜像漏洞扫描、跨仓库同步、HTTPS、RBAC账户管理,生产环境标准私有仓库。 - 镜像推拉鉴权:
docker login登录仓库,配置证书解决私有仓库HTTPS证书信任问题。
9. Docker 完整生产最佳实践
- 镜像:使用多阶段构建瘦身,固定版本标签,alpine/distroless轻量化基础镜像;
- Dockerfile:禁止容器root运行,添加健康检查,分层优化缓存;
- 存储:业务持久化统一使用Named Volume,杜绝Bind Mount;
- 网络:业务隔离自定义网桥,区分多业务网络;
- 资源:所有容器配置CPU/内存限制,避免资源抢占雪崩;
- 安全:禁用privileged,删除多余capability,镜像漏洞扫描;
- 日志:程序输出stdout/stderr,不写容器内本地文件,对接日志采集;
- 编排:单机开发使用Compose,集群生产迁移K8s。
10. Docker 与 Kubernetes 的关系
- Docker 是容器运行时,负责单机镜像、容器生命周期管理;
- K8s 是集群编排平台,统一调度多台宿主机上的Docker容器;
- K8s 底层依赖Docker完成容器创建、启停、存储网络挂载;
- 学习路线:吃透Docker底层原理,才能理解K8s存储、网络、资源限制底层实现逻辑。
11. 学习路线总结
- 基础:镜像、容器基础命令、Dockerfile基础、compose基础使用;
- 进阶:多阶段构建、overlay2分层原理、三种存储卷、四类网络模式;
- 底层:Namespace/Cgroup/overlay2三大隔离技术;
- 安全:cap权限、只读文件系统、非root运行、镜像加固;
- 工程:Harbor私有仓库、离线镜像迁移、生产规范、向K8s过渡。
关联文档