当前位置: 首页 > news >正文

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

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/255227.html

相关文章:

  • 轻量级web开发框架之Flask web开发框架学习:get请求数据的发送
  • 国产芯片能在服务器领域替代Intel(经验总结贴)
  • phpstudy无法启动mysql,一启动就关闭,完美解决
  • WIFI原因造成ESP8266不断重启的解决办法
  • 【Linux驱动开发 ---- 4.2_平台设备(Platform Devices)概述】
  • 电影感户外柔和光线人像街拍摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • 【内存】Linux 内核优化实战 - vm.max_map_count
  • Java枚举类如何避免反射攻击和序列化攻击
  • 零基础RT-thread第四节:电容按键
  • 自动化性能回退机制——蓝绿部署与灰度发布
  • Electron (02)集成 SpringBoot:服务与桌面程序协同启动方案
  • 回文链表C++
  • 设计模式精讲 Day 8:组合模式(Composite Pattern)
  • Transformer实战——Hugging Face环境配置与应用详解
  • 什么是seata
  • node.js在vscode的配置
  • 多线程八股
  • 【小程序】如何生成特定页面的小程序码
  • 代码审计-fastjson反序列化漏洞
  • .NET基于类名约定的自动依赖注入完整指南
  • python+uniapp基于微信小程序的高校二手商品交易系统
  • NVR的方法多种取决于应用场景
  • PVE使用ubuntu-cloud-24.img创建虚拟机并制作模板
  • 20250620在荣品的PRO-RK3566开发板的Android13系统的uboot阶段就拉高GPIO2C6【driver模式】
  • 第3讲、LangChain性能优化:上下文缓存与流式响应实战指南
  • java面试题03静态修饰类,属性,方法有什么特点?
  • Maven并行构建
  • Anaconda安装env,yml一直卡在Solving environment:不动
  • Spring Boot大文件分块上传:高效解决大文件传输难题
  • React Native【实战范例】同步跟随滚动