第1章 Docker入门:容器化技术简介

1.1 什么是容器化技术

传统部署方式的痛点

在传统的软件部署中,我们经常遇到这样的问题:

  • 环境差异:"在我的机器上能运行"成为开发与运维之间的经典矛盾
  • 依赖冲突:不同应用需要不同版本的库或运行时
  • 资源浪费:为了隔离应用,不得不为每个应用准备独立的服务器或虚拟机
  • 部署复杂:需要在每台机器上重复配置环境、安装依赖

容器化技术的解决方案:容器化技术通过将应用程序及其所有依赖打包到一个独立的、可移植的单元中,彻底解决了上述问题。

容器的核心特征

  1. 封装性:应用程序、依赖库、配置文件统一打包
  2. 隔离性:每个容器拥有独立的文件系统、进程空间、网络栈
  3. 轻量级:共享宿主机内核,启动速度快,资源占用少
  4. 可移植性:在任何支持容器的平台上运行,行为一致

容器 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进行资源限制
  • 直接调用宿主机内核,无需额外虚拟化层

何时选择虚拟机?

虚拟机仍然有其不可替代的场景:

  1. 需要运行不同操作系统:如在Linux上运行Windows应用
  2. 更强的安全隔离:敏感应用需要完全隔离
  3. 内核级别操作:需要修改或测试内核参数
  4. 遗留系统迁移:将物理机迁移到虚拟环境

容器与虚拟机的结合

在生产环境中,两者常常结合使用:

复制代码
物理服务器
  └── 虚拟机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. 快速交付与部署

传统方式

  1. 准备服务器
  2. 安装操作系统
  3. 配置环境变量
  4. 安装依赖(Python、Node.js、MySQL等)
  5. 部署应用代码
  6. 调试配置

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的基础。

思考题

  1. 在你的日常工作中,哪些场景可以使用Docker来提升效率?
  2. 对于ROCm虚拟化栈项目,使用Docker会带来哪些具体好处?
  3. 你认为在生产环境中,什么情况下应该选择虚拟机而不是容器?

相关资源

相关推荐
云深麋鹿2 小时前
标准库中的String类
开发语言·c++·容器
gxchai4 小时前
qnap NAS下安装cal.com的YAML
docker·nas
Mr.小海9 小时前
Docker 容器资源限制实战:CPU / 内存 / 磁盘 IO 全方位管控指南
docker·容器·eureka
DeeplyMind9 小时前
第11章 容器运行参数详解
运维·docker·容器
予枫的编程笔记10 小时前
【Docker基础篇】Docker网络模式初探之bridge模式与端口映射
docker·后端开发·端口映射·容器网络·bridge模式·docker入门·容器实操
大鹏说大话11 小时前
Windows 下将 Java 项目打包为 Docker 容器并部署的完整指南
java·windows·docker
Mr.小海11 小时前
Docker 网络模式深度解析:从原理到生产环境实战
网络·docker·容器
鸿腾阳阳12 小时前
Docker Desktop 启动容器时报错
运维·docker·容器
DeeplyMind12 小时前
第13章 数据卷(Volume)详解
运维·docker·容器