Docker解析及安装
Docker 从入门到原理 — 完整指南
整合容器概念、虚拟化原理、Docker 架构、核心组件、面试速答于一篇
一、Docker 是什么
1.1 一句话定义
Docker 是一个容器化平台,让你可以把应用及其所有依赖打包进一个轻量级、可移植的"容器"中,做到"一次构建,到处运行"。
| 维度 | 描述 |
|---|---|
| 一句话定义 | 解决运行环境和配置问题的软件容器 |
| 核心理念 | "一次构建,到处运行"(Build Once, Run Anywhere) |
| 技术本质 | 容器虚拟化技术,方便持续集成并有助于整体发布 |
| 语言实现 | 基于 Go 语言开发的云开源项目 |
代码 + 依赖 + 配置 → 打包成镜像 → 在任何环境下运行 (开发环境) (标准化交付) (测试/预发/生产统一)
1.2 从三个视角理解容器
| 视角 | 理解 |
|---|---|
| 本质上 | 宿主机上的一个普通进程,有独立的命名空间和资源限制 |
| 功能上 | 应用的标准化包装箱,打包代码+依赖+配置,随处运行 |
| 运维上 | 简化服务管理,开发/测试/生产环境统一 |
1.3 容器解决什么问题
| 痛点 | 容器方案 |
|---|---|
| 环境不一致("我机器上能跑啊") | 镜像打包一切依赖,环境完全统一 |
| 部署繁琐 | 一条 docker run 命令部署整个服务 |
| 资源利用率低 | 共享宿主机内核,比虚拟机轻量得多 |
| 扩缩容困难 | 秒级启动新容器实例 |
| 版本回滚麻烦 | 镜像版本化,一键切回旧版本 |
二、虚拟化原理
2.1 虚拟化的背景
早年服务器资源利用率极低(一天里不到 20% 时间在工作,其余时间闲置浪费)。为了提高服务器资源利用率,研发了虚拟化技术。
2.2 虚拟化做了什么
虚拟化的核心思路:用软件"模拟"硬件功能
| 能力 | 说明 |
|---|---|
| 模拟操作系统 | 在一台物理机上运行多个独立的操作系统环境 |
| 精细化资源分配 | CPU、内存、磁盘、网络、I/O 按需分配与隔离 |
2.3 Hypervisor —— 虚拟化的核心组件
┌─────────┐ ┌─────────┐ ┌─────────┐ │ VM 1 │ │ VM 2 │ │ VM 3 │ ← 虚拟机(各自独立 Guest OS) ├─────────┤ ├─────────┤ ├─────────┤ │ GuestOS │ │ GuestOS │ │ GuestOS │ └────┬────┘ └────┬────┘ └────┬────┘ └─────────────┼─────────────┘ ┌────┴────┐ │Hypervisor│ ← 管理硬件资源,分给各 VM └────┬────┘ ┌────┴────┐ │ 物理硬件 │ ← CPU / MEM / DISK / NIC └─────────┘
Hypervisor 的作用:
-
直接运行在物理硬件之上(或操作系统之上)
-
管理系统所有资源(CPU、内存、磁盘、网络)
-
按需分配给每个虚拟机
-
保证各 VM 之间相互隔离
三、容器 vs 虚拟机
3.1 容器和虚拟化的关系
容器属于虚拟化的一种技术,但相比传统虚拟机,容器更为轻量、简单易用。
3.2 多维对比表
| 对比维度 | 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 占用空间 | MB 级(镜像,CentOS ~170M) | GB 级(完整 OS 镜像,数 GB) |
| 隔离级别 | 进程级隔离(namespace/cgroup) | 内核级隔离(独立 Guest OS) |
| 安全性 | 较弱(共享内核) | 较强(完全隔离) |
| 扩展能力 | 方便(秒级启动) | 比较麻烦(分钟级启动) |
| 资源损耗 | 几乎无(直接复用内核) | 有一定性能损耗(Guest OS 消耗) |
| 部署密度 | 一台宿主机 100 ~ 1000 个容器 | 通常 10~20 台 VM |
| 运行环境 | 必须与宿主机同系列内核(Linux 只能跑 Linux) | 可跨 OS(Linux 上跑 Windows) |
| 典型代表 | Docker / Containerd / Podman | VMware / KVM / Hyper-V |
3.3 本质区别 — 内核共享
虚拟机拥有完整的独立操作系统 + 独立内核;容器与宿主机共享同一个 Linux 内核。
操作系统内核文件可以分解为两部分:
┌──────────────────────────────────────┐ │ rootfs │ ← 个性化的部分 │ (各发行版不同的部分) │ CentOS / Ubuntu / Debian │ 应用程序、依赖库、配置文件... │ 各不相同 ├──────────────────────────────────────┤ │ bootfs │ ← 相同的部分 │ (所有 Linux 共用的内核引导文件) │ Linux Kernel 本身 │ VFS、网络栈、进程调度... │ 所有发行版都一样 └──────────────────────────────────────┘
| 虚拟机 | 容器 | |
|---|---|---|
| bootfs | 每台 VM 独立一份 | 共享宿主机内核 |
| rootfs | 每台 VM 独立一份 | 每个容器独立一份(镜像层) |
| 内核 | 每个 VM 自己跑一个完整内核 | 直接调用宿主机内核 |
| 启动开销 | 需要引导整个 OS(分钟级) | 直接启动进程(秒级) |
3.4 架构对比图解
虚拟机模式: 容器模式: ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ App A │ │ App B │ │ App A │ │ App B │ ├──────────┤ ├──────────┤ ├──────────┤ ├──────────┤ │ Bins/Libs│ │ Bins/Libs│ │ Bins/Libs│ │ Bins/Libs│ ├──────────┤ ├──────────┤ ├──────────┤ ┴──────────┘ │ Guest OS │ │ Guest OS │ │ Docker │ │ (独立内核) │ │ (独立内核) │ ├──────────────────────────┤ ├──────────┤ ├──────────┤ │ Host OS (共享内核) │ │ Hypervisor (VMware/KVM) │ ├──────────────────────────┤ ├──────────────────────────┤ │ Infrastructure │ │ Host OS (宿主机内核) │ └──────────────────────────┘ ├──────────────────────────┤ │ Infrastructure │ 每个容器没有独立操作系统, └──────────────────────────┘ 也没有独立内核 — 直接复用宿主机。
四、为什么使用 Docker — 三大优势
4.1 更轻量
| 指标 | 说明 |
|---|---|
| 基础镜像大小 | CentOS/Ubuntu 基础镜像仅约 170M |
| 部署密度 | 单台宿主机可部署 100 ~ 1000 个容器 |
| 启动速度 | 秒级启动(vs 虚拟机分钟级) |
4.2 更高效
无操作系统虚拟化开销,直接使用宿主机内核:
| 层面 | 实现方式 |
|---|---|
| 计算 | 轻量级,无 Guest OS 额外开销 |
| 存储 | 系统盘:aufs / devicemapper / overlayfs(联合文件系统) |
| 数据盘:Volume 数据卷(持久化存储) | |
| 网络 | 直接使用宿主机网络,通过 Network Namespace 隔离 |
4.3 更敏捷、更灵活
| 特性 | 说明 |
|---|---|
| 分层存储 | 镜像采用分层构建,共享基础层,节省磁盘空间 |
| DevOps 理念 | 开发即运维,CI/CD 无缝衔接 |
| 网络配置 | 支持 bridge / host / overlay / macvlan 等多种网络模式 |
Docker 五大核心价值
┌─────────────────────────────────────────────────┐ │ ① 一次构建,随处运行 │ │ ② 更快速的应用交付和部署 │ │ ③ 更便捷的升级和扩缩容 │ │ ④ 更简单的系统运维 │ │ ⑤ 更高效的计算资源利用 │ └─────────────────────────────────────────────────┘
五、Docker 核心组件
Docker 有三大核心概念,三者关系如下:
镜像(Image) │ │ docker run / docker create ▼ 容器(Container) │ │ docker commit / docker build + docker push ▼ 仓库(Registry)
5.1 镜像(Image)—— 只读模板
| 属性 | 说明 |
|---|---|
| 本质 | 只读的模板,包含运行应用所需的完整文件系统 |
| 类比 | 面向对象编程中的 类(Class) |
| 构建方式 | Dockerfile → docker build |
| 分层结构 | 每一层只读,多个镜像可共享底层,节省存储 |
docker images # 查看本地镜像 docker pull nginx:latest # 拉取镜像 docker rmi nginx:latest # 删除镜像 docker save -o nginx_latest nginx:latest # 导出镜像 docker load -i nginx_latest # 导入镜像 docker inspect image nginx:latest # 查看镜像详细信息
5.2 容器(Container)—— 运行实例
| 属性 | 说明 |
|---|---|
| 本质 | 用镜像创建的运行实例,在镜像只读层之上加一层可写层 |
| 类比 | 面向对象编程中的 对象(Object / Instance) |
| 特点 | 一个镜像可以创建很多容器,互不干扰 |
| 生命周期 | 创建 → 运行 → 停止 → 删除 |
docker run -itd --name nginx01 -p 80:80 nginx:latest # 创建并运行 docker run -itd --name nginx01 nginx:latest /bin/bash -c top #创建容器的同时可以后面跟/bin/bash -c 命令,指定创建后运行的第一个CMD指令。 docker ps # 查看运行中容器 docker ps -a # 查看所有容器 docker exec -it nginx01 bash # 进入容器 docker exec -it nginx01 bash -c '命令' # 不进入容器直接操作 docker cp nginx01:1.txt /opt/ # 复制文件到主机 docker cp 2.txt nginx01:/opt/ # 复制文件到容器 docker stop nginx01 # 停止 docker start nginx01 # 启动 docker rm nginx01 # 删除 docker rm -f nginx01 # 强制删除 docker inspect nginx01 # 查看容器详细信息
5.3 仓库(Registry)—— 镜像存储
| 属性 | 说明 |
|---|---|
| 本质 | 集中存放镜像文件的场所 |
| 类比 | 代码仓库 GitHub / GitLab |
| 公开仓库 | Docker Hub(hub.docker.com) |
| 国内镜像 | 阿里云 ACR / 华为云 SWR / 腾讯云 TCR |
| 私有仓库 | Harbor / Docker Registry |
docker pull nginx:latest # 拉取 docker tag myapp:1.0 registry.example.com/myapp:1.0 # 打标签 docker push registry.example.com/myapp:1.0 # 推送
六、Docker 架构
┌──────────┐ REST API ┌──────────────────────────────────┐
│ Client │ ───────────────────────→│ Docker Daemon │
│ (docker) │ ←───────────────────────│ ┌────────┬────────┬──────────┐ │
└──────────┘ 返回结果 │ │ Images │ 容器 │ Networks │ │
│ │ 镜像 │ 容器 │ 网络 │ │
│ ├────────┴────────┴──────────┤ │
│ │ 容器运行空间 │ │
│ │ Container A Container B │ │
│ └─────────────────────────────┘ │
└──────────────┬───────────────────┘
│ push / pull
▼
┌───────────────┐
│ Registry │
│ 镜像仓库 │
└───────────────┘
6.1 Docker Client(客户端)
-
用户通过
docker命令行与 Docker 交互 -
向 Docker Daemon 发送 REST API 请求
-
可远程连接其他机器上的 Daemon(
docker -H tcp://192.168.1.100:2375)
6.2 Docker Daemon(守护进程)
-
后台服务进程(
dockerd),接收 Client 的 API 请求 -
负责管理所有 Docker 对象:镜像、容器、网络、数据卷
-
与 Registry 通信完成镜像的拉取和推送
6.3 容器运行空间
-
每个容器是一个独立的进程空间
-
通过 Linux namespace 实现隔离(PID / NET / IPC / MNT / UTS)
-
通过 cgroup 实现资源限制(CPU / Memory / Disk I/O)
6.4 Registry(镜像仓库)
-
保存和分发 Docker 镜像
-
默认使用 Docker Hub(公开仓库)
-
企业环境通常部署私有仓库(Harbor)
七、容器隔离原理 — namespace + cgroup
容器依赖 Linux 内核的两大特性实现隔离:
| 机制 | 作用 | 类比 |
|---|---|---|
| namespace(命名空间) | 隔离视图 —— 让每个容器只能"看到"自己的进程、网络、文件系统 | 给每个犯人一间独立牢房 |
| cgroup(控制组) | 限制资源 —— 限制容器能使用的 CPU、内存、磁盘 I/O 上限 | 给每间牢房配给定量的水和食物 |
# 查看容器内的 namespace ls -la /proc/<PID>/ns/ # 查看容器的 cgroup 限制 cat /sys/fs/cgroup/cpu/docker/<container_id>/cpu.shares
八、存储与网络速查
8.1 存储方式
| 类型 | 说明 | 生命周期 |
|---|---|---|
| 联合文件系统(overlay2) | 镜像分层存储,容器可写层 | 随容器删除 |
| Volume(数据卷) | 宿主机指定目录挂载 | 独立于容器 |
| Bind Mount | 挂载宿主机任意路径 | 宿主机管理 |
8.2 网络模式
| 模式 | 说明 |
|---|---|
| bridge | 默认模式,容器通过 docker0 虚拟网桥通信(NAT) |
| host | 直接使用宿主机网络栈,性能最好 |
| none | 无网络,完全隔离 |
| overlay | 跨主机容器通信(Swarm / K8s 场景) |
九、速查表:核心概念总结
| 概念 | 一句话定义 |
|---|---|
| 虚拟化 | 用软件模拟硬件,实现资源池化与隔离 |
| Hypervisor | 虚拟化管理程序,管理硬件资源并分配给虚拟机 |
| 容器 | 轻量级虚拟化技术,共享宿主机内核,进程级隔离 |
| Docker | 当前最主流的容器引擎产品 |
| 镜像 | 只读模板,包含运行应用所需文件系统(类比 Class) |
| 容器 | 镜像的运行实例,只读层之上加可写层(类比 Object) |
| 仓库 | 集中存放和分发镜像文件的场所(类比 GitHub) |
| bootfs | 操作系统内核引导文件,所有 Linux 发行版通用 |
| rootfs | OS 个性化部分:应用程序、库、配置,发行版间不同 |
| namespace | Linux 内核机制,隔离进程/网络/文件系统视图 |
| cgroup | Linux 内核机制,限制进程组的 CPU/内存/IO 资源 |
十、安装部署
-
安装教程网站
https://docs.docker.com/install/linux/docker-ce/centos/
-
环境:准备好镜像仓库
wget -O /etc/yum.repos.d/docker-ce.repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
下载:安装对应依赖
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
-
加速:配置镜像加速器
## 创建配置目录
mkdir -p /etc/docker
## 编辑配置文件
vim /etc/docker/daemon.json
## 写入的内容
{
"registry-mirrors": [
"https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com",
"https://registry.cn-hangzhou.aliyuncs.com"
]
}
## 重启docker
systemctl restart docker
## 验证加速
docker info | grep -A 5 "Registry Mirrors"
-
自检:查看详细信息
docker version docker info
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)