什么是 Docker?为非开发者解读容器技术
Docker 是一种工具,它将应用连同运行所需的一切——正确版本的编程语言、依赖库、系统工具和设置——打包成一个标准单元,称为容器(container)。容器在开发者的笔记本电脑、测试服务器或云主机上运行方式完全一致,从而解决了经典的“在我的机器上明明能跑”的问题。构建容器的配方是一个简短的文本文件,称为 Dockerfile。
用 AI 构建应用时,为什么 Docker 很重要
如果你的应用有后端——用 Python、Node、C# 或 Java 编写的 API——它就必须在安装了恰当软件的环境中运行。Docker 是实现这一点、并使其可重复的最常见方式。
- **部署后端。**包括 Mythex 在内的许多托管平台,都是通过从 Dockerfile 构建容器来部署后端的。在 Mythex 中,请求“一个 C# Web API”或“一个 Java 后端”,你会得到应用及其 Dockerfile,点击发布后,系统会构建镜像并完成部署(API 后端)。
- **迁离平台。**如果你导出由 AI 构建的应用,Dockerfile 能让你更轻松地在另一个主机上运行它。参见如何导出并自行托管 AI 构建的应用。
- **与开发者协作。**加入你项目的开发者,只需一两条命令就能启动整个应用,而不必花一整天安装各种软件。
一个日常类比:集装箱
在标准集装箱出现之前,货物是一件件装载的——麻袋、木桶、箱子——每个港口的处理方式都不同。标准钢制集装箱改变了这一切:货物打包一次,任何船只、起重机、火车或卡车都可以运输它,而无需关心里面装的是什么。
Docker 对软件做的也是同样的事情:
- Dockerfile 就是装箱清单和操作说明。
- 镜像(image) 就是封装好的集装箱。
- 运行中的容器 就是这个箱子投入使用,装上船运行——在这里,就是一台服务器。
- Docker Engine 则像起重机和船只:它是服务器上的软件,知道如何运行任何容器。
Docker 的工作原理
| 组成部分 | 说明 |
|---|---|
| Dockerfile | 一个文本文件,包含构建镜像的分步指令。 |
| 镜像(Image) | 只读的软件包:操作系统基础、运行时、依赖库以及你的代码。 |
| 容器(Container) | 镜像的一个运行实例,与同一台机器上的其他应用相互隔离。 |
| 镜像仓库(Registry) | 用于存储和共享镜像的地方,例如 Docker Hub 或云服务商的镜像仓库。 |
| Docker Engine | 在后台运行的服务,负责构建镜像并运行容器。免费且开源。 |
| Docker Desktop | 适用于 Mac、Windows 和 Linux 的应用,将引擎与图形界面打包在一起。 |
容器与虚拟机的区别:虚拟机假装自己是一台完整的独立计算机,拥有自己的操作系统,因此体量大、启动慢。容器则共享宿主机的操作系统内核,只隔离应用及其文件,因此通常几秒钟即可启动,占用的内存也少得多。同一台服务器上可以并排运行许多容器。
实例演示:一个小型 Python API
假设你的 AI 构建工具为一个预约应用创建了一个 Python FastAPI 后端。其 Dockerfile 可能如下所示:
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
逐行说明:
| 代码行 | 作用 |
|---|---|
FROM python:3.12-slim | 以已安装 Python 3.12 的官方镜像为起点。 |
WORKDIR /app | 在容器内的 /app 文件夹中工作。 |
COPY requirements.txt . 和 RUN pip install ... | 复制依赖库列表并安装这些库。 |
COPY . . | 复制应用自身的代码。 |
EXPOSE 8000 | 说明应用监听 8000 端口。 |
CMD [...] | 容器运行时启动 Web 服务器的命令。 |
用通俗的话说:“从 Python 3.12 开始。安装 requirements.txt 中列出的依赖库。复制代码进来。在 8000 端口启动 Web 服务器。”
然后,开发者(或托管平台)运行两条命令:
docker build -t booking-api .
docker run -p 8000:8000 booking-api
第一条命令构建镜像,并将其命名为 booking-api。第二条命令启动一个容器,并将本机的 8000 端口与容器内的 8000 端口连接起来。API 现在已经在运行了——与它在任何安装了 Docker 的服务器上的运行方式完全相同。
注意镜像中没有包含什么:密码和 API 密钥。这些内容会在容器启动时作为环境变量传入,这样同一个镜像就可以在测试环境和生产环境中使用不同的设置运行。
关键术语
| 术语 | 含义 |
|---|---|
| 容器(Container) | 应用及其依赖的隔离运行包。 |
| 镜像(Image) | 用于启动容器的模板。 |
| 基础镜像(Base image) | Dockerfile 中 FROM 行指定的起点,例如 python:3.12-slim 或 node:22。 |
| 层(Layer) | Dockerfile 的每个步骤都会添加一个可缓存的层,使重新构建更快。 |
| 端口映射(Port mapping) | 将宿主机上的端口与容器内的端口连接起来。 |
| 卷(Volume) | 在容器被替换后仍然保留的存储。容器本身是一次性的。 |
| Docker Compose | 描述多个协同运行的容器的文件,例如一个 API 加一个数据库。 |
| Kubernetes | 用于在多台服务器上运行大量容器的系统。大多数小型应用并不需要它。 |
常见误解
- **“Docker 就是虚拟机。”**它更轻量:容器共享宿主机的内核。
- **“容器内保存的数据是安全的。”**容器本就是设计为可以被丢弃和替换的。任何必须持久保存的内容——用户数据、上传的文件——都应放在数据库、文件存储或卷中。
- **“把机密信息写进 Dockerfile 没问题,因为它是私有的。”**镜像会被共享并推送到镜像仓库。应改为在运行时传入机密信息。
- **“使用 Docker 就能让应用安全。”**隔离确实有帮助,但一个运行过时软件、配置薄弱的容器仍然是脆弱的。
- **“每个应用都需要 Docker。”**静态网站或简单的前端通常只需以普通文件的形式托管,完全不需要容器。
- **“Docker Desktop 对所有人都免费。”**根据 Docker 的条款,引擎是免费的;而对于规模较大的公司,Docker Desktop 需要付费订阅。
向你的 AI 构建工具提出的要求
- “这个应用需要 Dockerfile 吗?如果需要,请用通俗的语言解释每一行。”
- “使用一个小型的官方基础镜像,并固定语言版本。”
- “不要把机密信息放进镜像。在运行时从环境变量中读取它们。”
- “确保上传的文件和数据存储在数据库或文件存储中,而不是存放在容器内部。”
- “添加一个 Docker Compose 文件,使开发者只需一条命令就能在本地运行前端、API 和数据库。”
- “添加一个健康检查端点,让托管平台能判断 API 是否正常运行。”
Mythex 中的 Docker
使用 Mythex 无需安装或运行 Docker。你的项目运行在一个私有的云沙箱中。当你请求一个需要容器的后端——例如 C#、Java,或自定义的 Node 或 Python 服务——Mythex 会编写应用及其 Dockerfile,在沙箱中预览,并在你发布时完成部署,无需自行设置任何托管环境(技术选型方式)。在 Pro 计划中,你可以导出项目,或将其同步到 GitHub,并带走其中的 Dockerfile。关于后端与前端如何协同,请参阅前端与后端。
常见问题
用简单的话说,什么是 Docker?
Docker 是一种工具,它将应用连同运行所需的一切——语言运行时、依赖库和设置——打包成一个标准单元,称为容器。这个容器在笔记本电脑、测试服务器或云主机上的运行方式都完全相同。
Docker 镜像和容器有什么区别?
镜像是打包好的只读模板,包含应用及其依赖,由 Dockerfile 构建而成。容器则是该镜像的一个运行实例。你可以从同一个镜像启动多个容器。
Docker 是虚拟机吗?
不是。虚拟机会模拟一整台拥有自己操作系统的计算机。容器则共享宿主机的操作系统内核,只隔离应用本身,因此启动更快,占用的内存也更少。
Docker 是免费的吗?
Docker Engine 是运行容器的核心组件,免费且开源。截至 2026 年 9 月,Docker 的条款规定:Docker Desktop 对非商业开源项目以及员工少于 250 人、年收入低于 1000 万美元的公司免费;规模更大的公司则需要付费订阅。
用 AI 构建应用需要学习 Docker 吗?
通常不需要。许多 AI 构建工具会替你处理容器。了解什么是 Dockerfile 会有所帮助,这样你能明白后端是如何被打包的,并且在导出应用后,可以把它运行或托管到其他地方。