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
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐