1.1 什么是容器化技术
传统部署方式的痛点
在传统的软件部署中,我们经常遇到这样的问题:
- 环境差异:"在我的机器上能运行"成为开发与运维之间的经典矛盾
- 依赖冲突:不同应用需要不同版本的库或运行时
- 资源浪费:为了隔离应用,不得不为每个应用准备独立的服务器或虚拟机
- 部署复杂:需要在每台机器上重复配置环境、安装依赖
容器化技术的解决方案:容器化技术通过将应用程序及其所有依赖打包到一个独立的、可移植的单元中,彻底解决了上述问题。
容器的核心特征:
- 封装性:应用程序、依赖库、配置文件统一打包
- 隔离性:每个容器拥有独立的文件系统、进程空间、网络栈
- 轻量级:共享宿主机内核,启动速度快,资源占用少
- 可移植性:在任何支持容器的平台上运行,行为一致
容器 vs 进程
容器本质上是一个特殊的进程,但它通过Linux内核的命名空间(Namespace)和控制组(Cgroups)技术实现了隔离:
传统进程: - 共享操作系统资源 - 可以相互干扰 - 依赖系统环境 容器进程: - 独立的文件系统视图 - 独立的网络栈 - 受控的资源配额 - 自包含的运行环境1.2 Docker的发展历史
起源与诞生
- 2013年3月:Docker由dotCloud公司(后更名为Docker Inc.)开源发布
- 初衷:简化应用部署,提高开发效率
- 技术基础:基于Linux容器技术(LXC),后发展出自己的容器运行时libcontainer
关键里程碑
- 2014年:Docker 1.0发布,生产就绪
- 2015年:Docker公司推出Docker Hub,Docker Compose,Docker Machine
- 2016年:Docker原生支持Swarm集群编排
- 2017年:Kubernetes成为容器编排的事实标准,Docker开始支持Kubernetes
- 2019年:Docker企业版出售给Mirantis
- 2020年:Kubernetes弃用Docker作为容器运行时(但Docker镜像仍然兼容)
生态系统演进
Docker推动了整个容器生态的发展:
Docker生态系统: ├── 容器运行时:containerd, runc ├── 镜像格式:OCI (Open Container Initiative) ├── 编排工具:Kubernetes, Docker Swarm ├── 镜像仓库:Docker Hub, Harbor, Quay └── 监控工具:Prometheus, cAdvisor1.3 Docker vs 虚拟机:架构对比
虚拟机架构
+------------------+ +------------------+ | Application | | Application | +------------------+ +------------------+ | Libraries | | Libraries | +------------------+ +------------------+ | Guest OS | | Guest OS | +------------------+ +------------------+ | | | Hypervisor (VMware/KVM) | | | +----------------------------------------+ | Host Operating System | +----------------------------------------+ | Physical Hardware | +----------------------------------------+Docker容器架构
+----------+ +----------+ +----------+ | App A | | App B | | App C | +----------+ +----------+ +----------+ | Libs | | Libs | | Libs | +----------+ +----------+ +----------+ | | | Docker Engine | | | +--------------------------------------+ | Host Operating System | +--------------------------------------+ | Physical Hardware | +--------------------------------------+关键区别对比
| 特性 | 虚拟机 | Docker容器 |
|---|---|---|
| 启动速度 | 分钟级 | 秒级甚至毫秒级 |
| 资源占用 | GB级(包含完整OS) | MB级(共享内核) |
| 性能开销 | 较高(硬件虚拟化) | 接近原生 |
| 隔离级别 | 操作系统级别 | 进程级别 |
| 镜像大小 | GB级 | MB级 |
| 操作系统 | 可运行不同OS | 共享宿主机内核 |
| 适用场景 | 完全隔离、跨平台OS | 微服务、快速迭代 |
技术实现差异
虚拟机:
- 通过Hypervisor(如KVM、VMware)进行硬件虚拟化
- 每个VM运行完整的操作系统
- CPU、内存、I/O都需要虚拟化层转换
Docker容器:
- 使用Linux内核的Namespace进行隔离(PID、NET、IPC、MNT、UTS、USER)
- 使用Cgroups进行资源限制
- 直接调用宿主机内核,无需额外虚拟化层
何时选择虚拟机?
虚拟机仍然有其不可替代的场景:
- 需要运行不同操作系统:如在Linux上运行Windows应用
- 更强的安全隔离:敏感应用需要完全隔离
- 内核级别操作:需要修改或测试内核参数
- 遗留系统迁移:将物理机迁移到虚拟环境
容器与虚拟机的结合
在生产环境中,两者常常结合使用:
物理服务器 └── 虚拟机1 (Ubuntu) └── Docker容器A (Nginx) └── Docker容器B (MySQL) └── 虚拟机2 (CentOS) └── Docker容器C (App) └── Docker容器D (Redis)这种架构结合了虚拟机的安全隔离和容器的轻量高效。
1.4 Docker的核心价值和应用场景
核心价值
1. 环境一致性
问题:开发、测试、生产环境不一致导致的"能运行"问题
Docker方案:
# 开发环境 docker run -d myapp:1.0 # 测试环境 docker run -d myapp:1.0 # 生产环境 docker run -d myapp:1.0同一个镜像,在任何环境中行为完全一致。
2. 快速交付与部署
传统方式:
- 准备服务器
- 安装操作系统
- 配置环境变量
- 安装依赖(Python、Node.js、MySQL等)
- 部署应用代码
- 调试配置
Docker方式:
dockerrun -d -p80:80 myapp:latest一条命令,几秒钟完成部署。
3. 资源利用率提升
在同样的硬件资源下:
- 虚拟机:可能只能运行10个虚拟机
- Docker:可以运行100个甚至更多容器
4. 微服务架构的理想载体
单体应用 → 微服务拆分 用户服务 (Container 1) 订单服务 (Container 2) 支付服务 (Container 3) 商品服务 (Container 4) 每个服务独立开发、部署、扩展典型应用场景
场景1:Web应用部署
# 前端应用dockerrun -d -p80:80 nginx-frontend# 后端APIdockerrun -d -p8080:8080 api-backend# 数据库dockerrun -d -p3306:3306 mysql:8.0场景2:持续集成/持续部署 (CI/CD)
# GitLab CI配置示例build:stage:buildscript:-docker build-t myapp:$CI_COMMIT_SHA .-docker push myapp:$CI_COMMIT_SHAdeploy:stage:deployscript:-docker pull myapp:$CI_COMMIT_SHA-docker stop myapp||true-docker run-d--name myapp myapp:$CI_COMMIT_SHA场景3:开发环境标准化
团队成员使用统一的开发环境:
# 所有开发者运行相同的开发环境docker-composeup# 包含:# - Python 3.9# - PostgreSQL 13# - Redis 6# - Nginx场景4:多版本测试
同时测试应用在不同环境下的表现:
# Python 3.8环境dockerrun -v$(pwd):/app python:3.8 python /app/test.py# Python 3.9环境dockerrun -v$(pwd):/app python:3.9 python /app/test.py# Python 3.10环境dockerrun -v$(pwd):/app python:3.10 python /app/test.py场景5:大数据与机器学习
# 运行Jupyter Notebookdockerrun -p8888:8888 jupyter/datascience-notebook# 运行TensorFlow训练dockerrun --gpus all -v$(pwd):/workspace tensorflow/tensorflow:latest-gpu场景6:数据库快速部署与迁移
# 快速启动MySQL用于开发dockerrun -d\--name mysql-dev\-eMYSQL_ROOT_PASSWORD=123456\-p3306:3306\mysql:8.0# 数据库迁移:导出dockerexecmysql-dev mysqldump -uroot -p123456 mydb>backup.sql# 数据库迁移:导入到新容器dockerexec-i mysql-prod mysql -uroot -ppassword mydb<backup.sql场景7:微服务编排
使用Docker Compose管理复杂的微服务应用:
version:'3'services:web:image:myapp-webports:-"80:80"api:image:myapp-apidepends_on:-db-cachedb:image:postgres:13cache:image:redis:6ROCm虚拟化栈场景
针对ROCm开发,Docker可以提供:
# 运行特定版本的ROCm环境dockerrun --device=/dev/kfd --device=/dev/dri\--group-add video\rocm/rocm-terminal:5.7\rocminfo# 构建和测试ROCm应用dockerrun -v$(pwd):/workspace\rocm/dev-ubuntu-22.04:5.7\bash-c"cd /workspace && make && ./test"1.5 Docker的局限性
了解Docker的局限性同样重要:
1. 不适合运行图形界面应用
虽然有解决方案(X11转发),但比较复杂且性能不佳。
2. 持久化数据需要额外管理
容器删除后,内部数据也会丢失,需要使用数据卷。
3. 网络配置相对复杂
特别是在需要跨主机通信时。
4. 安全性需要额外考虑
容器共享宿主机内核,安全配置不当可能导致权限提升。
5. 学习曲线
虽然基本使用简单,但要精通需要理解Linux、网络、存储等知识。
1.6 小结
通过本章学习,我们了解了:
✅容器化技术:通过封装、隔离、轻量化解决应用部署问题
✅Docker历史:从2013年诞生到成为容器技术标准
✅架构对比:Docker容器共享内核,比虚拟机更轻量高效
✅核心价值:环境一致性、快速部署、资源高效、微服务支持
✅应用场景:Web部署、CI/CD、开发环境、测试、大数据等
✅局限性:图形界面、持久化、网络、安全等需要注意的方面
下一步
在第2章中,我们将深入了解Docker的核心概念:镜像、容器、仓库,以及Docker的整体架构。这些概念是掌握Docker的基础。
思考题
- 在你的日常工作中,哪些场景可以使用Docker来提升效率?
- 对于ROCm虚拟化栈项目,使用Docker会带来哪些具体好处?
- 你认为在生产环境中,什么情况下应该选择虚拟机而不是容器?
相关资源:
- Docker官方文档:https://docs.docker.com/
- Docker Hub:https://hub.docker.com/
- 容器技术原理:https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html