从入门到进阶Docker 核心原理与实战全解析作为 DevOps / 运维开发方向的学习者我在学习 Docker 过程中整理了这份笔记希望能帮助大家系统理解 Docker 的核心概念、底层原理与生产实践。一、Docker 基础概念与架构1.1 什么是 DockerDocker 是一种容器化技术它通过操作系统层面的虚拟化机制将应用及其依赖打包成可移植的容器实现一次构建到处运行。与虚拟机的核心区别虚拟机虚拟出完整硬件运行独立操作系统资源开销大、启动慢。Docker容器直接共享宿主机内核无独立内核与虚拟硬件更轻量、启动更快。核心优势在一台物理机上可运行数十个隔离的容器实例资源利用率极高。1.2 Docker 三大组件Docker 采用经典的 C/S 架构核心由三部分组成组件作用Docker Client客户端用户通过 docker build/pull/run 等命令与 Docker 守护进程交互Docker Daemon (HOST)服务端后台运行的守护进程负责管理镜像、容器、网络等资源Docker Registry镜像仓库存储和分发 Docker 镜像如 Docker Hub、私有仓库1.3 核心对象镜像与容器镜像 (Image)一个只读模板包含运行应用所需的文件系统、依赖和配置是创建容器的基础。容器 (Container)镜像的运行实例是一个被隔离的进程拥有独立的文件系统、网络和进程空间。仓库 (Registry)存放镜像的地方分为公有仓库如 Docker Hub和私有仓库企业内部使用。二、Docker 镜像分层存储与管理2.1 镜像分层原理Docker 镜像由多个只读层叠加而成这是 Docker 高效存储和分发的核心每层只记录文件系统的变化增量存储避免重复数据。多个镜像可共享底层层大幅节省存储空间。镜像层是只读的所有修改都发生在容器运行时的可写层。2.2 查看镜像分层docker history通过docker history可以直观看到镜像的构建过程dockerhistorynginx:alpine输出字段含义IMAGE ID镜像层唯一标识CREATED构建时间CREATED BY构建时执行的 Dockerfile 指令如 RUN, COPY, CMDSIZE该层新增的数据大小0B 表示仅元数据无实际文件2.3 镜像标签管理标签是镜像的别名方便我们识别和管理不同版本的镜像打标签dockertag nginx:alpine my-nginx:v1删除标签dockerrmi my-nginx:v1⚠️注意docker rmi默认删除的是镜像标签。若删除最后一个标签镜像会变成悬空镜像只有 ID无名称物理数据仍在磁盘上需用docker image prune清理。2.4 镜像存储原理Docker 镜像默认存储在/var/lib/docker/目录下核心目录结构/var/lib/docker/ ├── image/ # 镜像元数据类似图书馆索引卡片 ├── overlay2/ # 镜像和容器的实际层数据overlay2 是默认存储驱动 ├── containers/ # 容器运行时数据 └── volumes/ # 数据卷持久化存储overlay2 存储驱动负责实现分层 联合挂载将多个只读层和一个可写层挂载成一个完整的文件系统。元数据 vs 实际文件元数据/var/lib/docker/image/overlay2/imagedb/content/sha256/记录镜像信息。实际层数据/var/lib/docker/overlay2/layer-id/diff/存储每层的文件变化。2.5 镜像的导出与导入离线迁移在无法联网的环境中可通过 save/load 实现镜像迁移导出镜像为 tar 包dockersave-onginx-alpine.tar nginx:alpine# -o 指定输出文件路径验证导出文件ls-lhnginx-alpine.tar# -h 人性化显示文件大小KB/MB/GB导入本地 tar 包为镜像dockerload-inginx-alpine.tar# -i 指定输入文件效果与docker pull一致只是数据源来自本地文件而非网络仓库。三、Docker 容器生命周期与资源管理3.1 容器本质被隔离的进程容器不是微型虚拟机本质是宿主机上的一个普通 Linux 进程只是被两大技术关进小黑屋Namespace实现进程、网络、文件系统等资源的隔离让容器感觉自己是独立系统。Cgroups限制容器可使用的 CPU、内存、进程数等资源避免耗尽宿主机资源。3.2 容器启动与端口映射启动容器的核心命令dockerrun-d--namemy-nginx-p80:80 nginx参数解析-d后台运行容器守护进程模式否则命令会卡住终端。--name为容器指定自定义名称方便后续操作。-p 80:80端口映射将宿主机 80 端口流量转发到容器 80 端口。原理Docker 告诉 Linux 内核所有访问宿主机 80 端口的请求都转发到容器内部的 80 端口。3.3 容器生命周期管理3.3.1 资源限制运维核心“无限制不生产”生产环境必须限制容器资源dockerrun-d--namelimited-app\--memory512m\# 内存限制最多512MB--memory-swap512m\# 总内存上限内存交换分区--cpus0.5\# CPU 限制最多使用 0.5 核nginx:alpine不限制内存的后果容器可能耗尽宿主机内存导致系统崩溃。--memory-swap包含内存和交换分区的总上限等于--memory时表示禁用交换分区。3.3.2 重启策略生产推荐配置重启策略让容器在异常退出时自动恢复策略行为适用场景no默认不自动重启测试环境on-failure[:3]仅当容器非 0 退出码时重启最多重试 3 次可自愈的应用always无论退出原因始终重启核心服务unless-stopped除非手动执行 docker stop否则自动重启生产环境推荐示例dockerrun-d--nameunless-restart--restartunless-stopped nginx:alpine3.3.3 健康检查健康检查让 Docker 主动判断服务是否可用而不仅是看进程是否存活dockerrun-d--nameunhealthy-app\--health-cmdcurl -f http://localhost || exit 1\--health-interval5s\# 每 5 秒检查一次--health-timeout3s\# 检查超时时间--health-retries3\# 重试 3 次后标记为不健康--health-start-period10s\# 启动后 10 秒内不检查nginx:alpine--health-cmd在容器内部执行的检查命令返回 0 表示健康非 0 表示不健康。场景Nginx 进程虽在但配置错误导致服务不可用健康检查能及时发现并触发告警或重启。3.4 容器网络原理Docker 网络基于 Linux 网络虚拟化技术核心组件docker0 网桥虚拟交换机所有容器默认连接到此网桥实现容器间通信。veth pair虚拟网线一端在容器内eth0一端在宿主机上vethxxx连接容器与网桥。iptables NAT实现端口映射和容器访问外网。关键没有 docker0 网桥容器只能与宿主机点对点通信无法互相访问。四、Docker 为什么比虚拟机快这是面试和学习中常被问到的问题核心原因有两点更少的抽象层虚拟机需要模拟硬件、运行独立 OS抽象层级多。Docker 直接共享宿主机内核跳过了硬件模拟和 Guest OS 启动环节。秒级启动容器启动就是启动一个隔离进程无需完整操作系统初始化启动时间从分钟级缩短到秒级甚至毫秒级。五、常用命令速查操作命令示例拉取镜像docker pull nginx:alpine启动容器docker run -d -p 80:80 --name my-nginx nginx进入容器docker exec -it my-nginx /bin/bash查看容器docker ps -a-a 显示所有容器包括停止的查看日志docker logs 容器ID/名称停止容器docker stop 容器ID/名称删除容器docker rm 容器ID/名称清理悬空镜像docker image prune总结这份笔记从 Docker 基础架构、镜像分层、容器生命周期到网络原理完整覆盖了从入门到生产实践的核心知识点。Docker 的核心魅力在于轻量、高效、可移植理解其底层的 Linux Namespace、Cgroups 和联合文件系统才能真正用好这个工具。下一步可以深入学习 Docker Compose多容器编排和 Kubernetes容器集群管理向云原生方向进阶。