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, cAdvisor
1.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方案:
dockerfile
# 开发环境
docker run -d myapp:1.0
# 测试环境
docker run -d myapp:1.0
# 生产环境
docker run -d myapp:1.0
同一个镜像,在任何环境中行为完全一致。
2. 快速交付与部署
传统方式:
- 准备服务器
- 安装操作系统
- 配置环境变量
- 安装依赖(Python、Node.js、MySQL等)
- 部署应用代码
- 调试配置
Docker方式:
bash
docker run -d -p 80:80 myapp:latest
一条命令,几秒钟完成部署。
3. 资源利用率提升
在同样的硬件资源下:
- 虚拟机:可能只能运行10个虚拟机
- Docker:可以运行100个甚至更多容器
4. 微服务架构的理想载体
单体应用 → 微服务拆分
用户服务 (Container 1)
订单服务 (Container 2)
支付服务 (Container 3)
商品服务 (Container 4)
每个服务独立开发、部署、扩展
典型应用场景
场景1:Web应用部署
bash
# 前端应用
docker run -d -p 80:80 nginx-frontend
# 后端API
docker run -d -p 8080:8080 api-backend
# 数据库
docker run -d -p 3306:3306 mysql:8.0
场景2:持续集成/持续部署 (CI/CD)
yaml
# GitLab CI配置示例
build:
stage: build
script:
- docker build -t myapp:$CI_COMMIT_SHA .
- docker push myapp:$CI_COMMIT_SHA
deploy:
stage: deploy
script:
- docker pull myapp:$CI_COMMIT_SHA
- docker stop myapp || true
- docker run -d --name myapp myapp:$CI_COMMIT_SHA
场景3:开发环境标准化
团队成员使用统一的开发环境:
bash
# 所有开发者运行相同的开发环境
docker-compose up
# 包含:
# - Python 3.9
# - PostgreSQL 13
# - Redis 6
# - Nginx
场景4:多版本测试
同时测试应用在不同环境下的表现:
bash
# Python 3.8环境
docker run -v $(pwd):/app python:3.8 python /app/test.py
# Python 3.9环境
docker run -v $(pwd):/app python:3.9 python /app/test.py
# Python 3.10环境
docker run -v $(pwd):/app python:3.10 python /app/test.py
场景5:大数据与机器学习
bash
# 运行Jupyter Notebook
docker run -p 8888:8888 jupyter/datascience-notebook
# 运行TensorFlow训练
docker run --gpus all -v $(pwd):/workspace tensorflow/tensorflow:latest-gpu
场景6:数据库快速部署与迁移
bash
# 快速启动MySQL用于开发
docker run -d \
--name mysql-dev \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
mysql:8.0
# 数据库迁移:导出
docker exec mysql-dev mysqldump -uroot -p123456 mydb > backup.sql
# 数据库迁移:导入到新容器
docker exec -i mysql-prod mysql -uroot -ppassword mydb < backup.sql
场景7:微服务编排
使用Docker Compose管理复杂的微服务应用:
yaml
version: '3'
services:
web:
image: myapp-web
ports:
- "80:80"
api:
image: myapp-api
depends_on:
- db
- cache
db:
image: postgres:13
cache:
image: redis:6
ROCm虚拟化栈场景
针对ROCm开发,Docker可以提供:
bash
# 运行特定版本的ROCm环境
docker run --device=/dev/kfd --device=/dev/dri \
--group-add video \
rocm/rocm-terminal:5.7 \
rocminfo
# 构建和测试ROCm应用
docker run -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