Docker 容器 -- 编写你的第一个 Dockerfile
概述
你已经学会了使用 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 Flaskapp = 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"] | 容器启动时运行的命令 |
COPY
和RUN
的顺序很重要——先复制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.py
和requirements.txt
是否在同一目录- 网络是否正常(pip 安装依赖需要联网)
2. 端口被占用
换一个端口:
docker run -d -p 8080:5000 my-flask-app:1.0
然后访问 http://localhost:8080
3. 如何查看日志?
docker logs <container-id>
最佳实践
- 合理分层:把不变的(如依赖)放在前面,利用缓存。
- 使用
.dockerignore
:像.gitignore
一样,排除不需要的文件(如__pycache__
)。 - 选择合适的基础镜像:优先使用
slim
、alpine
等轻量镜像。 - 避免在容器中存储数据:使用卷(Volume)持久化数据。
总结
通过这个简单例子,你已经掌握了:
- 什么是 Dockerfile
- 如何编写基本指令
- 如何构建和运行自定义镜像
Dockerfile 是自动化交付的第一步,也是 CI/CD 流水线的核心