Dockerfile 镜像构建

目录

简介

一、Docker镜像概念与结构

1.1 镜像的分层存储机制

1.2 镜像分层的关键特性

二、Dockerfile语法

2.1 基础构建指令

2.2 环境配置指令

2.3 文件操作指令

2.4 运行时指令

2.5 网络与数据管理

三、实战案例

3.1 构建Nginx Web服务器

3.2 构建Tomcat应用服务器

3.3 构建MySQL数据库

四、Dockerfile实践优化技巧

4.1 指令书写规范

4.2 镜像构建优化

4.3 安全最佳实践

4.4 高级构建技巧

五、总结


简介

Docker作为容器化技术的核心,其镜像构建能力是实现应用快速部署的关键。本文将围绕Dockerfile这一镜像构建脚本,深入解析Docker镜像的底层原理,并通过实战案例演示如何构建高效、可靠的Docker镜像。

一、Docker镜像概念与结构

Docker镜像不仅是应用发布的标准格式,更是容器运行的基础。理解镜像的结构和工作机制,是掌握Dockerfile的前提。

1.1 镜像的分层存储机制

Docker镜像采用分层结构设计,每个镜像由多个只读层叠加而成。这种设计带来了显著的优势:

  • 缓存复用:未修改的层会被缓存,加速后续构建
  • 增量更新:只需更新变化的层,减少镜像体积
  • 版本控制:每层对应一次构建操作,便于追溯

通过​​docker history​​命令可以查看镜像的分层结构:

# 查看镜像分层及大小
docker history nginx:latest

镜像默认存储在​​/var/lib/docker/<storage-driver>​​目录,容器运行时会在镜像顶部添加一个可读写层,所有运行时修改都存储在此层。这解释了为何容器删除后数据会丢失——因为可读写层随之删除。

1.2 镜像分层的关键特性
  • 每层对应一条Dockerfile指令:每条指令生成一个新层
  • 缓存失效机制:当指令内容或依赖文件变化时,对应层及后续层缓存失效
  • 不可变性:层一旦生成不可修改,后续层的删除操作只是隐藏文件而非真正移除

二、Dockerfile语法

Dockerfile是定义镜像构建过程的脚本文件,通过一系列指令告诉Docker如何构建镜像。下面详解核心指令及使用场景。

2.1 基础构建指令

FROM:指定基础镜像

# 基于Ubuntu 20.04构建新镜像
FROM ubuntu:20.04
  • 所有Dockerfile必须以FROM开头
  • 基础镜像可以是官方镜像或自定义镜像
  • 推荐使用​​alpine​​等轻量级镜像以减小体积

LABEL:添加镜像元数据

# 添加作者、版本、描述等信息
LABEL maintainer="John Doe <johndoe@example.com>" \version="1.0" \description="This is a sample image"
  • 替代已弃用的MAINTAINER指令
  • 元数据便于镜像管理和识别
2.2 环境配置指令

ENV:设置环境变量

# 设置MySQL root密码环境变量
ENV MYSQL_ROOT_PASSWORD=password
  • 环境变量在容器运行时持续存在
  • 可被容器内应用程序直接使用

ARG:定义构建参数

# 定义版本参数,默认值1.0
ARG VERSION=1.0
  • 仅在镜像构建过程中有效
  • 可通过​​docker build --build-arg VERSION=2.0​​传递参数
2.3 文件操作指令

COPY:复制本地文件

# 将本地app.py复制到镜像/app目录
COPY app.py /app/
  • 简单高效的文件复制方式
  • 推荐优先使用COPY而非ADD

ADD:增强型复制

# 下载并解压远程压缩包
ADD http://example.com/file.tar.gz /app/
  • 支持远程URL下载和自动解压
  • 功能复杂可能带来安全风险,谨慎使用

WORKDIR:设置工作目录

# 设置后续指令的工作目录为/app
WORKDIR /app
  • 避免使用绝对路径硬编码
  • 支持多次切换工作目录
2.4 运行时指令

RUN:构建时执行命令

# 更新软件源并安装Python3
RUN apt-get update && apt-get install -y python3
  • 用于安装软件、配置环境等操作
  • 建议合并多条命令减少层数:​​RUN command1 && command2​

CMD:容器默认命令

# 容器启动时默认执行python3 app.py
CMD ["python3", "app.py"]
  • 一个Dockerfile只能有一个CMD
  • 可被​​docker run​​命令后的参数覆盖

ENTRYPOINT:容器入口点

# 配置容器入口点为python3,默认参数app.py
ENTRYPOINT ["python3"]
CMD ["app.py"]
  • 入口点命令不会被覆盖
  • ​docker run <image> test.py​​​会执行​​python3 test.py​
2.5 网络与数据管理

EXPOSE:声明监听端口

# 声明容器监听8080端口
EXPOSE 8080
  • 仅作声明,需配合​​docker run -p​​实现端口映射
  • 明确告知使用者容器需要的网络资源

VOLUME:创建数据卷

# 创建/app/data数据卷挂载点
VOLUME ["/app/data"]
  • 实现数据持久化和容器间数据共享
  • 推荐用于日志、配置文件等需要持久化的目录

三、实战案例

3.1 构建Nginx Web服务器

准备工作

# 拉取CentOS 7基础镜像
docker pull centos:7# 创建工作目录
mkdir -p /opt/nginx
cd /opt/nginx

Dockerfile内容

FROM centos:7
# 删除默认源文件
RUN rm -rf /etc/yum.repos.d/*
# 配置阿里云镜像源
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 清理缓存
RUN yum clean all
# 安装编译依赖
RUN yum -y install pcre-devel zlib-devel zlib gcc* make openssl-devel
# 复制Nginx源码
ADD nginx-1.19.5.tar.gz /opt
# 切换工作目录
WORKDIR /opt/nginx-1.19.5
# 编译安装Nginx
RUN ./configure --prefix=/usr/local/nginx && make && make install
# 复制配置文件
ADD nginx.conf /usr/local/nginx/conf/nginx.conf
# 声明服务端口
EXPOSE 80
EXPOSE 443
# 复制启动脚本并赋予权限
ADD run.sh /run.sh
RUN chmod 775 /run.sh
# 设置容器启动命令
CMD ["/run.sh"]

启动脚本run.sh

#!/bin/bash
# 启动Nginx服务
/usr/local/nginx/sbin/nginx

构建与运行

# 构建镜像,-t指定镜像名称
docker build -t mynginx .# 启动容器,-p映射端口,-d后台运行
docker run -d -p 8080:80 --name nginx01 mynginx# 带数据卷挂载的启动方式
docker run -d -p 8081:80 --name nginx02 \
-v /www/html:/web \
mynginx /bin/bash -c "/run.sh"
3.2 构建Tomcat应用服务器

Dockerfile核心部分

FROM centos:7
# 安装JDK
ADD jdk-8u91-linux-x64.tar.gz /usr/local/
# 配置Java环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_91
ENV PATH $PATH:/usr/local/jdk1.8.0_91/bin
# 安装Tomcat
ADD apache-tomcat-8.5.16.tar.gz /
RUN mv /apache-tomcat-8.5.16 /usr/local/tomcat
# 声明端口
EXPOSE 8080
# 启动脚本
ADD run.sh /run.sh
RUN chmod 775 /run.sh
CMD ["/run.sh"]

启动脚本关键逻辑

#!/bin/bash
# 启动Tomcat
/usr/local/tomcat/bin/startup.sh
# 保持容器运行
tail -f /dev/null
3.3 构建MySQL数据库

初始化脚本安全设置

#!/bin/bash
# 初始化MySQL
mysql_install_db --user=mysql
# 启动服务
mysqld_safe &
sleep 3
# 设置root密码
mysqladmin -u"root" password "123456"
# 授权远程访问
mysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';"
# 刷新权限
mysql -uroot -p123456 -e "FLUSH PRIVILEGES;"

安全建议

  • 避免在Dockerfile中硬编码密码
  • 使用​​docker run -e MYSQL_ROOT_PASSWORD=xxx​​传递密码
  • 生产环境建议限制root用户远程访问

四、Dockerfile实践优化技巧

4.1 指令书写规范
  • 大小写约定:指令使用大写(FROM/RUN/CMD),增强可读性
  • 顺序优化:将不变的指令(如FROM、LABEL)放在前面,充分利用缓存
  • 注释原则:使用​​#​​添加注释,解释关键步骤的目的
4.2 镜像构建优化
  • 减少层数:合并相关命令,例如:
RUN apt-get update && apt-get install -y \package1 \package2 \&& rm -rf /var/lib/apt/lists/*
  • 清理临时文件:安装完成后删除缓存和临时文件,减小镜像体积
  • 利用缓存:将不常变更的操作(如安装依赖)放在前面,频繁变更的放在后面
4.3 安全最佳实践
  • 使用非root用户:通过​​RUN useradd appuser && chown appuser /app​​设置非root用户
  • 最小化权限:仅开放必要的端口,避免暴露敏感服务
  • 避免敏感信息:不在Dockerfile中存储密码、密钥等敏感信息
4.4 高级构建技巧
  • 多阶段构建:使用多个FROM指令,先构建编译环境,再复制最终产物:
FROM builder AS build
# 编译过程...FROM runtime
# 复制编译结果...
  • 环境变量隔离:区分构建时参数(ARG)和运行时变量(ENV)
  • 缓存管理:使用​​docker build --no-cache​​强制重新构建

五、总结

通过掌握Dockerfile的核心语法和实践技巧,我们能够:

  1. 理解Docker镜像的分层存储与缓存机制
  2. 熟练使用各类指令构建自定义镜像
  3. 通过实战案例掌握常见服务的容器化部署
  4. 应用最佳实践优化镜像构建流程

进阶学习方向建议:

  • 深入研究Docker存储驱动(Overlay2、AUFS等)
  • 探索Docker Compose实现多容器协同部署
  • 学习Kubernetes容器编排,实现容器服务的规模化管理

Dockerfile作为容器化的核心技术,其灵活性和强大功能为应用部署带来了前所未有的便利。不断实践和优化Dockerfile编写,将有效提升应用交付效率和系统稳定性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker Desktop 4.42集成的MCP工具包

一、介绍 Docker Desktop 4.42 集成了 MCP&#xff08;Model‑Client‑Plugin&#xff09;Toolkit&#xff0c;无需额外安装扩展即可直接使用。 MCP Toolkit 集成细节 内置于 Docker Desktop&#xff1a;你可以直接打开应用&#xff0c;在设置中启用 MCP 服务器&#xff0c;比…

CUDA NCU Occupancy学习笔记

占用率是每个多处理器的活跃 Warp 数量与最大可能活跃 Warp 数量的比率。另一种查看占用率的方式是&#xff0c;硬件处理 Warp 的能力中&#xff0c;实际使用 Warp 的百分比。较高的占用率并不一定能带来更高的性能&#xff0c;然而&#xff0c;较低的占用率总是会降低隐藏延迟…

配置自己的NTP 服务器做时间同步

✅ 推荐方案&#xff1a;使用 chrony 搭建 NTP 服务器&#xff08;适用于 CentOS 7/8/9&#xff09; chrony 是 CentOS 推荐的 NTP 实现&#xff0c;精度高、资源占用低、同步快&#xff0c;默认在 CentOS 8 中取代了 ntpd。 &#x1f527; 一、安装 chrony sudo yum install…

【运维系列】Plane 开源项目安装和配置指南

Plane是一个用现代前端技术栈&#xff08;Next.js TailwindCSS&#xff09;开发的开源项目管理平台&#xff0c;核心理念是 Bring Structure to Chaos" —— 给混乱的项目管理带来结构感。 1.项目地址 gitHub 2.项目使用的关键技术和框架 Plane 项目使用了多种关键技术…

3.读取图片和图片采集

目录 一、Halcon 1. 图片的基本概念 2. 获取图片方式1-读取本地图片 3. 获取图片方式2-在线采集 4. C#获取图片数据架构 二、VS联合编程 1. 读取本地图片 2.在线采集 一、Halcon 1. 图片的基本概念 1. 图片2. 像素 3. 分辨率4. 位深度5. 不同后缀1. png jpg 2. bmp 6…

前端流式接口/Socket.IO/WebSocket的区别和选用

WebSocket&#xff1a; 定义&#xff1a;WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;实现了客户端与服务器之间的实时双向通信。特点&#xff1a;基于HTTP协议&#xff0c;但通过握手升级为WebSocket协议&#xff0c;支持持久连接&#xff0c;减少延迟和带…

QT 学习笔记摘要(二)

第一节 常用控件 1. QWidget 核心属性 1.1 objectName 1.2 enabled API说明 isEnabled() 获取到控件的可⽤状态 setEnabled() 设置控件是否可使⽤. true 表⽰可⽤, false 表⽰禁⽤ 1.3 geometry && window frame geometry: x y width height API 说明 geom…

FastAPI + Redis 高性能任务队列实现:AI内容生成系统实践

FastAPI Redis 高性能任务队列实现&#xff1a;AI内容生成系统实践 引言 在现代应用中&#xff0c;任务队列是处理资源密集型操作的重要组件。本文将详细介绍一个基于FastAPI和Redis实现的高性能任务队列系统&#xff0c;该系统用于处理AI图片和视频的生成请求。我们将从架构…

光学跟踪系统在汽车远程设计验证中的应用优势

在汽车制造行业&#xff0c;传统设计验证流程依赖实体模型评审&#xff0c;存在周期长、成本高、跨地域协作困难等痛点。随着光学跟踪技术的突破&#xff0c;以ART、OptiTrack为代表的高精度光学追踪系统正重塑汽车远程设计验证的范式。本文从技术原理、应用场景及产业价值三个…

windows 访问ubuntu samba配置

1. 启用文件共享和SMB 1.0/CIFS支持 首先&#xff0c;确保Windows启用了文件共享和SMB 1.0/CIFS支持1。 步骤: 打开控制面板 -> 程序 -> 程序和功能 -> 启用或关闭Windows功能。 勾选“SMB 1.0/CIFS 文件共享支持”。 2. 启用不安全的来宾登录 有时需要启用不安…

Apache Doris 3.0.6 版本正式发布

亲爱的社区小伙伴们&#xff0c;Apache Doris 3.0.6 版本已于 2025 年 06 月 16 日正式发布。 该版本进一步提升了系统的性能及稳定性&#xff0c;欢迎大家下载体验。 GitHub 下载 官网下载 行为变更 禁止 Unique 表使用时序 Compaction存算分离场景下 Auto Bucket 单分桶容…

安全帽检测数据集简介(约2万张图片)

安全帽检测数据集简介&#xff08;约2万张图片&#xff09; &#x1f4e6; 已发布目标检测数据集合集&#xff08;持续更新&#xff09;安全帽检测数据集简介&#xff08;约2万张图片&#xff09;&#x1f4c1; 数据集概况&#x1f5bc;️ 数据样本展示 YOLOv8 训练实战&#x…

RJ45 网口实现千兆传输速率(1Gbps)的原理,涉及物理层传输技术、线缆标准、信号调制及网络协议等多方面的协同设计。以下从技术维度展开详细解析:

一、千兆以太网的标准与物理层基础 1. 标准规范 千兆以太网遵循 IEEE 802.3ab&#xff08;针对双绞线&#xff09;和 IEEE 802.3z&#xff08;针对光纤&#xff09;标准&#xff0c;其中 RJ45 接口对应双绞线场景&#xff0c;核心是通过四对双绞线&#xff08;CAT5e/CAT6 线缆…

Node.js爬虫 CheerioJS ‌轻量级解析、操作和渲染HTML及XML文档

简介 ‌ CheerioJS ‌ 是一个专为 Node.js 设计的轻量级库&#xff0c;用于解析、操作和渲染 HTML 及 XML 文档&#xff0c;语法类似 Jquery。 安装 npm install cheerio 示例 const cheerio require("cheerio");const html <html><head><tit…

华为运维工程师面试题(英语试题,内部资料)

华为运维工程师面试题(英语试题,内部资料) 一、英文自我介绍,重点突出自己运维经验(10分) 二、短语翻译(英译中)(15*3分=45分) 1. Data is a collection of un-organized facts, which can include words, numb ers, images, and sounds. 1. 数据是未经组织的事…

【赵渝强老师】使用mydumper备份MySQL

MySQL在备份方面包含了自身的mysqldump工具&#xff0c;但其只支持单线程工作&#xff0c;这就使得它无法迅速的备份数据。而mydumper作为一个实用工具&#xff0c;能够良好支持多线程工作&#xff0c;这使得它在处理速度方面十倍于传统的mysqldump。其特征之一是在处理过程中需…

华为云 Flexus+DeepSeek 征文|华为云单机部署 Dify-LLM 开发平台全流程指南【服务部署、模型配置、知识库构建全流程】

华为云 FlexusDeepSeek 征文&#xff5c;华为云单机部署 Dify-LLM 开发平台全流程指南【服务部署、模型配置、知识库构建全流程】 文章目录 华为云 FlexusDeepSeek 征文&#xff5c;华为云单机部署 Dify-LLM 开发平台全流程指南【服务部署、模型配置、知识库构建全流程】前言1、…

✨通义万相 2.1(Wan2.1)环境搭建指南:基于 CUDA 12.4 + Python 3.11 + PyTorch 2.5.1 GPU加速实战

&#x1f680;【超详细】基于 CUDA 12.4 Python 3.11 构建 Wan2.1 项目的集成推理环境&#xff08;含 PyTorch 2.5.1 GPU 安装教程&#xff09; 本文将一步一步带你搭建一个可用于构建和运行 Wan2.1 的深度学习环境&#xff0c;完全兼容 CUDA 12.4&#xff0c;并基于官方镜像 …

PROFIBUS DP转ETHERNET/IP在热电项目中的创新应用

在热电项目中&#xff0c;多种设备的高效协同是保障能源稳定供应的关键。PROFIBUS DP与ETHERNET/IP两种工业通信协议因特性不同而应用场景各异。通过协议转换技术实现JH-PB-EIP疆鸿智能PROFIBUS DP转ETHERNET/IP&#xff0c;可整合西门子PLC与电力仪表、变频器等设备&#xff0…

精准把脉 MySQL 性能!xk6-sql 并发测试深度指南

在数据库性能测试领域&#xff0c;xk6-sql凭借其强大的功能和灵活性&#xff0c;成为众多开发者和测试人员的得力工具。它能够模拟高并发场景&#xff0c;精准测试数据库在不同负载下的性能表现。然而&#xff0c;在一些网络受限的环境中&#xff0c;实现xk6-sql的离线安装以及…