1.1 Docker 概念详解
1. Docker 是什么?
Docker 是一个开源的应用容器引擎,它让开发者可以将应用及其依赖打包到一个可移植的容器(Container)中,并在任何支持 Docker 的 Linux、Windows 或 macOS 系统上运行。这样做极大地提升了应用的可移植性、一致性和部署效率。
2. 核心概念
2.1 镜像(Image)
- 镜像是一个只读的模板,包含了运行容器所需的程序、库、环境变量和配置文件等内容。
- 可以把镜像理解为“容器的快照”或“应用的安装包”。
- 镜像可以基于基础镜像(如 Ubuntu、Alpine)自定义制作,也可以通过 Docker Hub 等仓库获取。
2.2 容器(Container)
- 容器是镜像的运行实例,本质上是一个进程(或一组进程),但它被隔离在自己的运行环境中。
- 容器启动极快、资源消耗小、可以随时停止和销毁,适合于弹性伸缩和持续集成场景。
- 容器与主机之间可以通过端口、卷等方式进行通信和数据交换。
2.3 仓库(Repository/Registry)
- 仓库用来集中存储和分发镜像,分为公有仓库(如 Docker Hub)和私有仓库(如 Harbor)。
- 用户可以将自定义的镜像上传到仓库,也可以从仓库拉取需要的镜像。
- 一个仓库可以包含同一个应用的多个版本(以标签tag区分)。
2.4 Docker 引擎(Docker Engine)
- Docker Engine 是 Docker 的核心,负责镜像构建、容器管理、网络与数据卷支持等。
- 包括:
- 服务端(daemon):运行在主机上,负责接收和处理命令。
- 客户端(CLI):用户与 Docker 交互的命令行工具。
- REST API:供第三方工具或系统与 Docker 集成。
2.5 镜像、容器、仓库三者关系详解(特别是镜像与容器)
一、总体关系概述
Docker 架构的三大核心概念——镜像(Image)、容器(Container)、仓库(Repository)——构成了容器化应用的“构建—分发—运行”全流程:
- 镜像是“应用及其运行环境的静态快照”。
- 容器是“镜像的动态运行实例”。
- 仓库则负责“集中存储和分发镜像”。
三者的关系可以用一句话概括:“仓库存储镜像,镜像生成容器,容器运行应用。”
二、镜像(Image)与容器(Container)的关系
1. 镜像是模板,容器是实例
- 镜像就像“程序的安装包”或“金钥模具”,它包含了应用所需的所有依赖、环境、配置等,一切都是静态、只读的。
- 容器则是“根据镜像运行出来的实例”,是动态、可读写的。每次运行镜像都会产生一个独立的容器(就像用同一个模具可以生产出多个钥匙)。
2. 镜像与容器的数据结构
- 镜像是由多层(layer)组成,每一层代表一次文件系统的变更(比如安装依赖、复制文件等)。
- 容器在镜像的基础上,增加了一层可写层(writeable layer),运行时所有的数据变更都在这个可写层,不会影响原始镜像。
3. 镜像和容器的生命周期
- 镜像:可以被拉取(pull)、推送(push)、构建(build)、删除(rmi),但本身不能直接运行。
- 容器:由镜像启动(docker run),可以进行启动、停止、暂停、重启、删除等操作。一个镜像可以启动任意多个容器,每个容器都是独立进程,互不影响。
4. 容器运行时的读写行为
- 只读层:来自镜像,所有容器共享,不会被修改。
- 可写层:每个容器独有,所有对文件系统的写操作都在这一层。容器销毁后,可写层也随之消失。
5. 镜像与容器的转换
- “从镜像生成容器”:
docker run
、docker create
- “从容器生成镜像”:
docker commit
可以将运行中的容器快照保存为新的镜像,实现修改后快速复用。
三、镜像、容器与仓库的关系
1. 仓库存储镜像
- 仓库(Repository/Registry)就像“镜像云盘”,集中管理镜像的存储与分发。
- 镜像可以上传(push)到仓库,也可以从仓库下载(pull)到本地。
- 一个镜像仓库可包含同一应用的不同版本(通过 tag 区分)。
2. 镜像分发流程
- 开发者本地构建镜像(如 docker build)
- 将镜像推送到仓库(docker push)
- 其他主机/环境从仓库拉取镜像(docker pull)
- 根据镜像启动容器运行应用(docker run)
3. 仓库、镜像、容器的作用对比
角色 | 作用 | 生命周期 | 可否直接运行 | 可否编辑/修改 |
---|---|---|---|---|
仓库 | 存储分发镜像 | 持久 | 否 | 否 |
镜像 | 应用和环境的静态快照 | 持久 | 否 | 否(只读) |
容器 | 镜像的运行实例(进程) | 动态(可销毁) | 是 | 是(可写层) |
四、图示说明
+-----------------------------+
| 仓库(Repository) |
| 存储、管理多个镜像版本 |
+-------------+---------------+
|
拉取/推送(pull/push)
v
+-----------------------------+
| 镜像(Image) |
| 应用及环境的静态快照 |
+-------------+---------------+
|
运行(run)
v
+-----------------------------+
| 容器(Container) |
| 镜像的动态实例,进程/服务 |
+-----------------------------+
五、总结
- 镜像是不可变的,便于版本管理和一致性部署。
- 容器可以随时销毁和重建,数据需通过卷或持久化方案保存。
- 镜像通过仓库实现跨主机、跨环境的分发。
- 推荐流程:本地构建镜像 → 推送仓库 → 拉取到任意主机 → 启动容器。
3. 容器和虚拟机的区别
容器(Container) | 虚拟机(VM) | |
---|---|---|
启动速度 | 秒级 | 分钟级 |
资源占用 | 轻量级,只需应用+依赖 | 重量级,需要完整操作系统 |
隔离性 | 进程级别,依赖于宿主机内核 | 完全隔离,独立操作系统内核 |
性能 | 接近原生性能 | 存在虚拟化开销 |
迁移与扩展 | 快速、灵活,便于弹性伸缩 | 慢,迁移和扩展成本高 |
总结:容器适合微服务、弹性扩展、持续集成等场景,虚拟机更适合需要强隔离和完整操作系统的场景。
4. Docker 的应用场景与优势
4.1 应用场景
- 微服务架构部署
- 持续集成/持续交付(CI/CD)
- 跨环境迁移和分发
- 云原生应用开发
- 本地开发与测试环境一致性管理
4.2 Docker 的优势
- 一致性:开发、测试、生产环境完全一致,避免“在我机子上没问题”。
- 轻量级:资源消耗低,启动快,易于大规模弹性部署。
- 可移植:镜像可以在任何支持 Docker 的平台运行。
- 易集成:与主流 CI/CD、云平台、Kubernetes 无缝对接。
- 社区活跃:拥有庞大的生态和丰富的官方/第三方镜像。
5. 总结
Docker 通过镜像、容器、仓库等核心概念,实现了应用的快速部署、弹性扩缩、环境一致性和高效交付,是现代云原生架构和 DevOps 流程的基础设施之一。