如何使用 Dockerfile 创建自定义镜像

使用 Dockerfile 创建自定义镜像的过程非常清晰,通常包括定义基础镜像、安装依赖、复制代码、设置环境变量和启动命令等步骤。下面详细讲解从零创建自定义镜像的完整流程。


一、什么是 Dockerfile?

Dockerfile 是一个文本文件,定义了如何构建 Docker 镜像的指令脚本。每条指令都会创建镜像的一层。


二、自定义镜像的基本步骤

📁 示例项目结构:

复制代码
myapp/
├── Dockerfile
├── app.py
├── requirements.txt

三、Dockerfile 示例(以 Python 项目为例)

dockerfile 复制代码
# 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 的目录下执行:

bash 复制代码
docker build -t my-python-app .

说明:

  • -t:指定镜像名称
  • .:当前目录为构建上下文(包含 Dockerfile)

五、运行自定义镜像

bash 复制代码
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

dockerfile 复制代码
FROM eclipse-temurin:17-jdk-alpine
WORKDIR /app
COPY target/myapp.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]

九、构建并推送镜像到镜像仓库(如 Docker Hub)

bash 复制代码
docker build -t myname/myapp:v1.0 .
docker login
docker push myname/myapp:v1.0

十、总结一句话:

使用 Dockerfile 构建镜像是容器化的第一步,只需定义清晰的构建步骤,即可快速打造可部署、可复用的镜像,支持跨环境一致运行。


相关推荐
秦曱凧2 小时前
NAS上使用Docker部署网页版双人对战五子棋
docker
潮落拾贝2 小时前
k8s+isulad 网络问题
云原生·容器·kubernetes·国产化
janthinasnail2 小时前
使用Docker安装MeiliSearch搜索引擎
搜索引擎·docker
bkspiderx4 小时前
Nginx 屏蔽服务器名称与版本信息(源码级修改)
运维·服务器·nginx
野生柚子4 小时前
记录学习K8s 集群中OOM Killer的决策基准及执行流程
linux·运维
TLucas5 小时前
在CentOS 7上将PostgreSQL数据库从默认路径迁移到自定义目录
linux·运维·postgresql·centos
ZoeLandia6 小时前
nginx实战分析
运维·前端·nginx
菜菜子爱学习6 小时前
Nginx学习笔记(九)—— Nginx Rewrite深度解析
linux·运维·笔记·学习·nginx
迷之程序员7 小时前
服务器装两个cpu
运维·服务器
Mr_Xuhhh9 小时前
传输层协议 TCP(1)
运维·服务器·网络·c++·网络协议·tcp/ip·https