如何使用 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 构建镜像是容器化的第一步,只需定义清晰的构建步骤,即可快速打造可部署、可复用的镜像,支持跨环境一致运行。


相关推荐
小小管写大大码3 小时前
如何让vscode变得更智能?vscode接入claude实现自动编程
运维·ide·vscode·自动化·编辑器·ai编程·腾讯云ai代码助手
zhang133830890754 小时前
CG-09H 超声波风速风向传感器 加热型 ABS材质 重量轻 没有机械部件
大数据·运维·网络·人工智能·自动化
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.5 小时前
Keepalived VIP迁移邮件告警配置指南
运维·服务器·笔记
物联网软硬件开发-轨物科技5 小时前
【轨物洞见】告别“被动维修”!预测性运维如何重塑老旧电站的资产价值?
运维·人工智能
程序员允诺5 小时前
[DevOps实战] 彻底解决依赖地狱:如何编译全静态、可移植的 Xorriso 工具
运维·devops
酣大智5 小时前
接口模式参数
运维·网络·网络协议·tcp/ip
一只自律的鸡6 小时前
【Linux驱动】bug处理 ens33找不到IP
linux·运维·bug
!chen6 小时前
linux服务器静默安装Oracle26ai
linux·运维·服务器
莫大3306 小时前
2核2G云服务器PHP8.5+MySQL9.0+Nginx(LNMP)安装WordPress网站详细教程
运维·服务器·nginx
刚刚入门的菜鸟6 小时前
php-curl
运维·web安全·php