Docker高级管理--Dockerfile 镜像制作

目录

一:Docker 镜像管理

1:Docker 镜像结构

(1) 镜像分层核心概念

(2)镜像层特性

(3)关键操作命令

(4)优化建议

2:Dockerfile介绍

(1)Dockerfile 基础特性

(2)Dockerfile 核心指令

(3)Dockerfile 构建与优化

(4)Dockerfile 最佳实践

二:Dockerfile语法基础

(1)基础指令

(2)环境设置指令

(3)文件操作指令

(4)执行命令指令

(5)网络与存储指令

三:Dockerfile 系例实施

1:案例 1--构建 nginx 容器

(1)创建dockerfile 工作目录

(2)创建dockerfile

(3)编写Nginx启动脚本

(4)用Dockerfile创建镜像

(5)启动容器

(6)访问nginx网站

2:案例 2--构建 Tomcat 容器

(1)创建工作目录

3:案例 3--构建 mysq1 容器

(1)创建工作目录

(2)创建dockerfile 文件

​编辑

​编辑

(3)编写mysql初始化脚本

​编辑

(4)生成镜像

​编辑

(5)创建容器

4:案例 4--构建 php

(1)创建工作目录

(2)创建dockerfile(yum 安装安装)

​编辑

(3)生成镜像

​编辑

(4)启动容器

四:Dockerfile 语法注意事项


一:Docker 镜像管理

       Docker 镜像除了是 Docker 的核心技术之外,也是应用发布的标准格式。一个完整的 Docker 镜像可以支撑一个 Docker 容器的运行,在 Docker 的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务。 如果要把已经安装的服务进行迁移,就需要把环境以及搭建的服务生成新的镜像。本案例将介绍如何创建 Docker 镜像。

1:Docker 镜像结构

(1) 镜像分层核心概念

特性说明
分层结构镜像由多个只读层(Layer)叠加组成,每层对应 Dockerfile 中的一条指令
容器读写层容器运行时在镜像顶部添加一个可读写层(容器层),所有修改均写入此层
存储位置默认存储在 /var/lib/docker/<storage-driver>(如 overlay2
存储驱动管理镜像层和容器层的读写机制(如 overlay2aufsdevicemapper

(2)镜像层特性

特性说明示例/影响
指令对应分层Dockerfile 中每条指令(如 RUNCOPY)生成一个独立镜像层RUN apt-get update 会生成一个包含更新后文件系统的层
缓存复用未更改的指令层可直接复用缓存,加速构建修改 COPY 的文件后,后续所有层缓存失效
不可变性已构建的镜像层不可修改,删除文件仅在新层标记删除,原层仍保留文件数据即使后续层删除文件,镜像体积不会减小(需合并层优化)
依赖链失效某一层缓存失效后,其后续所有层缓存均需重新构建调整 Dockerfile 指令顺序可优化缓存利用率(如先复制静态文件)

(3)关键操作命令

命令作用示例
docker history查看镜像各层构成及大小docker history nginx:latest
docker inspect查看镜像详细信息(包括分层哈希)docker inspect nginx:latest
docker diff查看容器层文件改动(对比镜像层)docker diff <容器ID>
docker system df查看 Docker 磁盘使用情况(含镜像、容器层体积)docker system df -v

(4)优化建议

策略说明示例
合并指令使用 && 合并多个 RUN 指令减少层数RUN apt-get update && apt-get install -y curl
合理排序指令将高频变动的指令(如 COPY)放在 Dockerfile 尾部先安装依赖,最后复制代码
使用多阶段构建通过多阶段构建(FROM ... AS builder)剔除中间层,减小最终镜像体积编译阶段与运行阶段分离
清理无用文件在同一层中删除临时文件避免残留RUN apt-get install -y curl && rm -rf /var/lib/apt/lists/*

2:Dockerfile介绍

(1)Dockerfile 基础特性

特性说明
本质由多条指令组成的脚本文件,用于自动化构建 Docker 镜像
文件命名默认文件名 Dockerfile(首字母大写),或通过 -f 指定自定义文件名
指令与命令每条指令对应一个 Linux 命令(如 RUNCOPY
构建过程Docker 按顺序解析指令并生成镜像层,解决依赖关系
透明性相比直接使用镜像,Dockerfile 明确展示镜像构建逻辑

(2)Dockerfile 核心指令

指令作用示例
FROM指定基础镜像(必须为第一条指令)FROM ubuntu:20.04
RUN执行命令并创建新镜像层(常用于安装软件)RUN apt-get update && apt-get install -y curl
COPY复制宿主机文件到镜像(需使用绝对路径)COPY ./app /usr/src/app
ADD类似 COPY,但支持自动解压压缩包和远程 URLADD https://example.com/file.tar.gz /data
WORKDIR设置工作目录(后续指令的相对路径基于此目录)WORKDIR /app
EXPOSE声明容器运行时监听的端口(实际映射需通过 -p 参数)EXPOSE 8080
ENV设置环境变量(可被后续指令和容器进程使用)ENV NODE_ENV=production
CMD指定容器启动时的默认命令(可被 docker run 覆盖)CMD ["python", "app.py"]
ENTRYPOINT类似 CMD,但命令不可被 docker run 覆盖(通常与 CMD 搭配使用)ENTRYPOINT ["nginx"] + CMD ["-g", "daemon off;"]
VOLUME创建匿名数据卷挂载点(实际挂载需通过 -v 参数)VOLUME /data

(3)Dockerfile 构建与优化

操作命令说明
构建镜像docker build -t myimage:tag .使用当前目录下的 Dockerfile 构建镜像
指定构建文件docker build -f Dockerfile.dev -t myimage:dev .使用自定义文件名构建
多阶段构建Dockerfile FROM builder AS build ... FROM alpine COPY --from=build ...减少最终镜像体积(丢弃中间层)
忽略文件创建 .dockerignore 文件排除无关文件避免 COPY 时复制 node_modules 等大目录

(4)Dockerfile 最佳实践

实践建议说明示例
指令合并合并多个 RUN 指令减少镜像层数RUN apt-get update && apt-get install -y curl
最小化基础镜像使用 alpine 等轻量镜像作为基础FROM python:3.9-alpine
清理缓存文件同一层中删除临时文件以减小体积RUN apt-get install -y curl && rm -rf /var/lib/apt/lists/*
明确版本标签避免使用 latest 标签,确保构建可复现FROM nginx:1.21.6
非 root 用户运行使用 USER 指令降低权限USER 1000

总结

  • Dockerfile 是声明式的镜像构建蓝图,通过指令逐层生成镜像。

  • 合理设计指令顺序和内容可优化构建速度、镜像安全性和可维护性。

  • 结合多阶段构建和 .dockerignore 可显著减小镜像体积。

二:Dockerfile语法基础

        Dockerfile 是一个文本文件,其中包含了一系列用于构建 Docker 镜像的指令。通过编写
Dockerfile,可以自动化地创建自定义的 Docker 镜像。以下为你详细介绍 Dockerfile 的常用语法:

(1)基础指令

指令作用语法示例说明
FROM指定基础镜像FROM ubuntu:20.04必须为第一条指令,支持多阶段构建(如 FROM ... AS builder
LABEL添加元数据(替代已弃用的 MAINTAINERLABEL maintainer="John" version="1.0"可定义多个键值对,用于镜像分类和管理

(2)环境设置指令

指令作用语法示例说明
ENV设置持久化环境变量ENV MYSQL_ROOT_PASSWORD=123456容器运行时仍有效,可被应用程序读取
ARG定义构建时参数(仅在构建阶段有效)ARG VERSION=1.0可通过 --build-arg 覆盖:docker build --build-arg VERSION=2.0 .

(3)文件操作指令

指令作用语法示例说明
COPY复制本地文件到镜像COPY ./src /app/src需使用绝对路径,不支持自动解压或远程 URL
ADD增强版 COPY,支持远程 URL 和自动解压ADD http://example.com/file.tar.gz /data远程文件需显式指定权限(如 RUN chmod
WORKDIR设置工作目录WORKDIR /app后续指令(如 RUNCOPY)均基于此目录执行

(4)执行命令指令

指令作用语法示例说明
RUN在构建时执行命令RUN apt-get update && apt-get install -y curl推荐合并多条命令减少层数
CMD指定容器启动时的默认命令CMD ["python", "app.py"]可被 docker run 覆盖,一个 Dockerfile 仅最后一个 CMD 生效
ENTRYPOINT定义容器启动时的主命令(不可被覆盖)ENTRYPOINT ["nginx"]常与 CMD 搭配使用:ENTRYPOINT ["python"] + CMD ["app.py"]

(5)网络与存储指令

指令作用语法示例说明
EXPOSE声明容器运行时监听的端口EXPOSE 8080实际映射需通过 docker run -p 8080:8080 实现
VOLUME创建匿名数据卷挂载点VOLUME ["/data"]实际挂载需通过 docker run -v /host/path:/data 指定

关键对比

对比项COPY vs ADDCMD vs ENTRYPOINT
核心差异ADD 支持远程 URL 和解压,COPY 更透明ENTRYPOINT 不可覆盖,CMD 可覆盖
使用建议优先使用 COPY,除非需要 ADD 的特性固定命令用 ENTRYPOINT,参数用 CMD

三:Dockerfile 系例实施

1:案例 1--构建 nginx 容器

(1)创建dockerfile 工作目录

(2)创建dockerfile

(3)编写Nginx启动脚本

(4)用Dockerfile创建镜像

(5)启动容器

或者:

(6)访问nginx网站

2:案例 2--构建 Tomcat 容器

(1)创建工作目录

(2)创建dockerfile

(3)创建启动脚本

(4)用Dockerfile创建镜像

(5)启动容器

(6)访问tomcat网站

http://192.168.10.101:8081

3:案例 3--构建 mysq1 容器

(1)创建工作目录

(2)创建dockerfile 文件

(3)编写mysql初始化脚本

(4)生成镜像

(5)创建容器

4:案例 4--构建 php

(1)创建工作目录

(2)创建dockerfile(yum 安装安装)

(3)生成镜像

(4)启动容器

四:Dockerfile 语法注意事项

     在编写 Dockerfile 时,掌握基础语法的注意事项能够帮助你构建出高效、可靠且易于维护的Docker 镜像。以下是一些关键的注意事项:

类别要点详细说明/示例
指令规范大小写建议使用大写(如 FROMRUN)增强可读性
顺序将不常变动的指令(如基础包安装)放在前面,利用缓存;频繁变动的指令(如源码复制)放在后面
注释使用 # 解释复杂步骤,如 # Install core dependencies
基础镜像稳定性与安全性优先选择官方镜像(如 ubuntu:22.04alpine:3.18
镜像大小轻量级场景用 Alpine(体积小),完整功能用 Debian/Ubuntu
文件操作COPY vs ADD优先用 COPY(如 COPY app.py /app/);仅需解压或远程下载时用 ADD(如 ADD https://example.com/file.tar.gz /tmp/
文件路径确保路径在构建上下文中,如 docker build -t myapp . 中的 . 是上下文根目录
命令执行RUN 优化合并命令减少层数:
RUN apt-get update && apt-get install -y python3 && rm -rf /var/lib/apt/lists/*
清理缓存删除临时文件:
RUN yum clean all && rm -rf /tmp/*
CMD & ENTRYPOINTENTRYPOINT ["python3"] + CMD ["app.py"]:运行时可通过 docker run myapp --debug 覆盖 CMD
环境变量ENV vs ARGENV 持久化(如 ENV APP_PORT=8080);ARG 仅构建时有效(如 ARG VERSION=1.0,需 --build-arg 传递)
安全性敏感信息通过运行时传入:
docker run -e DB_PASSWORD=123 myapp
网络与端口EXPOSE声明容器端口(如 EXPOSE 80),实际映射需 docker run -p 8080:80
缓存管理利用缓存不变的内容(如 WORKDIR /app)放前面,变动的(如 COPY . /app)放后面
清理缓存强制重新构建:docker build --no-cache -t myapp .

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

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

相关文章

Leetcode力扣解题记录--第42题 接雨水(动规和分治法)

题目链接&#xff1a;42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 这里我们可以用两种方法去解决巧妙地解决这个题。首先来看一下题目 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。…

宝塔配置pgsql可以远程访问

本地navicat premium 17.0 可以远程访问pgsql v16.1宝塔的软件商店里&#xff0c;找到pgsql管理器&#xff1b;在pgsql管理器里找到客户端认证&#xff1a;第二步&#xff1a;配置修改&#xff0c;CtrlF 查找listen_addresses关键字&#xff1b;第三步&#xff1a;在navicat里配…

小架构step系列12:单元测试

1 概述 测试的种类很多&#xff1a;单元测试、集成测试、系统测试等&#xff0c;程序员写代码进行测试的可以称为白盒测试&#xff0c;单元测试和集成测试都可以进行白盒测试&#xff0c;可以理解为单元测试是对某个类的某个方法进行测试&#xff0c;集成测试则是测试一连串的…

SpringBoot3-Flowable7初体验

目录简介准备JDKMySQLflowable-ui创建流程图要注意的地方编码依赖和配置控制器实体Flowable任务处理类验证启动程序调用接口本文源码参考简介 Flowable是一个轻量的Java业务流程引擎&#xff0c;用于实现业务流程的管理和自动化。相较于老牌的Activiti做了一些改进和扩展&…

phpMyAdmin:一款经典的MySQL在线管理工具又回来了

phpMyAdmin 是一个免费开源、基于 Web 的 MySQL/MariaDB 数据库管理和开发工具。它提供了一个直观的图形用户界面&#xff0c;使得我们无需精通复杂的 SQL 命令也能执行大多数数据库管理任务。 phpMyAdmin 项目曾经暂停将近两年&#xff0c;不过 2025 年又开始发布新版本了。 …

存储服务一NFS文件存储概述

前言&#xff1a; 网络文件系统&#xff08;Network File System&#xff0c;NFS&#xff09;诞生于1984年&#xff0c;由Sun Microsystems首创&#xff0c;旨在解决异构系统间的文件共享需求。作为一种基于客户端-服务器架构的分布式文件协议&#xff0c;NFS允许远程主机通过T…

libimagequant 在 mac 平台编译双架构

在 macOS 上编译 libimagequant 的双架构&#xff08;aarch64 x86_64&#xff09;通用二进制库&#xff0c;以下是完整步骤&#xff1a;​​1. 准备 Rust 工具链​​ # 安装两个目标平台 rustup target add aarch64-apple-darwin x86_64-apple-darwin# 确认安装成功 rustup ta…

暑期自学嵌入式——Day01(C语言阶段)

点关注不迷路哟。你的点赞、收藏&#xff0c;一键三连&#xff0c;是我持续更新的动力哟&#xff01;&#xff01;&#xff01; 主页&#xff1a; 一位搞嵌入式的 genius-CSDN博客https://blog.csdn.net/m0_73589512?spm1011.2682.3001.5343感悟&#xff1a; 今天我认为最重…

Flutter基础(前端教程⑧-数据模型)

这个示例展示了如何创建数据模型、解析 JSON 数据&#xff0c;以及在 UI 中使用这些数据&#xff1a;import package:flutter/material.dart; import dart:convert;void main() {// 示例&#xff1a;手动创建User对象final user User(id: 1,name: 张三,age: 25,email: zhangsa…

SSRF10 各种限制绕过之30x跳转绕过协议限制

ssrf漏洞在厂商的处理下可能进行一些特殊处理导致我们无法直接利用漏洞 有以下四种&#xff1a; 1.ip地址限制绕过 2.域名限制绕过 3.30x跳转绕过域名限制 4.DNS rebinding绕过内网ip限制 本章我们讲30x跳转绕过域名限制 30x跳转绕过域名限制 之前我们使用ssrf漏洞时可以…

DNS解析过程和nmap端口扫描

目录 DNS解析流程&#xff1a; nmap端口扫描 指定扫描方式 TCP全连接扫描 -sT SYN半连接扫描 -sS -sT和 -sS的区别 Linux提权 利用好谷歌语法查找敏感信息 如果自己搭建了网站文件要放在phpstudy_pro\WWW下。 如果想要使用域名访问网站&#xff0c;需要在phpstudy_pro…

【基于开源大模型(如deepseek)开发应用及其发展趋势的一点思考】

1. 开源大模型技术发展现状1.1 DeepSeek等主流开源大模型的技术特性分析 DeepSeek作为当前最具代表性的开源大模型之一&#xff0c;其技术架构具有多项创新特性。该模型采用混合专家架构(MoE)&#xff0c;通过将视觉编码分离为"理解"和"生成"两条路径&…

java8 ConcurrentHashMap 桶级别锁实现机制

Java 8 ConcurrentHashMap 桶级别锁实现机制 Java 8 中的 ConcurrentHashMap 抛弃了分段锁设计&#xff0c;采用了更细粒度的桶级别锁&#xff08;bucket-level locking&#xff09;实现&#xff0c;这是其并发性能提升的关键。下面详细解析其实现原理&#xff1a; 1. 基本实现…

Python正则表达式实战指南

一 正则表达式库正则表达式是文本处理中不可或缺的强大工具&#xff0c;Python通过re模块提供了完整的正则表达式支持。本文将详细介绍re模块中最常用的match()、search()和findall()函数&#xff0c;以及贪婪模式与非贪婪模式的区别&#xff0c;帮助读者掌握Python中正则表达式…

使用球体模型模拟相机成像:地面与天空的可见性判断与纹理映射

在传统相机模拟中&#xff0c;地面通常被建模为一个平面&#xff08;Plane&#xff09;&#xff0c;这在低空场景下是合理的。但在更大视场范围或远距观察时&#xff0c;地球的曲率不可忽视。因此&#xff0c;我们需要将地面模型从平面升级为球体&#xff0c;并基于球面与光线的…

Agent自动化与代码智能

核心问题&#xff1a; 现在很多团队做AI系统有个大毛病&#xff1a;只顾追求“高大上”的新技术&#xff08;尤其是AI Agent&#xff09;&#xff0c;不管实际业务需不需要。 结果系统搞得又贵、又复杂、还容易出错。大家被“Agent”这个概念搞晕了&#xff1a;到底啥时候用简单…

SQL141 试卷完成数同比2020年的增长率及排名变化

SQL141 试卷完成数同比2020年的增长率及排名变化 withtemp as (selectexam_id,tag,date(submit_time) as submit_timefromexamination_infoleft join exam_record using (exam_id)wheresubmit_time is not null),2021_temp as (selecttag,count(*) as exam_cnt_21,rank() over…

C语言<数据结构-单链表>

链表是一种常见且重要的数据结构&#xff0c;在 C 语言中&#xff0c;它通过指针将一系列的节点连接起来&#xff0c;每个节点可以存储不同类型的数据。相比数组&#xff0c;链表在插入和删除元素时不需要移动大量数据&#xff0c;具有更好的灵活性&#xff0c;尤其适合处理动态…

archive/tar: unknown file mode ?rwxr-xr-x

这个是我在docker build报错的&#xff0c;这是一个node.js项目。我猜你也是一个node.js下的项目&#xff0c;或者前端项目。 解决方法&#xff1a; .dockerignore里面写一下node_modules就行了。 未能解决&#xff1a;archive/tar&#xff1a;未知文件模式&#xff1f;rwxr-…

【前端】ikun-markdown: 纯js实现markdown到富文本html的转换库

文章目录背景界面当前支持的 Markdown 语法不支持的Markdown 语法代码节选背景 出于兴趣,我使用js实现了一个 markdown语法 -> ast语法树 -> html富文本的库, 其速度应当慢于正则实现的同类js库, 但是语法扩展性更好, 嵌套列表处理起来更方便. 界面 基于此js实现vue组…