如何使用 Docker 打包一个简单的应用程序:简易指南
大家好!我是大聪明-PLUS!
今天我将向大家展示如何使用这四个左手手指在 Docker 中构建应用程序(我们可是在进行严肃的研究,还能用别的方法吗?)。
为了回答这个未被提出的问题,我大胆地说,有时候你需要将你简单但功能强大的应用程序放在容器中运行,以便:
到处都是同样的情况(甚至在齐娜阿姨的车里也是如此);
它可以部署到云端或存储桶中;
不要考虑依赖关系、版本、环境等等这些东西。
正如您可能已经注意到的,我们已经得出了其中一个操作原则的结论:“容器主要是应用程序交付的产物,只有这样它才能起到隔离作用”,并且我们已经朝着大型 K8S 编排器迈出了重要一步。
让我们进入正题。
举个简单的例子:我们有一个 Python 应用程序,运行命令是`python app.py。没什么特别的。假设根据 TIOBE 的数据,截至 2025 年 7 月,Python 是世界上最流行的编程语言。但这项研究的严谨性也就到此为止了,我们不能再指望它有什么权威性可言。
第一步:准备项目
以下是项目结构:
我的应用/
├── app.py
├── requirements.txt
app.py文件可以是任何东西,从一个简单的“Hello, world!”应用程序到 Web 应用程序——这并不重要。关键是它能够启动并运行。如果它无法启动和运行,那么恐怕你的应用程序还不够完善,需要进行一些改进。
Requirements.txt 文件列出了依赖项,例如:
请求
总的来说,这是一个完整的项目,名副其实的“大项目”。
步骤 2:编写 Dockerfile
现在让我们在项目根目录下创建一个 Dockerfile:
FROM python:3.13-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]这里发生了什么:
我们采用官方的 Python 镜像,但要轻量级(精简版);
进入容器内的 /app 目录;
复制依赖项并通过 pip 安装;
将整个项目复制到容器内;
容器启动时运行app.py。
Dockerfile 是一个配方文件,就像宜家的组装说明书,只不过是针对应用程序的。你需要指定构建镜像的依据(例如,使用 Ubuntu 并安装 Python,或者只使用 Python 并安装依赖项)、要复制的内容、要运行的命令,以及如何运行所有这些操作。
这有很多好处:构建选项的版本控制、构建和交付到测试环境的自动化(这是我们最喜欢的 CI/CD),而且无需向新手解释如何使用“docker build”构建项目。
我们实际上已经编写了一个文件,其中包含有关如何将我们引以为豪的应用程序打包到容器中(包括依赖项)以及如何运行它的说明。
诸如从零开始、为什么选择 Python 而不是 Alpine、为什么显示的是版本而不是最新版本、以及什么是最新版本等问题,都被省略了,但我相信,只要你保持好奇心,就能找到这些问题的答案。
步骤 3. 组装图像
在终端中,进入 Dockerfile 所在的目录,运行:
docker build -t myapp .这将构建一个带有 myapp 标签的镜像。Docker 将执行 Dockerfile 中的步骤,并为每个步骤创建一个镜像层。
等等,这是几层?我们要做馅饼吗?
是的,Docker 中的层就像千层蛋糕,只不过我们用 Dockerfile 中的命令代替了面团和馅料。
每条指令(FROM、COPY、RUN、CMD)都代表一个单独的层。Docker 会逐层构建镜像。每当你在 Dockerfile 中编写内容时,它都会基于前一层创建一个新层。
这一切究竟是为什么?
Docker 会缓存构建层。如果您没有更改任何代码,只是重新启动构建,它不会重新安装 Python 或依赖项——它只会使用缓存中预构建的构建层。更快、更便宜、更方便。
没错:图片更新起来更容易。只改了一行代码?只需要重建一个图层,其余部分保持不变。当然,前提是你的代码是最后加载的,而不是最先加载的。
因此,分层是为了优化、重用,以及容器生命周期中的秩序。
我们也可以在这里讨论其他装配工具,但这与手指无关。
步骤 4. 启动容器
现在我们可以在容器中运行我们的应用程序了:
docker run --rm myapp如果一切正常,我们将看到app.py的输出。如果应用程序是基于 Web 的,您可以转发端口:
docker run -p 8000:8000 myapp同样,底层和幕后有很多有趣的东西:cgroup、命名空间——但今天我们只谈“傻瓜式的 4 个简单步骤”。
你还可以添加`-d`参数强制它在后台运行。如果你有多个服务、数据库和其他网络需求,或者可以用 Compose 将其封装起来。此外,你还可以解释 Git 仓库、持续集成 (CI) 等环境中的文件存储结构。
但基本上,就是这样,简单而又不带任何狂热,我们就把应用程序塞进了一个容器里。
现在,我们可以开始了吗?其实还不行,因为这其中有很多细微之处,而且这个领域的知识浩瀚无垠。但这可以作为我们进入儿童收纳容器世界的起点,一个开始。
最重要的是,不要害怕 Dockerfile。它只是从表面上看比较吓人。实际上,它就像一份食谱,一步一步地指导你完成操作。
