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 HubDocker ComposeDocker Machine2016年Docker原生支持Swarm集群编排2017年Kubernetes成为容器编排的事实标准Docker开始支持Kubernetes2019年Docker企业版出售给Mirantis2020年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级包含完整OSMB级共享内核性能开销较高硬件虚拟化接近原生隔离级别操作系统级别进程级别镜像大小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) 每个服务独立开发、部署、扩展典型应用场景场景1Web应用部署# 前端应用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_PASSWORD123456\-p3306:3306\mysql:8.0# 数据库迁移导出dockerexecmysql-dev mysqldump -uroot -p123456 mydbbackup.sql# 数据库迁移导入到新容器dockerexec-i mysql-prod mysql -uroot -ppassword mydbbackup.sql场景7微服务编排使用Docker Compose管理复杂的微服务应用version:3services:web:image:myapp-webports:-80:80api: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-ccd /workspace make ./test1.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 Hubhttps://hub.docker.com/容器技术原理https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html