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

news2024/9/22 17:19:26

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:test

docker 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.sh

rm -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 指定容器启动时执行的命令

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

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

相关文章

【Java基础面试四十一】、说一说你对static关键字的理解

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;说一说你对static关键字…

hdlbits系列verilog解答(异或非门)-08

文章目录 wire线网类型介绍一、问题描述二、verilog源码三、仿真结果 wire线网类型介绍 wire线网类型是verilog的一种数据类型&#xff0c;它是一种单向的物理连线。它可以是输入也可以是输出&#xff0c;它与reg寄存器数据类型不同&#xff0c;它不能存储数据&#xff0c;只能…

文件系统相关

文件系统部分的大纲要求&#xff1a; 文件系统的全局结构&#xff1a;文件系统在外存中的结构&#xff0c;文件系统在内存中的结构外存空闲空间管理办法虚拟文件系统文件系统挂载 一、文件系统的层次结构 可分为三个层次&#xff1a;最低层是对象及其属性&#xff0c;中间层…

物证管理系统|智物证DW-S404是一套成熟系统

系统背景 我司物证智能管理系统&#xff08;智物证DW-S404&#xff09;是一套成熟系统&#xff0c;依托互3D技术、RFID技术、数据库技术、AI、视频分析技术对物证进行统一管理、分析的信息化、智能化、规范化的系统。 物证是公安或者监狱处理案件的关键凭证&#xff0c;针对过…

3交换机的配置与使用

越来越发觉大学的教程是真好&#xff0c;虽然说深度可能不太够&#xff0c;但作为入门实在太好了。中国也有公开课&#xff0c;推荐中国大学MOOC&#xff0c;感谢网易有道与高教社。 最近特别累、活也特别多&#xff0c;所以学习的时间少了很多。但看到MOOC之后&#xff0c;又…

软件测试(六)自动化测试 Junit5

Junit5 selenium是自动化测试框架&#xff08;写自动化测试用例&#xff09;Junit单元测试框架&#xff08;管理写好的测试用例&#xff09; 注解&#xff1a;Test&#xff0c;Disable &#xff0c;BeforeAll&#xff0c;AfterAll&#xff0c;BeforeEach&#xff0c;AfteEach…

操作系统——多个类别产品的生产者-消费者问题(王道视频p33、课本ch6)

1.问题解剖——得到的是 1个“互斥信号量” 3个“同步信号量” 其中特别注意&#xff0c;对于盘子plate可以清空的设计4个对象的&#xff0c;但是只用这一个同步信号量就可以实现 2.代码—— 3.由于这里的同步信号量的初值都是1&#xff0c;所以&#xff0c;即使不设置互斥信…

04.Finetune vs. Prompt

目录 语言模型回顾大模型的两种路线专才通才二者的比较 专才养成记通才养成记Instruction LearningIn-context Learning 自动Prompt 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》&#xff0c;B站自行搜索 语言模型回顾 GPT&#xff1a;文字接龙 How are __. Bert&a…

大语言模型(LLM)综述(二):开发大语言模型的公开可用资源

A Survey of Large Language Models 前言3. RESOURCES OF LLMS3.1 公开可用的模型CheckPoints或 API3.2 常用语料库3.3 库资源 前言 随着人工智能和机器学习领域的迅速发展&#xff0c;语言模型已经从简单的词袋模型&#xff08;Bag-of-Words&#xff09;和N-gram模型演变为更…

RK3568 USB驱动开发

一.USB的DTS配置说明 1.USB 2.0 控制器 DTS 1.1 USB 2.0 Host 控制器 DTS USB 2.0 Host0 控制器 (EHCI & OHCI) 的DTS为例&#xff1a; 其中&#xff0c;EHCI 控制器的 compatible 固定为 “generic-ehci”&#xff0c;OHCI 控制器的 compatible 固定为 “genericohci”…

39.克鲁斯卡尔(Kruskal)算法

一言 已知n个顶点&#xff0c;选n-1条最短的边&#xff0c;不可成环。 概述 克鲁斯卡尔&#xff08;Kruskal&#xff09;算法是用来求加权连通图的最小生成树的算法。其基本思想是按照权值从小到大的顺序选择n-1条边&#xff0c;保证这n-1条边不构成回路。 这就要求要首先构…

写给Java/Android开发者的Python入门教程

1. 前言 对于Java/Android开发工程师来说&#xff0c;已经掌握了Java语言&#xff0c;这时再学其他语言(C/C除外)&#xff0c;都是比较容易的&#xff0c;可能花上几个小时就能入门了。 作为一个Android开发工程师&#xff0c;今天一时兴起&#xff0c;学了下Python&#xff0…

初识进程以及父子进程

一 进程概念 什么是进程呢&#xff1f;许多资料都说一个已经加载到内存的程序就叫进程&#xff0c;意思是只要代码到了内存就能跑起来了吗?接下来我就谈谈对进程概念的理解。 1 如何管理进程 我们可能运行多个进程&#xff0c;这些进程有些结束&#xff0c;有些要退出&#x…

yolov5自己的数据集制作

文章目录 一、制作数据集1、创建文件夹结构如下2、将之前的图片以及标注数据放入mydata文件夹3、新建一个mydata.yaml文件 二、基于数据集训练模型1、基于数据集训练模型2、开始根据制作好的数据集训练模型3、模型训练结束 三、部署模型 文章参考博主&#xff1a;风吹落叶花飘荡…

Power BI 傻瓜入门 6. 从动态数据源获取数据

本章内容将介绍 发现如何从关系数据库和非关系数据库中提取数据学习如何使用Power BI使用在线和实时数据源跨多个数据源应用分析服务使用Power BI通过静态和动态数据解决纠正措施 数据有时可能有点复杂。诚然&#xff0c;上传一个包含几个电子表格的文件&#xff0c;或者一个…

计算机中整数的补码表示及二进制数轮

为了同学们能理好的理解数在计算机内的表示&#xff0c;我们可以把计算机中的整数看成N位进制数的数轮&#xff0c;N一般为2的幂&#xff0c;如下&#xff1a; 我们来举个例子&#xff1a;如果用4位二进制来表示整数&#xff0c;则可以表示的整数范围为-8&#xff08;即&#x…

详细介绍如何使用Ipopt非线性求解器求解带约束的最优化问题

本文中将详细介绍如何使用Ipopt非线性求解器求解带约束的最优化问题&#xff0c;结合给出的带约束的最优化问题示例&#xff0c;给出相应的完整的C程序&#xff0c;并给出详细的解释和注释&#xff0c;以及编译规则等 一、Ipopt库的安装和测试 本部分内容在之前的文章《Ubuntu2…

STM32-LTC6804方案成熟BMS方案

方案下载链接&#xff01;&#xff01;https://mp.weixin.qq.com/s?__bizMzU2OTc4ODA4OA&mid2247549092&idx1&snc73855c4e3d5afddd8608d8528864f95&chksmfcfb1373cb8c9a65a4bd1f545a1a587af882f209e7ccbb8944f4d2514d241ca1d7fcc4615e10&token539106225&a…

【字符函数】

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;进阶C语言 &#x1f388;相关博文&#xff1a;字符串函数&#xff08;一&#xff09;、字符串函数&#xff08;二&#xff09; 字符函数 字符函数1.字符分类函数1.1 iscntrl - 判断是否是控制字符1.2 i…