使用 Dockerfile 创建自定义镜像的过程非常清晰,通常包括定义基础镜像、安装依赖、复制代码、设置环境变量和启动命令等步骤。下面详细讲解从零创建自定义镜像的完整流程。
一、什么是 Dockerfile?
Dockerfile 是一个文本文件,定义了如何构建 Docker 镜像的指令脚本。每条指令都会创建镜像的一层。
二、自定义镜像的基本步骤
📁 示例项目结构:
myapp/
├── Dockerfile
├── app.py
├── requirements.txt
三、Dockerfile 示例(以 Python 项目为例)
# 1. 使用官方基础镜像
FROM python:3.11-slim# 2. 设置工作目录
WORKDIR /app# 3. 拷贝代码和依赖
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt# 4. 拷贝应用代码
COPY app.py ./# 5. 设置环境变量(可选)
ENV TZ=Asia/Shanghai# 6. 定义启动命令
CMD ["python", "app.py"]
四、构建镜像
在包含 Dockerfile
的目录下执行:
docker build -t my-python-app .
说明:
-t
:指定镜像名称.
:当前目录为构建上下文(包含 Dockerfile)
五、运行自定义镜像
docker run -d -p 5000:5000 my-python-app
容器运行后可以访问服务(如 Flask):
http://localhost:5000
六、常用 Dockerfile 指令总结
指令 | 作用 |
---|---|
FROM | 指定基础镜像(必须第一行) |
WORKDIR | 设置容器内工作目录 |
COPY | 拷贝文件到容器 |
RUN | 执行命令(如安装依赖) |
ENV | 设置环境变量 |
EXPOSE | 声明端口(不映射,仅用于说明) |
CMD | 容器启动时默认执行命令 |
ENTRYPOINT | 设置主执行命令(可与 CMD 结合) |
七、优化建议(生产环境)
优化项 | 示例或说明 |
---|---|
✅ 使用 .dockerignore | 避免将 .git , venv , node_modules 等传入镜像上下文 |
✅ 使用多阶段构建(如 Java 项目) | 构建依赖在第一个阶段,运行用最小镜像 |
✅ 固定基础镜像版本 | 避免使用 latest ,例如:python:3.11.7 |
✅ 添加元信息 | 使用 LABEL 记录镜像作者、版本等 |
✅ 适当清理缓存 | pip install --no-cache-dir 等防止镜像过大 |
八、示例:Java Spring Boot 项目 Dockerfile
FROM eclipse-temurin:17-jdk-alpine
WORKDIR /app
COPY target/myapp.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]
九、构建并推送镜像到镜像仓库(如 Docker Hub)
docker build -t myname/myapp:v1.0 .
docker login
docker push myname/myapp:v1.0
十、总结一句话:
使用 Dockerfile 构建镜像是容器化的第一步,只需定义清晰的构建步骤,即可快速打造可部署、可复用的镜像,支持跨环境一致运行。