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

【Docker从入门到入土 3】Docker镜像的创建方法

Part3

  • 一、Docker镜像
    • 1.1 镜像的概念
    • 1.2 镜像结构的分层
  • 二、Docker镜像的创建
    • 2.1 基于现有镜像创建
      • 2.1.1 创建思路
      • 2.1.2 举个例子
    • 2.2 基于本地模板创建
    • 2.3 基于Dockerfile 创建
  • 三、Dockerfile 详解
    • 3.1 Dockerfile 操作指令
      • 3.1.1 常用的操作指令
      • 3.1.2 CMD和ENTRYPOINT的区别?
      • 3.1.3 ADD和COPY的区别?
    • 3.2 基于Dockerfile构建镜像的步骤
    • 3.3 基于Dockerfile创建镜像应用实例
      • Step1 建立工作目录
      • Step2 创建并编写Dockerfile文件
      • Step3 编写执行脚本
      • Step4 创建测试页面
      • Step5 使用Dockerfile生成镜像
      • Step6 使用新的镜像运行容器并测试
  • 四、如何去缩小构建镜像的大小?

一、Docker镜像

1.1 镜像的概念

镜像是创建容器的基础

镜像是一个只读的模板文件,里面包含运行容器中的应用程序所有需要的所有内容(应用程序文件、配置文件、运行库文件、依赖包等)。

1.2 镜像结构的分层

在这里插入图片描述

Docker 镜像由多个只读层组成,每个层都包含了文件系统的一部分。

这些层按照从底向上的顺序依次叠加,形成一个完整的镜像。

镜像的最底层是一个基础镜像(Base Image),上面叠加了一系列更高层的镜像,每个层都是前一个层的增量变化。

在容器启动时,Docker 引擎会将这些层通过联合文件系统合并成一个容器文件系统。

在容器运行过程中,Docker 引擎将修改操作写入一个可写层(Writeable Layer),该层仅保存容器运行时的状态和数据。

这种分层和联合文件系统的设计使得镜像的创建和传播非常高效,节省了存储空间和下载时间。

二、Docker镜像的创建

创建镜像有三种方法,分别为基于已有镜像创建基于本地模板创建以及基于Dockerfile创建

2.1 基于现有镜像创建

基于已有镜像创建主要使用 docker commit 命令。

本质上就是把一个容器里面运行的程序和该程序的运行环境打包,生成新的镜像

#基本格式
docker commit [选项] 容器ID/名称 仓库名称:[标签]##常用选项##
-m 说明信息;
-a 作者信息;
-p 生成过程中停止容器的运行。

2.1.1 创建思路

1)先用现有镜像创建启动容器 ,使用 docker run命令;

2)再进入容器进行内容更新 ,使用docker exec命令;

3)最后提交成新的镜像 ,使用 docker commit命令。

2.1.2 举个例子

首先启动一个镜像,在容器里做修改

docker create -it centos:7 /bin/bash
docker ps -a

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后将修改后的容器提交为新的镜像,需要使用该容器的 ID 号创建新镜像

docker commit -m "new" -a "centos" 6446831c79c7 centos:testdocker image

在这里插入图片描述

2.2 基于本地模板创建

通过导入操作系统模板文件生成镜像,模板可以从 OPENVZ 开源项目下载。

下载地址为http://openvz.org/Download/template/precreated

举个例子

#下载
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz

在这里插入图片描述

#导入为镜像
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test

在这里插入图片描述

2.3 基于Dockerfile 创建

除了手动生成Docker镜像之外,可以使用Dockerfile自动生成镜像。

Dockerfile是由多条的指令组成的文件,其中每条指令对应 Linux 中的一条命令,Docker 程序将读取Dockerfile 中的指令生成指定镜像。

Dockerfile结构大致分为四个部分:基础镜像信息维护者信息镜像操作指令容器启动时执行指令

Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#“号开头的注释。

三、Dockerfile 详解

3.1 Dockerfile 操作指令

3.1.1 常用的操作指令

常用指令含义
FROM指定基础镜像(是Dockerfile的第一行指令)
MAINTAINER指定镜像维护人信息(可选)
RUN指定Linux命令,如果要执行连续多条命令时建议用 ; 或 && 或 <<EOF 串起来使用
EXPOSE指定容器应用的端口
ENV设置镜像的环境变量
ADD/COPY复制文件/目录到镜像里
VOLUME指定容器的匿名数据卷
USER指定容器的运行用户
WORKDIR指定后续镜像层的工作目录
ARG指定构建镜像时传入的参数变量,docker build --build-arg 变量=值
CMD/ENTRYPOINT指定容器启动时执行的命令

3.1.2 CMD和ENTRYPOINT的区别?

共同点:都可以用来指定容器启动命令。

区别:ENTRYPOINT指定的容器启动命令优先级更高

如果CMD和ENTRYPOINT同时存在,那么CMD指定的内容将作为ENTRYPOINT指定的容器启动命令的选项或参数使用。

容器启动时运行的命令优先级
docker run --entrypoint=“命令” > 镜像里的ENTRYPOINT指定的命令 > docker run … 镜像 命令 > 镜像里的CMD指定的命令

3.1.3 ADD和COPY的区别?

共同点:都可以将本地的文件/目录复制到镜像里。

区别:ADD还可以通过URL下载文件复制到镜像里,还能将本地的压缩包解压后复制到镜像里。

URL下载和压缩包解压特性不能同时使用

3.2 基于Dockerfile构建镜像的步骤

在编写 Dockerfile 时,有严格的格式需要遵循

1)第一行 用FROM指令指明所用的基础镜像;

2)之后用MAINTAINER指令说明维护镜像的用户信息;

3)然后用镜像操作相关指令,比如RUN EXPOSE ENV ADD COPY 等指令,编写构建镜像的过程。每运行一条指令,都会给基础镜像添加新的一层;

4)结尾使用CMD/ENTRYPOINT指令指定容器启动时执行的命令;

5)最后使用docker build -t 新镜像名:标签 . [-f Dockerfile文件路径]命令构建镜像。

3.3 基于Dockerfile创建镜像应用实例

Step1 建立工作目录

mkdir  /opt/apache
cd  /opt/apache

Step2 创建并编写Dockerfile文件

vim Dockerfile#基于的基础镜像
FROM centos:7
#维护镜像的用户信息
MAINTAINER this is apache image <hmj>
#镜像操作指令安装apache软件
RUN yum -y update
RUN yum -y install httpd
#开启 80 端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html##方法一
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]##方法二
ENTRYPOINT [ "/usr/sbin/apachectl" ]
CMD ["-D", "FOREGROUND"]

Step3 编写执行脚本

vim  run.shrm -rf /run/httpd/*							#清理httpd的缓存
/usr/sbin/apachectl -D FOREGROUND			#指定为前台运行#因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。

Step4 创建测试页面

echo "this is test web from byyb " > index.html
ls

在这里插入图片描述

Step5 使用Dockerfile生成镜像

docker build -t httpd:centos .   		
#注意别忘了末尾有"."

在这里插入图片描述

Step6 使用新的镜像运行容器并测试

1.使用新镜像运行容器

docker run -d -p 1216:80 httpd:centos

在这里插入图片描述

docker ps -a 

在这里插入图片描述

2.测试

firefox http://192.168.2.106:1216

在这里插入图片描述

四、如何去缩小构建镜像的大小?

1)尽可能的采用小体积的基础镜像

2)尽可能的减少Dockerfile指令的数量

3)在RUN指令里添加安装软件后清空yum/apt缓存、软件包的命令

4)使用多级(多阶段)构建的方法 。

FROM 第一阶段的基础镜像 AS 别名
......
FROM 第二阶段的基础镜像
COPY --from=别名  第一阶段构建的文件/目录  当前阶段的路径.....
CMD/ENTRYPOINT 指定容器启动时执行的命令

相关文章:

【Docker从入门到入土 3】Docker镜像的创建方法

Part3 一、Docker镜像1.1 镜像的概念1.2 镜像结构的分层 二、Docker镜像的创建2.1 基于现有镜像创建2.1.1 创建思路2.1.2 举个例子 2.2 基于本地模板创建2.3 基于Dockerfile 创建 三、Dockerfile 详解3.1 Dockerfile 操作指令3.1.1 常用的操作指令3.1.2 CMD和ENTRYPOINT的区别…...

Unity实现方圆X范围随机生成怪物

using System.Collections; using System.Collections.Generic; using UnityEngine;public class CreatMonster : MonoBehaviour {// S这个脚本间隔一点时间生成怪物/*1.程序逻辑* 1. 设计一个计时器* 2.间隔一段时间3s执行一下 * */float SaveTime 0f;public GameObject …...

竞赛 深度学习乳腺癌分类

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…...

基于斑马优化的BP神经网络(分类应用) - 附代码

基于斑马优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于斑马优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.斑马优化BP神经网络3.1 BP神经网络参数设置3.2 斑马算法应用 4.测试结果&#xff1a;5.M…...

LINUX | hexdump以16进制查看文件内容

LINUX | hexdump以16进制查看文件内容 时间&#xff1a;2023-10-20 文章目录 LINUX | hexdump以16进制查看文件内容1.参考2.示例1.以ASCII字符显示文件中字符2.以16进制和相应的ASCII字符显示文件里的字符3.只显示文件中前n个字符4.以偏移量开始格式输出 1.参考 1.Linux命令–h…...

layui中页面切分

1.引入Split插件 2.切屏比例设置 pallet与material为标签的id 3.html内部标签上设置切分盒子 4参考网站 : 网站链接...

循环神经网络(Recurrent Neural Network)

1. 为什么需要循环神经网络 RNN 上图是一幅全连接神经网络图&#xff0c;我们可以看到输入层-隐藏层-输出层&#xff0c;他们每一层之间是相互独立地&#xff0c;(框框里面代表同一层)&#xff0c;每一次输入生成一个节点&#xff0c;同一层中每个节点之间又相互独立的话&#…...

管理类联考——英语二——阅读篇——题材:经济

文章目录 2011 年&#xff0c;Text 2——题材&#xff1a;经济句意理解题-原词复现一般不选&#xff0c;但是要留意无中生有推断题-原词复现&#xff0c;注意是否“无中生有”“对象错误”“词意相反”推断题推断题主旨题-不了解阅读意思&#xff0c;很难做出选择 2011 年&…...

【Java】ListIterator

列表迭代器&#xff1a; ListIterator listIterator()&#xff1a;List 集合特有的迭代器该迭代器继承了 Iterator 迭代器&#xff0c;所以&#xff0c;就可以直接使用 hasNext()和next()方法。特有功能&#xff1a; Object previous()&#xff1a;获取上一个元素boolean hasPr…...

EV SSL数字证书贵吗

EVSSL证书通常适用于具有高需求的网站和企业&#xff0c;特别是涉及在线交易、金融服务、电子商务平台等需要建立用户信任的场景。大型企业、金融机构、电子商务平台等可以受益于使用EV证书来提升品牌形象和安全性。 申请EVSSL证书&#xff08;Extended Validation SSL certifi…...

nginx安装详细步骤和使用说明

下载地址&#xff1a; https://download.csdn.net/download/jinhuding/88463932 详细说明和使用参考&#xff1a; 地址&#xff1a;http://www.gxcode.top/code 一 nginx安装步骤&#xff1a; 1.nginx安装与运行 官网 http://nginx.org/1.1安装gcc环境 # yum install gcc-c…...

11 Self-Attention相比较 RNN和LSTM的优缺点

博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https://github.com/nickchen121/Pre-training-language-model 配套博客链接:https://www.cnblogs.com/nickchen121/p/15105048.html RNN 无法做长序列,当一…...

数据集-特征降维

1、降维 降维是指在某些限定条件下&#xff0c;降低随机变量(特征)个数&#xff0c;得到一组“不相关”主变量的过程 降低随机变量的个数 相关特征(correlated feature) 相对湿度与降雨量之间的相关等等 正是因为在进行训练的时候&#xff0c;我们都是使用特征进行学习。如果…...

【C语言】字符串+内存函数的介绍

&#x1f388;个人主页&#xff1a;.满船清梦压星河_-CSDN博客 &#x1f302;c/c领域新星创作者 &#x1f389;欢迎&#x1f44d;点赞✍评论❤️收藏 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xf…...

C#WPF资源字典应用实例

本文实例演示C#WPF资源字典应用 目录 一、资源字典 二、实例 1新建一个资源字典 2添加到资源文件App.xaml...

如何在国际腾讯云服务器上设置IP节点的密码?

跟着云计算技术的发展&#xff0c;越来越多的企业和个人开始运用云服务器来存储和处理数据。腾讯云服务器是一款非常受欢迎的云服务器产品&#xff0c;它提供了高效稳定的计算能力。在运用腾讯云服务器的过程中&#xff0c;咱们可能需求设置IP节点的暗码&#xff0c;以便维护咱…...

浅谈基于敏捷开发交付应对突发项目

软件项目开发的全过程是一个很大的范畴&#xff0c;从确定需求&#xff0c;到编码设计&#xff0c;到集成发布&#xff0c;到运维、运营、设计方方面面。在这个过程中&#xff0c;交付过程是非常关键的&#xff0c;因为它影响着软件的质量、稳定性和用户体验。 在当今竞争激烈的…...

1.工具-VSCode有哪些常用快捷键

题记 记录一些vscode的常用快捷键 基本编辑 Ctrl C&#xff1a;复制选定内容。Ctrl X&#xff1a;剪切选定内容。Ctrl V&#xff1a;粘贴剪贴板内容。Ctrl Z&#xff1a;撤销上一步操作。Ctrl Shift Z&#xff1a;恢复上一步操作。Ctrl D&#xff1a;选择下一个匹配项…...

行业模型应该如何去拆解?

行业模型应该如何去拆解&#xff1f; 拆解行业模型是一个复杂的过程&#xff0c;涉及对整个行业的深入分析和理解。下面是一些步骤和方法&#xff0c;可以帮助你系统地拆解行业模型&#xff1a; 1. 确定行业范围 定义行业&#xff1a;明确你要分析的行业是什么&#xff0c;包括…...

【开题报告】基于微信小程序的签到打卡系统的设计与实现

1.研究背景与意义 考勤管理是企业日常管理的重要内容之一。随着企业规模的扩大和员工数量的增加&#xff0c;传统的考勤管理方式已经不能满足需求。而基于微信小程序的签到打卡系统可以提供方便快捷的签到打卡服务&#xff0c;为企业管理人员提高工作效率和员工考勤管理提供了…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

【实施指南】Android客户端HTTPS双向认证实施指南

&#x1f510; 一、所需准备材料 证书文件&#xff08;6类核心文件&#xff09; 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法&#xff0c;由约翰冯诺伊曼在1945年提出。其核心思想包括&#xff1a; 分割(Divide)&#xff1a;将待排序数组递归地分成两个子…...