文章目录
- 基础知识扫盲:什么是 Docker?
- Docker 是什么?
- Docker 核心组件
- Docker 与虚拟机的区别
- Docker 在现代开发中的核心角色
- Docker 的局限性
基础知识扫盲:什么是 Docker?
最近打算开始系统性地学习与云计算相关的技术。提到云计算,我立刻能够想到的两个关键技术是 Docker 和 Kubernetes,目前各个企业在招聘需求中也通常会将「掌握 Docker 与 Kubernetes 等云原生相关技术」作为加分项。
Kubernetes 与我们普通开发者的距离比较远,它是一个自动化的容器编排平台,用于支持容器化应用的自动部署、健康状况检查以及动态扩缩容,从描述上来说它显然是一项用在大型项目中的技术。但是 Docker 与 Kubernetes 不同,在后端开发的学习过程中,我们有大量的机会接触 Docker,比如我们可以通过 Docker 快速拉取一个 MySQL 数据库的 Image,并启动一个 Container 运行 MySQL 服务,只要在命令中配置好数据持久化的文件位置,就可以快速地启动一个 MySQL 服务,而无需关注操作系统以及环境依赖的细节。
尽管对于开发的学习者而言,我们有大量的机会接触 Docker,但我发现我对 Docker 这个概念本身并没有很深入了解,比如什么是 Docker Image,什么是 Docker Container,二者的区别是什么?比如如何编写 Dockerfile,Docker Compose 的作用是什么?比如 Docker 和虚拟机技术有什么关系?二者的主要区别是什么?
因此通过这个专栏,我打算深入学习一下 Docker 这项技术,现在先从最基本的概念解释开始,对 Docker 基础知识进行扫盲,欢迎交流。
Docker 是什么?
Docker 是开源的「容器化平台」,允许开发者将应用程序及其依赖(代码、运行时、系统工具等)打包到一个轻量级、可移植的「容器」当中。容器共享主机操作系统内核,但通过隔离机制保证「进程独立性」,从而实现“一次构建,处处运行”。
Docker 核心组件
- Docker Image:只读模版,定义容器的初始化状态(如 Ubuntu + Nginx + 你的业务代码);
- Docker Container:Docker Image 的运行实例,包含一个可写层,进程结束后容器终止(但 Image 仍然保留)。需要注意的是,一个 Image 可以同时有多个 Container,甚至可以通过组件实现多个 Container 所提供服务的负载均衡;
- Dockerfile:描述如何构建一个 Docker Image;
- Docker Hub:公共镜像仓库,提供官方(如 MySQL)和社区镜像,通过
docker pull
命令可以从 Docker Hub 拉取镜像。
Docker 与虚拟机的区别
特性 | Docker 容器 | 虚拟机 |
---|---|---|
虚拟化层级 | 进程级虚拟化(共享 Host 的 OS 内核) | 硬件级虚拟化 |
启动速度 | 秒级 | 分钟级 |
资源占用 | 极低(MB 级别) | 高(GB 级别,因为需要完整 OS) |
隔离性 | 进程级隔离(Namespace + Cgroups) | 硬件级隔离(独立 OS 内核,安全性更高,因此 Kubernetes 集群的工作节点也运行在真实的物理主机或虚拟机上) |
适用场景 | 微服务、CI/CD、云原生 | 强隔离需求(如多租户、传统应用) |
Docker 在现代开发中的核心角色
解决“环境一致性”问题
在开发的学习阶段,Docker 的这一特性的优势就已经非常明显了,比如我希望在本地构建一个 RocketMQ 服务,我可以直接从 Docker 拉取相关的镜像,做好持久化,即可搭建起这一项服务。具体来说:
- 通过镜像确保环境完全一致;
- 跨团队协作:新成员只需要
docker-compose up
即可复现完整开发环境。
微服务架构基石
每个微服务都可以进行容器化,之后通过 Docker 运行:
- 快速部署:单个服务更新无需重启整个应用;
- 资源隔离:避免服务间依赖冲突。
DevOps 与 CI/CD 的核心工具
- 代码提交到 Github Repo 之后自动构建镜像;
- 镜像推送到 Repo 后,Kubernetes 可以自动拉取并滚动更新。
看起来上述的两项特性确实非常适用于真实的开发与部署环境。
云原生生态的关键
Docker 可与 Kubernetes、Service Mesh、Serveless 等技术结合,构成了现代云原生架构的基石。
Docker 的局限性
- 安全性:容器内核级共享,隔离性弱于 VM 的硬件级隔离;
- Windows/macOS:依赖虚拟机层;
- 持久化存储:需显式配置 Volume 或绑定挂载,才能完成 Docker 服务的持久化。