目录
Docker 是什么?镜像与容器一文看懂
- 开发者
- Docker, Inc.
- 首次发布
- 2013 年
- 开发语言
- Go
- 许可
- Docker Engine 是开源软件(Apache License 2.0);Docker Desktop 是商业软件,个人和小型企业可免费使用
- 官方网站
- www.docker.com
- 官方文档
- docs.docker.com
Docker 由 Docker, Inc.(前身为 dotCloud)于 2013 年发布,核心组件 Docker Engine 是用 Go 语言开发的开源项目。完整的官方网站、文档和源代码列表请见教程首页的官方资源。
Docker 解决什么问题
写代码的人几乎都遇到过这种情况:程序在自己的电脑上运行正常,放到同事的电脑或服务器上却出错。原因通常是环境不同:
- Python 版本不一样(你用 3.14,服务器还在用 3.10)
- 少安装了一个系统库
- 配置文件、环境变量、文件夹路径不同
- 同一台服务器上的两个项目需要同一个包的不同版本
传统做法是写一份很长的安装说明,然后在每台机器上一步一步照着操作,但总有人会漏掉某一步。
Docker 的做法是:把程序连同它的运行环境一起打包。打包好的内容在任何安装了 Docker 的机器上运行起来都一样。安装说明变成一条命令:
docker run -d -p 8080:80 nginx:1.30
无论是 Windows、macOS 还是 Linux 服务器,这条命令都会启动一个完全相同的 nginx Web 服务器。
三个核心概念
| 概念 | 是什么 | 比喻 |
|---|---|---|
| 镜像(Image) | 只读模板,包含程序、库和配置 | 安装光盘 |
| 容器(Container) | 由镜像启动、正在运行的实例 | 用光盘安装后正在运行的程序 |
| Registry | 存储和分享镜像的地方,例如 Docker Hub | App Store |
镜像与容器
- 一个镜像可以同时启动很多个容器,它们彼此互不影响。
- 在容器中新增或修改的文件会写入容器自己的可写层,不会修改镜像。
- 删除容器后,镜像仍然存在,随时可以再启动一个新容器。
- 由于删除容器时可写层也会一并消失,需要保存的数据(例如数据库)要另外存放在 Volume 中。
镜像由一层一层叠加而成
镜像由多个**层(layer)**组成。以一个 Node.js 网站为例(上图左侧):
- 基础操作系统层(例如 Debian)
- Node.js 运行环境层
- 安装包(
npm install)的那一层 - 你的代码所在的那一层
不同镜像可以共用相同的底层:十个以 Debian 为基础的镜像,Debian 那一层在硬盘上只存一份,也只需下载一次。这也是之后编写 Dockerfile时要注意指令顺序的原因。下一节安装 Docker 后,你会亲眼看到下载镜像时逐层下载的过程。
Registry
Registry 是存储镜像的服务器。最常用的是 Docker Hub(docker.io),运行 docker run nginx 时如果没有写网址,Docker 就会从 Docker Hub 下载镜像。其他常见的 Registry 还有 GitHub 的 ghcr.io,以及各云平台提供的 Registry。你也可以把自己创建的镜像推送到那里,详见推送到 Docker Hub。
Docker 的架构
当你在终端中输入 docker 命令时,实际上涉及三个角色:
| 角色 | 说明 |
|---|---|
| Docker CLI(Client) | 你输入的 docker 命令行工具,本身不运行容器,只负责把请求发送给 Engine |
Docker Engine(dockerd) | 在后台运行的服务,真正负责下载镜像、创建容器、管理网络和 Volume |
| Registry | 存储镜像的地方,Engine 会从这里下载(pull)或上传(push)镜像 |
CLI 和 Engine 是分开的,因此你可以在自己的笔记本上使用 docker 命令操作远程服务器上的 Engine(见部署到云主机)。下一节运行 docker version 时,你会看到 Client 和 Server 两段版本信息,它们对应的就是这两个角色。
在 Windows 和 macOS 上,Docker Engine 需要 Linux 环境才能运行。Docker Desktop 会自动创建一个轻量级 Linux 虚拟机来运行 Engine,并同时安装 CLI、Compose 等工具。在 Linux 上,直接安装 Docker Engine 即可。
容器和虚拟机有什么区别
虚拟机(VM)会模拟一整台计算机,每台虚拟机都有自己的完整操作系统。容器则共享主机的操作系统内核,只隔离程序本身需要的部分(文件系统、进程、网络)。
| 容器 | 虚拟机 | |
|---|---|---|
| 启动时间 | 通常不到 1 秒 | 通常需要几十秒到几分钟 |
| 大小 | 几 MB 到几百 MB | 通常为几 GB |
| 隔离程度 | 进程级别,共享内核 | 完整操作系统,隔离最彻底 |
| 同一台主机能运行多少个 | 很多 | 较少 |
| 可以运行不同操作系统吗 | 只能运行与主机使用相同内核的系统(Linux 容器需要 Linux 内核) | 可以,例如在 Linux 主机上运行 Windows |
容器不是用来取代虚拟机的。很多云服务实际上是在虚拟机中运行容器,两者经常一起使用。
Docker 适合用来做什么
- 开发环境:用一条命令启动数据库、缓存等服务,不必在电脑上安装一堆软件。
- 统一环境:团队成员、测试环境和生产环境都使用相同的镜像。
- 部署:把程序打包成镜像,在任何服务器上运行
docker run就能上线;回滚时也只需换回旧镜像。 - 试用软件:想试试某个数据库或工具,就运行一个容器;不需要时删除即可,让电脑保持整洁。
重点回顾
- Docker 把程序和运行环境一起打包,解决“环境不一致”的问题
- 镜像是只读模板,容器是运行中的实例,Registry 是存储镜像的地方
docker命令(Client)把请求发送给 Docker Engine 执行- 容器比虚拟机更轻量、启动更快,但共享主机的内核
下一节我们会在你的电脑上安装 Docker。
动手练习
练习 1:用一句话说明镜像和容器的区别。
答案
镜像是只读模板(像安装光盘),容器是由镜像启动、正在运行的实例(像安装好后正在运行的程序)。一个镜像可以启动多个容器。
练习 2:删除容器后,容器中新建的文件会怎样?需要保存的数据应该怎么处理?
答案
这些文件会随着容器的可写层一起消失。需要保存的数据要放在 Volume 中,Volume 的生命周期与容器无关。
常见问题
Docker 免费吗?
Docker Engine 与 CLI 是开源免费的。Docker Desktop 对个人、教育、非商业开源项目和小型企业免费,规模较大的企业需要付费订阅,详见 [安装 Docker](/zh/docker/install/)。
学习 Docker 需要先会 Linux 吗?
掌握一些基本命令(cd、ls、编辑文件)会更顺利,但不需要很熟悉。本教程会说明所有命令,跟着操作即可。
Docker 和 Kubernetes 是什么关系?
Docker 负责构建镜像并在单台主机上运行容器;Kubernetes 负责在多台主机上调度、扩展和管理大量容器。先学会 Docker,再学 Kubernetes。
更新于 2026年10月14日