【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 精度,召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…...
基于斑马优化的BP神经网络(分类应用) - 附代码
基于斑马优化的BP神经网络(分类应用) - 附代码 文章目录 基于斑马优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.斑马优化BP神经网络3.1 BP神经网络参数设置3.2 斑马算法应用 4.测试结果:5.M…...
LINUX | hexdump以16进制查看文件内容
LINUX | hexdump以16进制查看文件内容 时间: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 上图是一幅全连接神经网络图,我们可以看到输入层-隐藏层-输出层,他们每一层之间是相互独立地,(框框里面代表同一层),每一次输入生成一个节点,同一层中每个节点之间又相互独立的话&#…...
管理类联考——英语二——阅读篇——题材:经济
文章目录 2011 年,Text 2——题材:经济句意理解题-原词复现一般不选,但是要留意无中生有推断题-原词复现,注意是否“无中生有”“对象错误”“词意相反”推断题推断题主旨题-不了解阅读意思,很难做出选择 2011 年&…...
【Java】ListIterator
列表迭代器: ListIterator listIterator():List 集合特有的迭代器该迭代器继承了 Iterator 迭代器,所以,就可以直接使用 hasNext()和next()方法。特有功能: Object previous():获取上一个元素boolean hasPr…...
EV SSL数字证书贵吗
EVSSL证书通常适用于具有高需求的网站和企业,特别是涉及在线交易、金融服务、电子商务平台等需要建立用户信任的场景。大型企业、金融机构、电子商务平台等可以受益于使用EV证书来提升品牌形象和安全性。 申请EVSSL证书(Extended Validation SSL certifi…...
nginx安装详细步骤和使用说明
下载地址: https://download.csdn.net/download/jinhuding/88463932 详细说明和使用参考: 地址:http://www.gxcode.top/code 一 nginx安装步骤: 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、降维 降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程 降低随机变量的个数 相关特征(correlated feature) 相对湿度与降雨量之间的相关等等 正是因为在进行训练的时候,我们都是使用特征进行学习。如果…...
【C语言】字符串+内存函数的介绍
🎈个人主页:.满船清梦压星河_-CSDN博客 🌂c/c领域新星创作者 🎉欢迎👍点赞✍评论❤️收藏 😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教…...
C#WPF资源字典应用实例
本文实例演示C#WPF资源字典应用 目录 一、资源字典 二、实例 1新建一个资源字典 2添加到资源文件App.xaml...
如何在国际腾讯云服务器上设置IP节点的密码?
跟着云计算技术的发展,越来越多的企业和个人开始运用云服务器来存储和处理数据。腾讯云服务器是一款非常受欢迎的云服务器产品,它提供了高效稳定的计算能力。在运用腾讯云服务器的过程中,咱们可能需求设置IP节点的暗码,以便维护咱…...
浅谈基于敏捷开发交付应对突发项目
软件项目开发的全过程是一个很大的范畴,从确定需求,到编码设计,到集成发布,到运维、运营、设计方方面面。在这个过程中,交付过程是非常关键的,因为它影响着软件的质量、稳定性和用户体验。 在当今竞争激烈的…...
1.工具-VSCode有哪些常用快捷键
题记 记录一些vscode的常用快捷键 基本编辑 Ctrl C:复制选定内容。Ctrl X:剪切选定内容。Ctrl V:粘贴剪贴板内容。Ctrl Z:撤销上一步操作。Ctrl Shift Z:恢复上一步操作。Ctrl D:选择下一个匹配项…...
行业模型应该如何去拆解?
行业模型应该如何去拆解? 拆解行业模型是一个复杂的过程,涉及对整个行业的深入分析和理解。下面是一些步骤和方法,可以帮助你系统地拆解行业模型: 1. 确定行业范围 定义行业:明确你要分析的行业是什么,包括…...
【开题报告】基于微信小程序的签到打卡系统的设计与实现
1.研究背景与意义 考勤管理是企业日常管理的重要内容之一。随着企业规模的扩大和员工数量的增加,传统的考勤管理方式已经不能满足需求。而基于微信小程序的签到打卡系统可以提供方便快捷的签到打卡服务,为企业管理人员提高工作效率和员工考勤管理提供了…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
