概述

你已经学会了使用 docker run 来运行别人做好的镜像,比如:

docker run hello-world
docker run nginx

但如果你想把自己的应用打包成镜像,该怎么办?

答案就是:写一个 Dockerfile

什么是 Dockerfile?

Dockerfile 是一个文本文件,里面包含了一组指令,告诉 Docker 如何一步步构建一个镜像。

你可以把它理解为:

“制作镜像的步骤说明书”

比如:

  • 基于哪个基础镜像?
  • 要复制哪些文件?
  • 安装什么依赖?
  • 启动时运行什么命令?

准备一个简单的 Python 应用

我们以一个最简单的 Python Web 应用为例。

1. 创建项目目录

mkdir my-flask-app
cd my-flask-app

2. 创建 app.py 文件

# app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, Docker! "

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

3. 创建 requirements.txt

Flask==2.3.3

编写你的第一个 Dockerfile

在项目根目录创建一个名为 Dockerfile 的文件(注意:没有后缀):

touch Dockerfile

打开文件,写入以下内容:

# 1. 指定基础镜像
FROM python:3.9-slim

# 2. 设置工作目录
WORKDIR /app

# 3. 复制 requirements.txt 并安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 4. 复制应用代码
COPY . .

# 5. 暴露端口
EXPOSE 5000

# 6. 定义启动命令
CMD ["python", "app.py"]

逐行解释 Dockerfile 指令

指令作用
FROM python:3.9-slim使用官方 Python 3.9 镜像作为基础
WORKDIR /app在容器内创建 /app 目录,并设为工作目录
COPY requirements.txt .把本地的 requirements.txt 复制到容器
RUN pip install ...在容器中安装 Python 依赖
COPY . .把当前目录所有文件复制到容器
EXPOSE 5000声明容器运行时监听 5000 端口
CMD ["python", "app.py"]容器启动时运行的命令

COPYRUN 的顺序很重要——先复制 requirements.txt 再安装依赖,可以利用 Docker 的缓存机制,加快后续构建速度。

构建镜像

my-flask-app 目录下运行:

docker build -t my-flask-app:1.0 .
  • docker build:构建镜像
  • -t my-flask-app:1.0:给镜像打标签(名字:版本)
  • .:指定构建上下文为当前目录

构建过程会显示每一步的执行日志,稍等片刻即可完成。

运行容器

镜像构建成功后,运行它:

docker run -d -p 5000:5000 my-flask-app:1.0
  • -d:后台运行
  • -p 5000:5000:把宿主机的 5000 端口映射到容器的 5000 端口

验证结果

打开浏览器,访问:

http://localhost:5000

你应该看到:

Hello, Docker! 

此时,你已经成功用 Dockerfile 构建并运行了自己的第一个应用

常见问题

1. 构建失败

检查:

  • Dockerfile 文件名是否正确(无后缀)
  • app.pyrequirements.txt 是否在同一目录
  • 网络是否正常(pip 安装依赖需要联网)

2. 端口被占用

换一个端口:

docker run -d -p 8080:5000 my-flask-app:1.0

然后访问 http://localhost:8080

3. 如何查看日志?

docker logs <container-id>

最佳实践

  1. 合理分层:把不变的(如依赖)放在前面,利用缓存。
  2. 使用 .dockerignore:像 .gitignore 一样,排除不需要的文件(如 __pycache__)。
  3. 选择合适的基础镜像:优先使用 slimalpine 等轻量镜像。
  4. 避免在容器中存储数据:使用卷(Volume)持久化数据。

总结

通过这个简单例子,你已经掌握了:

  • 什么是 Dockerfile
  • 如何编写基本指令
  • 如何构建和运行自定义镜像

Dockerfile 是自动化交付的第一步,也是 CI/CD 流水线的核心

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐