容器技术是继大数据和云计算之后最具革命性的基础设施技术。本指南从生态系统全景出发,逐层深入核心原理与实战操作,带你系统掌握 Docker 容器技术。
文章目录
-
- 容器生态系统
-
- [(1) 为什么学习容器技术?](#(1) 为什么学习容器技术?)
- [(2) 鸟瞰容器生态系统](#(2) 鸟瞰容器生态系统)
- 容器核心技术
-
- [(1) 容器规范](#(1) 容器规范)
- [(2) 容器 Runtime](#(2) 容器 Runtime)
- [(3) 容器管理工具](#(3) 容器管理工具)
- [(4) 容器定义工具](#(4) 容器定义工具)
- [(5) Registry](#(5) Registry)
- [(6) 容器 OS](#(6) 容器 OS)
- 容器平台技术
-
- [(1) 容器编排引擎](#(1) 容器编排引擎)
- [(2) 容器管理平台](#(2) 容器管理平台)
- [(3) 基于容器的 PaaS](#(3) 基于容器的 PaaS)
- 容器支持技术
-
- [(1) 容器网络](#(1) 容器网络)
- [(2) 服务发现](#(2) 服务发现)
- [(3) 监控](#(3) 监控)
- [(4) 数据管理](#(4) 数据管理)
- [(5) 日志管理](#(5) 日志管理)
- [(6) 安全性](#(6) 安全性)
- [第 1 章 实战篇](#第 1 章 实战篇)
-
- [1. 环境准备与安装](#1. 环境准备与安装)
- [2. 运行第一个容器](#2. 运行第一个容器)
- [3. 运行第二个容器 ------ Web 服务器](#3. 运行第二个容器 —— Web 服务器)
- [4. Docker C/S 分离部署](#4. Docker C/S 分离部署)
-
- [Server 端配置(192.168.108.30)](#Server 端配置(192.168.108.30))
- [Client 端配置(192.168.108.31)](#Client 端配置(192.168.108.31))
- [验证 C/S 通信](#验证 C/S 通信)
- [第 2 章 容器架构](#第 2 章 容器架构)
-
- [1. 容器发展简史](#1. 容器发展简史)
- [2. What ------ 什么是容器?](#2. What —— 什么是容器?)
- [3. 容器 vs 虚拟机](#3. 容器 vs 虚拟机)
- [4. Why ------ 为什么需要容器?](#4. Why —— 为什么需要容器?)
- [5. How ------ Docker 架构详解](#5. How —— Docker 架构详解)
-
- [Docker 内部运行机制](#Docker 内部运行机制)
- [Docker 常用命令一览](#Docker 常用命令一览)
- [6. Docker 版本演进](#6. Docker 版本演进)
- [7. Docker 三大核心概念](#7. Docker 三大核心概念)
- 总结
容器生态系统
(1) 为什么学习容器技术?
容器技术当前正处于技术浪潮的中心------无论是 Google Trends 的搜索热度,还是各大企业的技术栈选型,Docker 及其生态的影响力都在持续攀升。
核心价值:
- 对 IT 行业:容器正在重塑软件交付与运维的范式,是云原生时代的基石。
- 对从业者:掌握容器技术既是市场的刚需,也是提升个人技术竞争力的关键路径。
容器技术虽然热门,但门槛不低------它涉及的知识面广、工具链长。本指南将兼顾理论与实践,从整体到细节,带你系统性地攻克这一技术栈。
(2) 鸟瞰容器生态系统
学习一项平台级技术,最怕的是迷失在碎片化的知识中。就像初到一座陌生城市,你需要先看地图,建立全局认知。
容器生态系统的学习地图:
- 容器生态系统包含哪些不同层次的技术?
- 不同技术之间是什么关系?
- 哪些是核心技术,哪些是辅助技术?
对容器技术有了整体认识之后,学习才能有的放矢、分清轻重缓急。
从宏观视角来看,容器生态系统由三大板块构成:
| 板块 | 定位 | 关键词 |
|---|---|---|
| 核心技术 | 让容器在单机上运行 | 规范、Runtime、管理工具 |
| 平台技术 | 让容器在集群中运行 | 编排、管理平台、PaaS |
| 支持技术 | 支撑容器化基础设施 | 网络、监控、日志、安全 |
Docker 是这个生态系统的基石,但完善的生态系统才是保障容器技术健康发展的决定因素。
容器核心技术
容器核心技术是指让 Container 在 Host OS 上运行起来的关键技术栈,包括以下六个层面:
(1) 容器规范
容器不仅仅是 Docker------CoreOS 的 rkt、红帽的 Podman、containerd 等都是重要的容器实现。为保证生态健康发展与跨平台兼容,Docker、CoreOS、Google 等公司共同成立了 Open Container Initiative(OCI),致力于制定开放的容器标准。
目前 OCI 发布了两大核心规范:
- Runtime Spec:定义容器的运行时行为
- Image Format Spec:定义容器镜像的标准格式
这两项规范确保了不同厂商开发的容器能够在不同的 Runtime 上运行,保障了容器的可移植性 和互操作性。
(2) 容器 Runtime
Runtime 是容器真正运行的地方,它需要与操作系统 Kernel 紧密协作,为容器提供运行环境。
类比理解:如果把容器比作 Java 程序,那么 Runtime 就是 JVM------JVM 为 Java 程序提供运行环境,Runtime 为容器提供运行环境。
当前主流的三种容器 Runtime:
| Runtime | 开发者 | 说明 |
|---|---|---|
| lxc | Linux 社区 | Linux 上老牌的容器 Runtime,Docker 最初也使用 lxc |
| runc | Docker | Docker 自研,符合 OCI 规范,是 Docker 的默认 Runtime |
| rkt | CoreOS | 符合 OCI 规范,能够运行 Docker 容器 |
(3) 容器管理工具
仅有 Runtime 还不够------用户需要工具来管理容器。容器管理工具对内与 Runtime 交互,对外为用户提供 CLI 等交互接口。
| Runtime | 管理工具 | 说明 |
|---|---|---|
| lxc | lxd | lxc 配套的管理工具 |
| runc | Docker Engine | 包含后台 Daemon 和 CLI 两部分,通常所说的 Docker 即指 Docker Engine |
| rkt | rkt CLI | rkt 的命令行管理工具 |
(4) 容器定义工具
容器定义工具允许用户定义容器的内容和属性,使容器能够被保存、共享和重建。
- Docker Image:Docker 容器的模板,Runtime 依据 Image 创建容器
- Dockerfile:包含若干命令的文本文件,通过这些命令构建 Docker Image
- ACI(App Container Image):CoreOS 开发的 rkt 容器镜像格式,与 Docker Image 类似
(5) Registry
容器通过 Image 创建,需要一个仓库来统一存放 Image------这就是 Registry。
| Registry | 类型 | 说明 |
|---|---|---|
| Docker Registry | 私有 | 企业可用于构建私有镜像仓库 |
| Docker Hub | 公共 | Docker 官方提供的托管 Registry,拥有海量现成镜像 |
| Quay.io | 公共 | Red Hat 旗下的公共托管 Registry |
(6) 容器 OS
虽然几乎所有的 Linux、macOS 和 Windows 都可以运行容器,但这并没有阻止容器专用操作系统的诞生。
容器 OS 是专门为运行容器而设计的操作系统,与通用 OS 相比:
- 体积更小,启动更快
- 为容器深度优化,运行效率更高
代表产品:CoreOS 、Atomic 、Ubuntu Core
容器平台技术
容器核心技术让容器能在单机上运行,而容器平台技术则让容器作为集群在分布式环境中运行。
(1) 容器编排引擎
基于容器的应用通常采用微服务架构------应用被划分为不同组件,以服务的形式运行在各自的容器中,通过 API 对外提供服务。为保证高可用,每个组件可能运行多个相同容器的副本,这些容器组成集群,根据业务需要被动态地创建、迁移和销毁。
编排(Orchestration) 通常包括:容器管理、调度、集群定义和服务发现。
| 编排引擎 | 主导方 | 说明 |
|---|---|---|
| Docker Swarm | Docker | Docker 原生编排引擎 |
| Kubernetes | 开源容器编排引擎,支持 Docker 和 CoreOS 容器,业界事实标准 | |
| Mesos + Marathon | Apache | 通用集群资源调度平台 |
(2) 容器管理平台
容器管理平台架构在编排引擎之上,提供更通用的抽象层。通常支持多种编排引擎,屏蔽底层实现细节,为用户提供 Application Catalog、一键部署等高级功能。
代表产品:Rancher 、ContainerShip
(3) 基于容器的 PaaS
为微服务应用开发者提供开发、部署和管理应用的一站式平台,使用户不必关心底层基础设施。
代表产品:Deis 、Flynn 、Dokku
容器支持技术
以下技术支撑着基于容器的完整基础设施:
(1) 容器网络
容器的出现使网络拓扑变得更加动态和复杂,需要专门的解决方案来管理容器间及容器与其他实体之间的连通性和隔离性。
| 方案 | 说明 |
|---|---|
| Docker Network | Docker 原生网络方案 |
| Flannel | CoreOS 开发的 overlay 网络方案 |
| Weave | Weaveworks 出品的容器网络方案 |
| Calico | 基于 BGP 的高性能容器网络 |
(2) 服务发现
在动态的微服务环境中,容器会被频繁创建、销毁和迁移,IP 和端口随之变化。服务发现机制保存集群中所有微服务的最新信息(如 IP、端口),并对外提供查询 API。
典型方案:etcd 、Consul 、ZooKeeper
(3) 监控
容器的动态特征对监控提出了更多挑战。
| 方案 | 说明 |
|---|---|
| docker ps / top / stats | Docker 原生 CLI 监控工具 |
| Docker Stats API | 通过 HTTP 请求获取容器状态 |
| cAdvisor / Heapster | Google 开源的容器监控方案 |
| Weave Scope | 可视化容器拓扑与监控 |
| Sysdig | 系统级容器监控与排障工具 |
(4) 数据管理
容器在不同 Host 之间迁移时,如何保证持久化数据也能动态迁移------Flocker 等数据管理工具提供的正是这一能力。
(5) 日志管理
| 方案 | 说明 |
|---|---|
| docker logs | Docker 原生日志工具 |
| Logspout | 日志路由工具,可收集不同容器的日志并转发给后端处理 |
(6) 安全性
容器的安全性一直是业界关注的焦点。OpenSCAP 能够对容器镜像进行安全扫描,发现潜在漏洞。
第 1 章 实战篇
1. 环境准备与安装
技术选型:
| 组件 | 选择 | 理由 |
|---|---|---|
| 管理工具 | Docker Engine | 最流行、使用最广泛 |
| Runtime | runc | Docker 默认 Runtime |
| 操作系统 | CentOS Stream 8 | 稳定的企业级 Linux |
前置准备: 克隆一台虚拟机,命名为 docker,配置静态 IP 192.168.108.30,主机名设为 docker。
卸载旧版本(可选)
bash
yum remove docker-ce
安装依赖工具
bash
# 安装必要工具
yum install -y yum-utils device-mapper-persistent-data lvm2 vim
# 添加 Docker CE 仓库(阿里云镜像源)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 构建缓存
yum makecache
安装 Docker CE
bash
# 安装 Docker
yum install -y docker-ce
# 启用并启动 Docker 服务
systemctl enable docker.service --now
验证安装
bash
# 查看 Docker 版本
docker --version
# 输出: Docker version 26.1.3, build b72abbb
# 查看 Docker 服务状态
systemctl status docker
配置镜像加速器
国内网络环境下,建议配置阿里云或华为云的镜像加速器以提升拉取速度。具体配置方式请参考对应云平台的官方文档。
2. 运行第一个容器
环境就绪,执行以下命令:
bash
docker run hello-world
执行过程解析:
- 从本地查找
hello-world镜像------未找到 - 从 Docker Hub 下载
hello-world镜像 - 启动
hello-world容器
清理实验环境
bash
# 删除所有容器
docker rm -f $(docker ps -aq)
# 删除 hello-world 镜像
docker rmi -f hello-world
3. 运行第二个容器 ------ Web 服务器
bash
docker run -d -p 80:80 httpd
执行过程解析:
- 从 Docker Hub 下载
httpd镜像(已内置 Apache HTTP Server) - 启动 httpd 容器,将容器的 80 端口映射到宿主机的 80 端口
验证服务
bash
curl 192.168.108.30
# 输出: <html><body><h1>It works!</h1></body></html>
浏览器访问 http://<宿主机IP>,即可看到 Apache 欢迎页面。
一个命令,你就拥有了一个 Web 服务器。这就是容器的魅力。
4. Docker C/S 分离部署
Docker 采用 Client/Server 架构,客户端和服务端可以分离部署在不同的主机上。
Server 端配置(192.168.108.30)
bash
# 配置主机名
hostnamectl set-hostname docker_server
# 配置静态网络
nmcli connection modify ens160 ipv4.method manual \
ipv4.addresses 192.168.108.30/24 \
ipv4.gateway 192.168.108.2 \
ipv4.dns 192.168.108.2 \
autoconnect yes
nmcli con up ens160
# 安装 Docker
yum install -y yum-utils device-mapper-persistent-data lvm2 vim
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache
yum install -y docker-ce
配置 Docker Daemon 监听 TCP:
bash
# 编辑 Docker 服务配置
vim /usr/lib/systemd/system/docker.service
# 在 ExecStart 参数末尾添加 -H tcp://0.0.0.0:2375
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
# 重载配置并重启
systemctl daemon-reload
systemctl restart docker.service
# 关闭防火墙(实验环境)
systemctl stop firewalld
验证监听端口:
bash
yum install -y lsof
lsof -i :2375
# 确认 dockerd 正在监听 2375 端口
Client 端配置(192.168.108.31)
bash
# 配置主机名和网络
hostnamectl set-hostname docker_client
nmcli connection modify ens160 ipv4.method manual \
ipv4.addresses 192.168.108.31/24 \
ipv4.gateway 192.168.108.2 \
ipv4.dns 192.168.108.2 \
autoconnect yes
nmcli con up ens160
# 仅安装 Docker CLI(不安装服务端)
yum install -y yum-utils device-mapper-persistent-data lvm2 vim
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache
yum install -y docker-ce-cli
验证 C/S 通信
bash
# 直接执行会报错(Client 端没有 Daemon)
docker run hello-world
# Error: Cannot connect to the Docker daemon...
# 指定远程 Server 执行
docker -H 192.168.108.30 run hello-world
# Hello from Docker!
# 查看远程 Server 上的镜像
docker -H 192.168.108.30 images
第 2 章 容器架构
1. 容器发展简史
| 年份 | 里程碑 |
|---|---|
| 1979 | Unix V7 引入 Chroot Jail,最早的容器化雏形 |
| 1982 | Chroot 加入 BSD |
| 2000 | FreeBSD 引入 FreeBSD Jail,增强隔离安全性 |
| 2001 | Linux VServer 推出,结合 chroot 与安全上下文实现 OS 级虚拟化 |
| 2004 | Solaris Containers 问世,使用 Zones 实现资源隔离 |
| 2006 | Google 推出 Process Containers ,后更名为 cgroups,合并进 Linux 内核 2.6.24 |
| 2008 | LXC 成为第一个 Linux 容器管理器,使用 cgroups + namespace |
| 2013 | Docker 发布,基于 LXC 并大幅优化体验,后以 libcontainer 替代 LXC |
| 2014 | Google 推出 LMCTFY ,核心概念移植至 libcontainer;CoreOS 发布 rkt |
2. What ------ 什么是容器?
容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。
容器由两部分组成:
- 应用程序本身
- 依赖:库、运行时、配置文件等
容器在 Host 操作系统的用户空间中运行,与操作系统的其他进程隔离。
3. 容器 vs 虚拟机
| 维度 | 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 毫秒 ~ 秒级 | 分钟级 |
| 系统内核 | 共享宿主机内核 | 独立内核 |
| 实现技术 | Namespace / Cgroup 等内核技术 | Hypervisor 层虚拟化 |
| 隔离级别 | 进程级隔离 | 系统资源级隔离 |
| 资源消耗 | 极低,接近原生进程 | 较高,需完整 OS 开销 |
| 运行密度 | 单机 1000+ 容器 | 单机一般 < 100 台 VM |
| 镜像机制 | 分层镜像,体积小(MB 级) | 非分层,体积大(GB 级) |
| 迁移性 | 优秀 | 一般 |
| 性能 | 接近原生 | 有虚拟化开销 |
| 典型场景 | DevOps、微服务、CI/CD | 硬件资源划分、异构 OS 运行 |
所有容器共享同一个 Host OS,这使得容器在体积上比虚拟机小得多。启动容器不需要启动整个操作系统,因此部署速度更快、开销更小、迁移更容易。
4. Why ------ 为什么需要容器?
一句话答案:容器使软件具备了超强的可移植能力。
容器解决的核心问题
现代系统架构远比十年前复杂------应用由多种服务(MQ、Cache、DB 等)组装而成,部署环境涵盖虚拟机、私有云、公有云。每种服务有自己的依赖,每种环境有自己的配置,形成了一个 N×M 的矩阵难题。
Docker 从集装箱(同样英文单词 "Container")的发明中汲取了灵感:
| 维度 | 集装箱 | Docker |
|---|---|---|
| 打包对象 | 几乎任何货物 | 任何软件及其依赖 |
| 跨平台兼容 | 标准接口,适配各种交通工具 | 无需修改,运行在几乎所有平台 |
| 隔离性 | 货物互不影响 | 资源、网络、库完全隔离 |
| 自动化 | 标准接口,自动装卸 | 标准化操作,适合自动化运维 |
| 高效性 | 无需开箱,快速转运 | 轻量级,快速启动和迁移 |
| 职责分工 | 货主装箱,承运方运输 | 开发者写代码,运维者配环境 |
对开发者 :Build Once, Run Anywhere
对运维者:Configure Once, Run Anything
5. How ------ Docker 架构详解
Docker 采用经典的 Client/Server 架构,核心组件如下:
| 组件 | 说明 |
|---|---|
| Docker Client | 用户交互入口,通过 CLI 发送命令 |
| Docker Daemon (dockerd) | 服务端,侦听 API 请求,管理镜像、容器、网络和卷 |
| REST API | Client 与 Daemon 之间的通信协议 |
| Docker Image | 只读模板,用于创建容器 |
| Docker Container | 镜像的可运行实例 |
| Registry | 镜像仓库(Docker Hub / Harbor 等) |
| Services | Swarm 模式下的集群服务抽象 |
Docker 内部运行机制
- 用户通过 Docker Client 向 Docker Daemon 发送请求
- Docker Daemon 作为架构主体,接收并处理请求
- Docker Engine 以 Job 的形式执行具体工作
- 需要镜像时,从 Registry 下载,通过 Graph Driver 以分层方式存储
- 需要网络时,通过 Network Driver 创建并配置容器网络
- 需要限制资源或执行指令时,通过 Exec Driver 完成
- Libcontainer 是独立的容器管理包,Network Driver 和 Exec Driver 通过它操作容器
Docker 常用命令一览
bash
# 查看 Docker 帮助
docker
# 核心命令速查
docker run # 创建并运行容器
docker exec # 在运行中的容器内执行命令
docker ps # 列出容器
docker build # 从 Dockerfile 构建镜像
docker pull # 从仓库拉取镜像
docker push # 推送镜像到仓库
docker images # 列出本地镜像
docker login # 登录镜像仓库
docker search # 搜索 Docker Hub 上的镜像
docker version # 查看版本信息
docker info # 查看系统信息
6. Docker 版本演进
| 阶段 | 版本 | 说明 |
|---|---|---|
| Docker Engine | 0.1.0 ~ 1.13.1 | 2017 年 3 月前的命名 |
| Docker CE | 17.03+ | 社区版(Community Edition),免费使用 |
| Docker EE | 17.03+ | 企业版(Enterprise Edition),商业支持 |
版本号采用 YY.MM 的时间格式,每季度发布一个正式版本。CE 维护期 4 个月,EE 维护期 12 个月。
7. Docker 三大核心概念
镜像(Image)
只读模板,包含创建容器的全部指令。镜像可以基于其他镜像进行增量定制。
容器(Container)
镜像的可运行实例。可以启动、停止、删除,彼此相互隔离。可以看作一个轻量级的 Linux 系统环境。
仓库(Repository)
集中存放镜像的场所。分为:
- 公开仓库(Public):如 Docker Hub,提供海量公共镜像
- 私有仓库(Private):企业内部自建,如 Harbor
总结
容器技术是云原生时代的基础设施,而 Docker 是这一领域最具影响力的开创者。本指南从容器生态系统的全景视角出发,系统梳理了核心技术(规范、Runtime、管理工具、定义工具、Registry、容器 OS)、平台技术(编排引擎、管理平台、PaaS)和支持技术(网络、服务发现、监控、日志、安全)三大板块,并深入剖析了 Docker 的 Client/Server 架构与核心概念。通过动手实践安装部署、运行容器以及 C/S 分离架构的实验,你将不仅理解"容器是什么"和"为什么需要容器",更能在真实环境中驾驭 Docker。掌握这些基础,就为后续深入 Kubernetes、微服务架构和云原生体系打下了坚实的根基。