docker-完整深度详解

Docker 完整深度详解

·16 分钟阅读·6133 字
📋 目录

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. 三大核心底层支撑(容器三大基石)

  1. Namespace 命名空间:资源隔离(PID、网络、挂载、用户等)
  2. Cgroup 控制组:限制容器CPU、内存、磁盘IO资源上限
  3. RootFS + 分层文件系统(overlay2):镜像分层读写、写时复制CoW

2. Docker 整体架构(C/S架构)

Docker 采用客户端/服务端分离架构:

  1. Docker Client(客户端)
    docker 命令行工具,用户输入 docker run/images/ps 等指令,通过REST API发送请求给服务端。
  2. Docker Daemon(dockerd 守护进程)
    后台常驻服务,管理本地镜像、容器、网络、存储卷;处理客户端所有请求,调度底层内核接口创建容器。
  3. Docker Registry(镜像仓库)
    存储镜像仓库:公共Docker Hub、企业私有Harbor/Registry;提供镜像pull拉取、push推送能力。
  4. Docker Objects 核心对象
    镜像(Image)、容器(Container)、网络(Network)、数据卷(Volume)。

3. 四大核心对象完整详解

3.1. (一)镜像 Image:静态只读模板

  1. 定义
    镜像为分层只读文件系统,打包应用代码、运行时、库、环境变量、配置;是创建容器的模板。
  2. 分层机制 overlay2(默认存储驱动)
  • 每一条RUN/COPY/ADD生成一层只读层;
  • 分层缓存:文件未修改,构建复用缓存,加速打包;
  • 写时复制 CoW:容器修改文件时,把只读层文件复制到容器可写层修改,不改动原镜像。
  1. 镜像标识
    仓库地址/项目/镜像名:标签,例 nginx:1.25harbor.com/web/demo:v1.0
    不推荐latest浮动标签,生产固定版本号保证一致性。
  2. 基础操作
# 拉取镜像
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:镜像运行实例

  1. 定义
    镜像启动后的运行实体,拥有独立可写层;一个镜像可启动成千上百个独立容器,互相隔离。
  2. 容器生命周期
    创建(create) → 启动(start) → 运行(running) → 暂停(pause) → 停止(stop) → 删除(rm)
  3. 核心运行机制
  • 共享镜像所有只读分层;
  • 单独分配一层可读写层,容器删除,可写层数据丢失(不挂载卷情况下);
  • 通过Namespace隔离网络、进程、挂载目录;Cgroup限制资源。
  1. 常用核心命令
# 交互式启动容器(前台)
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. 容器1号进程规则
    容器内PID 1为镜像CMD/ENTRYPOINT程序;1号进程退出,容器直接销毁。
    docker stop 默认发送SIGTERM(15)优雅停止,超时后强制SIGKILL(9)杀死。

3.3. (三)网络 Network:容器通信隔离

Docker内置4种原生网络驱动,可自定义网桥隔离业务:

  1. bridge(默认网桥)
    宿主机虚拟网桥docker0;所有容器默认接入;同网桥容器互通,通过iptables实现端口映射、外网SNAT转发。
    原理:veth pair虚拟网卡,一端容器内eth0,一端宿主机网桥。
  2. host 共享宿主机网络
    容器不创建独立网络命名空间,直接复用宿主机网卡、端口;无端口映射,性能高,但端口冲突风险大。
  3. none 无网络
    容器禁用所有网络栈,无网卡,完全隔离网络。
  4. 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:容器持久化数据

容器可写层随容器删除丢失,数据持久化依靠三类挂载方案:

  1. Named Volume 命名数据卷(生产推荐)
    Docker自行管理存储目录,独立于容器生命周期;删除容器卷数据保留,适合数据库、日志持久化。
# 创建卷
docker volume create mysql-data
# 挂载使用
docker run -v mysql-data:/var/lib/mysql mysql
  1. Bind Mount 宿主机目录绑定挂载
    直接映射宿主机指定目录到容器;依赖宿主机目录结构,多节点调度数据不一致,生产慎用。
docker run -v /host/data:/container/data nginx
  1. tmpfs 内存临时挂载
    数据存放宿主机内存,读写速度极高,重启/容器销毁数据丢失,用于缓存临时文件,对应K8s EmptyDir内存模式。
docker run --tmpfs /cache nginx

3.4.1. 关键区分

  • docker volume:生命周期独立,Docker统一管理,推荐持久业务数据;
  • bind mount:强耦合宿主机,环境迁移麻烦,有权限、数据丢失风险;
  • 镜像分层只读,卷挂载会覆盖容器内对应目录文件。

4. Dockerfile 镜像构建脚本详解

Dockerfile 是文本构建指令,自动化打包镜像,核心指令分基础、运行、高级三类:

4.1. 基础核心指令

  1. FROM:指定基础镜像,必须第一行;多阶段构建可写多个FROM
  2. WORKDIR:设置容器工作目录,自动创建
  3. COPY [源 目标]:复制本地文件到镜像,仅本地文件
  4. ADD:类似COPY,支持自动解压压缩包、远程URL文件
  5. RUN:构建阶段执行shell命令,生成镜像只读分层
  6. ENV:设置容器运行环境变量
  7. EXPOSE:声明容器监听端口,仅文档作用,不会自动映射端口

4.2. 运行指令(区分CMD/ENTRYPOINT)

  1. ENTRYPOINT:容器启动主执行程序,不可被run命令覆盖
  2. CMD:默认启动参数,可被docker run 末尾参数覆盖
    组合用法:ENTRYPOINT主程序 + CMD默认参数,灵活传参。

4.3. 进阶安全&优化指令

  1. USER:指定非root用户运行容器,安全加固,禁止root容器
  2. ARG:构建阶段临时参数,仅build时生效,容器运行不可见
  3. HEALTHCHECK:容器健康自检,自动判定服务是否存活
  4. 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 六大隔离空间

为每个容器创建独立资源视图,容器看不到宿主机与其他容器资源:

  1. PID Namespace:独立进程树,容器内PID 1≠宿主机PID
  2. Net Namespace:独立网卡、路由、iptables、端口栈
  3. Mount Namespace:独立文件系统挂载视图,屏蔽宿主机目录
  4. User Namespace:容器内root映射宿主机普通用户,降低逃逸风险
  5. IPC Namespace:独立进程通信队列、信号量
  6. 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. 容器安全进阶知识点

  1. 非root运行容器:Dockerfile USER 指定普通用户,规避root权限逃逸
  2. Capability 细粒度权限
    容器默认剥离高危Linux权限(挂载、修改网络、内核操作);
    --cap-drop ALL 全部删除,--cap-add 按需添加所需权限;禁止--privileged全开权限。
  3. 只读文件系统
    --read-only 容器整体只读,仅挂载卷目录可写,防止恶意写入篡改程序。
  4. Seccomp 系统调用过滤
    限制容器可执行的内核系统调用,阻断高危操作。
  5. 镜像安全:固定版本标签、清理yum/apt缓存、trivy镜像漏洞扫描、私有仓库HTTPS鉴权。

8. 镜像仓库 Registry & Harbor

  1. 官方Registry:轻量私有仓库,无UI、权限、扫描能力,仅存储镜像。
  2. Harbor企业级仓库
    可视化Web界面、多项目权限隔离、镜像漏洞扫描、跨仓库同步、HTTPS、RBAC账户管理,生产环境标准私有仓库。
  3. 镜像推拉鉴权:docker login 登录仓库,配置证书解决私有仓库HTTPS证书信任问题。

9. Docker 完整生产最佳实践

  1. 镜像:使用多阶段构建瘦身,固定版本标签,alpine/distroless轻量化基础镜像;
  2. Dockerfile:禁止容器root运行,添加健康检查,分层优化缓存;
  3. 存储:业务持久化统一使用Named Volume,杜绝Bind Mount;
  4. 网络:业务隔离自定义网桥,区分多业务网络;
  5. 资源:所有容器配置CPU/内存限制,避免资源抢占雪崩;
  6. 安全:禁用privileged,删除多余capability,镜像漏洞扫描;
  7. 日志:程序输出stdout/stderr,不写容器内本地文件,对接日志采集;
  8. 编排:单机开发使用Compose,集群生产迁移K8s。

10. Docker 与 Kubernetes 的关系

  1. Docker 是容器运行时,负责单机镜像、容器生命周期管理;
  2. K8s 是集群编排平台,统一调度多台宿主机上的Docker容器;
  3. K8s 底层依赖Docker完成容器创建、启停、存储网络挂载;
  4. 学习路线:吃透Docker底层原理,才能理解K8s存储、网络、资源限制底层实现逻辑。

11. 学习路线总结

  1. 基础:镜像、容器基础命令、Dockerfile基础、compose基础使用;
  2. 进阶:多阶段构建、overlay2分层原理、三种存储卷、四类网络模式;
  3. 底层:Namespace/Cgroup/overlay2三大隔离技术;
  4. 安全:cap权限、只读文件系统、非root运行、镜像加固;
  5. 工程:Harbor私有仓库、离线镜像迁移、生产规范、向K8s过渡。

关联文档