【云原生】Docker如何构建镜像

news2024/10/7 6:40:41

目录

前言

一、基于已有的镜像创建

步骤一:先基于现有的镜像创建一个容器,然后进入容器去完成修改

步骤二:将该容器作为一个模板提交创建为一个新的镜像

步骤三:基于新的镜像,docker run创建一个容器,进行测试

二、基于本地模板创建

第一种:从网上去下载

第二种:将运行中的容器导入为模板,然后再进行导入

三、基于Dockerfile创建

1.联合文件系统(UnionFS)

2.镜像加载原理

3.为什么Docker里的centos的大小才200M?

4.Dockerfile

 5.Docker 镜像结构的分层

6.Dockerfile 操作常用的指令

7.如何使用Dockerfile构建镜像

四、Dockerfile 案例

案例:通过dockerfile构建nginx镜像


前言

创建镜像有三种方法

  • 基于已有镜像创建
  • 基于本地模板创建
  • 基于Dockerfile创建

一、基于已有的镜像创建

步骤一:先基于现有的镜像创建一个容器,然后进入容器去完成修改

 

步骤二:将该容器作为一个模板提交创建为一个新的镜像

[root@localhost ~]#docker commit -m "new images from centos7" -a "lxy" 876465a574ac nginx:t1

#常用选项:
-m 说明信息;
-a 作者信息;
-p 生成过程中停止容器的运行。

 

 

步骤三:基于新的镜像,docker run创建一个容器,进行测试

二、基于本地模板创建

两种方式

方案一:从网上去下载

方案二:可以从一台主机上的容器进行导出为模板文件,然后迁移到另一台主机导入为镜像

第一种:从网上去下载

通过导入操作系统模板文件可以生成镜像,模板可以从 OPENVZ 开源项目下载,下载地址为http://openvz.org/Download/template/precreated

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

 

我是直接导入到系统中的 

验证一下

 

第二种:将运行中的容器导入为模板,然后再进行导入

[root@localhost opt]#docker export -o t1.tar t1
[root@localhost opt]#ls
containerd  rh  t1.tar
[root@localhost opt]#docker import t1.tar nginx:sample

 

三、基于Dockerfile创建

1.联合文件系统(UnionFS)

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。AUFS、OverlayFS 及 Devicemapper 都是一种 UnionFS。

Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

我们下载的时候看到的一层层的就是联合文件系统。

2.镜像加载原理

Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。

bootfs主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。

在Docker镜像的最底层是bootfs,这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs,在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

我们可以理解成一开始内核里什么都没有,操作一个命令下载debian,这时就会在内核上面加了一层基础镜像;再安装一个emacs,会在基础镜像上叠加一层image;接着再安装一个apache,又会在images上面再叠加一层image。最后它们看起来就像一个文件系统即容器的rootfs。在Docker的体系里把这些rootfs叫做Docker的镜像。但是,此时的每一层rootfs都是read-only的,我们此时还不能对其进行操作。当我们创建一个容器,也就是将Docker镜像进行实例化,系统会在一层或是多层read-only的rootfs之上分配一层空的read-write的rootfs。

3.为什么Docker里的centos的大小才200M?

因为对于精简的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以了,因为底层直接用宿主机的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
 

4.Dockerfile

Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。

Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成 image 即可, 省去了敲命令的麻烦。

除了手动生成Docker镜像之外,可以使用Dockerfile自动生成镜像。Dockerfile是由多条的指令组成的文件,其中每条指令对应 Linux 中的一条命令,Docker 程序将读取Dockerfile 中的指令生成指定镜像。

Dockerfile结构大致分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#“号开头的注释。

 5.Docker 镜像结构的分层

镜像不是一个单一的文件,而是有多层构成。容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。如果删除了容器,也就删除了其最上面的读写层,文件改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。

(1)Dockerfile 中的每个指令都会创建一个新的镜像层;
(2)镜像层将被缓存和复用;
(3)当Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;
(4)某一层的镜像缓存失效,它之后的镜像层缓存都会失效;
(5)镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在 Docker 容器中不可见了。

6.Dockerfile 操作常用的指令

(1)FROM 镜像
指定新镜像所基于的基础镜像第一条指令必须为FROM 指令,每创建一个镜像就需要一条 FROM 指令

(2)MAINTAINER 名字
说明新镜像的维护人信息

(3)RUN 命令
在所基于的镜像上执行命令,并提交到新的镜像中 可以通过&& 或分号 或 <<EOF EOF将多个linux命令合并在一起,一个RUN就是一层镜像,为了让镜像的体积变小,尽量使用少量RUN

(4)ENTRYPOINT ["要运行的程序", "参数 1", "参数 2"]
设定容器启动时第一个运行的命令及其参数。
可以通过使用命令docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容。

(5)CMD ["要运行的程序", "参数1", "参数2"] 
上面的是exec形式,shell形式:CMD 命令 参数1 参数2
启动容器时默认执行的命令或者脚本,Dockerfile只能有一条CMD命令。如果指定多条命令,只执行最后一条命令。
如果在docker run时指定了命令或者镜像中有ENTRYPOINT,那么CMD就会被覆盖。
CMD 可以为 ENTRYPOINT 指令提供默认参数。

(6)EXPOSE 端口号
指定新镜像加载到 Docker 时要开启的端口

(7)ENV 环境变量 变量值
设置一个环境变量的值,会被后面的 RUN 使用
linxu PATH=$PATH:/opt
  ENV PATH $PATH:/opt
(8)ADD 源文件/目录 目标文件/目录
将源文件复制到镜像中,源文件要与 Dockerfile 位于相同目录中,或者是一个 URL  
有如下注意事项:
1、如果源路径是个文件,且目标路径是以 / 结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下。
如果目标路径不存在,则会自动创建目标路径。

2、如果源路径是个文件,且目标路径是不以 / 结尾,则docker会把目标路径当作一个文件。
如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;
如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。
如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。 注意,这种情况下,最好显示的以 / 结尾,以避免混淆。

3、如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。
如果目标路径是个已经存在的目录,则docker会把源路径目录下的文件拷贝到该目录下。

4、如果源文件是个归档文件(压缩文件),则docker会自动帮解压。    
URL下载和解压特性不能一起使用。任何压缩文件通过URL拷贝,都不会自动解压。

(9)COPY 源文件/目录 目标文件/目录
只复制本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile 在相同的目录中

ADD与COPY的区别
共同点:都可以实现宿主机的文件和目录传输到容器中
区别:ADD可以实现本地的压缩文件上传会自动解压;
      还支持通过URL来下载到容器
      但是URL下载与自动解压不兼容

(10)VOLUME [“目录”] 
在容器中创建一个挂载点

匿名挂载卷
如果docker run 没有-v 创建数据卷 
那么这个命令选项生效,创建一个匿名数据卷
会默认将宿主机的/var/lib/docker/volume/容器id/ 目录 挂载到匿名卷中 

(11)USER 用户名/UID
指定运行容器时的用户

(12)WORKDIR 路径
为后续的 RUN、CMD、ENTRYPOINT 指定工作目录

(13)ONBUILD 命令
指定所生成的镜像作为一个基础镜像时所要运行的命令。
当在一个Dockerfile文件中加上ONBUILD指令,该指令对利用该Dockerfile构建镜像(比如为A镜像)不会产生实质性影响。
但是当编写一个新的Dockerfile文件来基于A镜像构建一个镜像(比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。

注:请各位自己在生产中如果有的是别的dockerfile 请自习阅读,否则后果自付

(14)HEALTHCHECK
健康检查

(15)ARG
ENV指定的变量的值 会始终覆盖ARG指定的变量的值,无论顺序如何
env 变量a=10
arg 变量a

docker build --build--arg 变量a=xx

7.如何使用Dockerfile构建镜像

在编写 Dockerfile 时,有严格的格式需要遵循:
●第一行必须使用 FROM 指令指明所基于的镜像名称;(一定要from)
●之后使用 MAINTAINER 指令说明维护该镜像的用户信息;(可省略)
●然后是镜像操作相关指令,如 RUN 指令。每运行一条指令,都会给基础镜像添加新的一层。
●最后使用 CMD 指令指定启动容器时要运行的命令操作。

四、Dockerfile 案例

案例:通过dockerfile构建nginx镜像

FROM centos:7
MAINTAINER nginx on centos7 by lxy-20240125
ADD nginx-1.24.0.tar.gz /opt/
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make && \
    useradd -M -s /sbin/nologin nginx && \
    cd /opt/nginx-1.24.0 && \
    ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && \
    make && make install

ENV PATH=$PATH:/usr/local/nginx/sbin/
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

测试:

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

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

相关文章

2024年PMP备考学习资料整合汇总!!

你是否也有过类似的经历&#xff1f; 为了获取备考资料&#xff0c;有的同学在论坛、知乎或者相关垂直类网站下载了很多的资料&#xff0c;这些资料大部分是机构进行获客引流的资料&#xff0c;没有真正的干货。 经常会看到10G、20G的资料包&#xff0c;感觉内容很丰富&#xf…

当项目遭遇资源冲突时,如何巧妙化解?

在项目管理中&#xff0c;资源冲突是一个常见且棘手的问题。当多个项目争夺有限的资源时&#xff0c;如何妥善分配并确保项目顺利进行&#xff0c;成为每个项目经理必须面对的挑战。今天&#xff0c;我们就来探讨几个实用的行动方案&#xff0c;帮助你化解资源冲突&#xff0c;…

Git笔记:常用使用Git命令+使用Git关联本地仓库和远程仓库操作步骤

Git 分布式版本控制系统 常用Git命令 创建一个管理代码的文件目录右键Git Bath打开完成配置信息&#xff0c;输入个人用户名、邮件信息 git config --global user.name 用户名 git config --global user.email 邮箱地址初始化仓库 git init: 初始化仓库 文件目录里会出现一个…

Spring5学习笔记

Spring5 框架概述IOC(Inversion Of Control)IOC基本过程:IOC接口(BeanFactory)IOC接口实现类IOC操作Bean管理一、什么是Bean管理?二、什么是DI?三、Bean管理的两种实现方式1.基于XML配置文件方式实现基于XML方式创建对象基于XML方式注入属性常规属性注入特殊属性值的注入…

Windows中Zookeeper与kafka的安装配置

一、Zookeeper安装与使用 1.安装包下载 直接在官网下载即可Apache ZooKeeper。 下载后直接解压到本地即可。 2.环境配置 1> 在目录中下增加data和log文件夹 2> 解压目录下的 conf 目录&#xff0c;将目录中的 zoo_sample.cfg 文件&#xff0c;复制一份&#xff0c;重…

element el-date-picker type=“datetimerange“

刚写完结果需求变更了。封装的时间组件重新做。结合eacharts 。 直接上代码了 日期选择组件封装 <template><section class"warning-container"><header class"query-head"><el-form :inline"true" class"query-form…

IP被封怎么办?如何绕过IP禁令?

相信很多人遇到过IP禁令&#xff1a;比如你在访问社交媒体、搜索引擎或电子商务网站时会被限制访问&#xff0c;又或者你的的账号莫名被封&#xff0c;这些由于网络上的种种限制我们经常会遭遇IP被封的情况&#xff0c;导致无法使用继续进行网络行动。在本文中&#xff0c;我们…

nvm安装nodejs报错解决

1.出现如下报错 2.解决 去到nvm的安装目录&#xff0c;找到 /settings.txt文件 添加如下代码&#xff1a; node_mirror:npm.taobao.org/mirrors/node/ npm_mirror:npm.taobao.org/mirrors/npm/3.重新下载 如图成功解决

浅析HTTP协议

首先&#xff0c;前端请求后端数据&#xff0c;后端响应数据给前端&#xff0c;这是我们大家都知道的&#xff0c;那其中所涉及到的数据传输协议又是什么呢&#xff1f;这个传输规范就是我们大名鼎鼎的HTTP协议&#xff01; 什么是HTTP协议&#xff1f; HTTP&#xff08;超文本…

Springfox Swagger2从入门到精通

概述&#xff1a;Swagger 是一种用于设计、构建、文档化和使用 RESTful API 的工具。Springfox 是 Swagger 在 Spring 应用中的集成库&#xff0c;提供了自动生成 API 文档的功能。在本文中&#xff0c;我们将探讨如何使用 Springfox Swagger2 在 Spring Boot 项目中生成、配置…

使用json-server提供简易接口

json-server是一款 json 数据服务器&#xff0c;它运行 Express 服务器&#xff0c;可以对json文件、js脚本生成的json数据、远程json数据进行restful风格的增删改查操作&#xff0c;通过指定一个json文件作为api数据源&#xff0c;可以进行分页、排序、关联查询、范围查询等各…

紫光展锐M6780丨超分辨率技术——画质重构还原经典

上一期&#xff0c;我们揭秘了让画质更加炫彩的AI-PQ技术。面对分辨率较低的老电影&#xff0c;光有高饱和度的色彩是不够的&#xff0c;如何能够提高视频影像的分辨率&#xff0c;使画质更加清晰&#xff0c;实现老片新看&#xff1f; 本期带大家揭晓紫光展锐首颗AI8K超高清智…

数据安全之对称加密(九)- 数据填充实现

AES 是一种采用分组加密方法的算法。待加密的明文首先被分割成若干固定大小的块&#xff0c;每个块大小通常是128位。接着&#xff0c;这些块逐一被加密&#xff0c;转换成对应的密文块。这种处理方式确保了加密的一致性和效率&#xff0c;同时也方便了对数据的管理和加密处理。…

从物联网看智慧文旅的未来:技术与实践的完美结合,重塑旅游体验的新篇章

一、物联网技术&#xff1a;智慧文旅的基石 随着科技的飞速发展&#xff0c;物联网技术已经深入到我们生活的方方面面&#xff0c;尤其在智慧文旅领域&#xff0c;物联网技术更是起到了不可或缺的作用。它如同智慧文旅的基石&#xff0c;为旅游行业带来了前所未有的创新和变革…

基于Java SSM框架实现大学生社团管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现大学生社团管理系统演示 摘要 在网络迅速发展的时代&#xff0c;众多的软件被开发出来&#xff0c;给社团带来了很大的选择余地&#xff0c;而且学生越来越追求更个性的需求。在这种时代背景下&#xff0c;社团只能以学生为导向&#xff0c;按学生所需要…

AMEYA360--思瑞浦推出16通道高精度ADC—TPAFE51760

聚焦高性能模拟芯片和嵌入式处理器研发的半导体公司——思瑞浦推出全新16通道高精度ADC——TPAFE51760。 TPAFE51760内置高精度基准&#xff0c;工作温度支持-40C to 125C&#xff0c;产品广泛应用于电力自动化领域中的DTU、FTU、MU等装置。 TPAFE51760产品优势 业界领先的30V模…

成本更低、更可控,云原生可观测新计费模式正式上线

云布道师 在上云开始使用云产品过程中&#xff0c;企业一定遇见过两件“讨厌”事&#xff1a; 难以理解的复杂计费逻辑&#xff0c;时常冒出“这也能收费”的感叹&#xff1b; 某个配置参数调节之后&#xff0c;云产品使用成本不可预估的暴涨。 可观测作为企业 IT 运维必须品…

Redis系列-数据结构篇

数据结构 string&#xff08;字符串&#xff09; redis的字符串是动态字符串&#xff0c;类似于ArrayList&#xff0c;采用预分配冗余空间的方式减少内存的频繁分配。 struct SDS<T>{ T capacity; T len; byte flags; byte[] content; } 当字符串比较短时&#xff0c…

在 Vue 项目中,可以通过设置不同的环境变量来区分不同的环境,例如本地开发环境、测试环境和生产环境。以下是设置环境变量的步骤:

1、在src下新建三个文件夹 &#xff08;.env.local、.env.test 和 .env.prod&#xff09; 2、配置信息 .env.local VUE_APP_ENVlocal VUE_APP_API_URLhttp://localhost:8080.env.test VUE_APP_ENVtest VUE_APP_API_URLhttp://124.220.110.203:9090/ .env.prod VUE_APP_…

直播主播产品转场话术

主播产品转场话术 一、预告下一环节 亲爱的观众朋友们&#xff0c;非常感谢大家对我们直播间的关注与支持!现在&#xff0c;我们即将进入下一个环节&#xff0c;这个环节将为您带来更多惊喜!请耐心等待&#xff0c;不要离开哦! 二、解释过渡 感谢大家对我们产品的喜爱与支持…