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

【云原生】Docker镜像的创建,Dockerfile

一、Docker镜像的创建

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

1.基于现有镜像创建

(1)首先启动一个镜像,在容器里做修改docker run -it --name web centos:7 /bin/bash     #启动容器​yum install -y epel-release  安装epel源yum install -y nginx         安装nginxyum install net-tools        安装tools工具nginx                        启动服务netstat -natp |grep 80       查看端口是否开启​docker ps -a   #查看容器ID​(2)然后将修改后的容器提交为新的镜像,需要使用该容器的ID号创建新镜像docker commit -m "new nginx" -a "cx" 容器id nginx:centos7#常用选项:-m 指定说明信息;-a 指定作者信息;-p 生成过程中停止容器的运行。fe21b13926d1  原容器ID。nginx:centos  生成新的镜像名称。​
docker images    #查看生成的新镜像
docker run -itd nginx:centos7 bash        使用新的镜像创建容器
docker ps -a                              查看容器状态
docker exec -it 容器id bash               进入容器
nginx                                     启动nginx服务
netstat -natp |grep 80                    查看80端口是否开启

 2.基于模板创建

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

 openvz.org/ Download/template/precreated

模板里面就是使用docker export 命令导出的容器文件​#下载模板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  #方法一docker import debian-7.0-x86-minimal.tar.gz -- debian:test  #方法二​#查看镜像docker images​#使用导入的镜像创建容器docker run -itd debian:test bashdocker ps -a

3.基于Dockerfile 创建 

 联合文件系统(UnionFS ) 

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

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

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

镜像加载原理 

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等。

bootfs就是内核引导器(引导加载内核)和内核。
rootfs是n多个基础镜像(提供基础操作环境)和应用镜像叠加在一起的只读层。
运行的容器实例会在rootfs之上添加一个可读可写层。

 Docker镜像结构的分层

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

(1)Dockerfile中的每个指令都会创建一个新的镜像层;

(2)镜像层将被缓存和复用;

(3)当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;

(4)某一层的镜像缓存失效,它之后的镜像层缓存都会失效;

(5)镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在Docker 容器中不可见了。

二、 Dockerfile操作命令的指令

FROM 指定基础镜像,dockerfile构建镜像的第一个指令
MAINTAINER 指定镜像维护人信息(可选
RUN 指定Linux命令,建议多条命令可用 && 或 ; 串起来使用
ENV 设置镜像的环境变量
EXPOSE 暴露容器端口
VOLUME  指定容器的匿名数据卷
ADD/COPY复制本地文件/目录到镜像中
USER指定容器的运行用户
WORKDIR指定容器的工作目录
CMD/ENTRYPOINT指定容器启动时执行的命令
ARG 指定构建镜像时传入的参数变量       docker build --build-arg 变量=值

 ADD 和 COPY 的区别

COPY 只能复制本地文件/目录到镜像中
ADD 不光可以复制本地文件/目录到镜像中,还可以通过URL下载文件复制到镜像中,还能将本地的tar压缩包解压后复制到镜像中(URL下载和tar包解压不能一起使用)

CMD 和 ENTRYPOINT 的区别

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

容器启动时运行的命令优先级

docker run --entrypoint=命令  >  镜像里的 ENTRYPOINT ["命令"]  > docker run ... 镜像  命令  >  镜像里的 CMD ["命令"]

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

第一行必须使用FROM指令指明所基于的镜像名称;
之后使用MAINTAINER 指令说明维护该镜像的用户信息;
然后是镜像操作相关指令,如RUN指令/EXPOSE/ADD/ENV/ARG等等。每运行一条指令,都会给基础镜像添加新的一层。(多条命令可以使用 ; 或 && 合并成一条命令,减少镜像的层数)
最后使用CMD或者ENTRYPOINT指令指定启动容器时要运行的命令操作

 如何缩小镜像体积大小?

1)尽可能的使用小体积的基础镜像
2)尽可能检查Dockerfile文件中指令的数量
3)可以构建镜像步骤最后添加清空系统和应用程序的缓存命令
4)使用多阶段(多级)构建 FROM 第一阶段的基础镜像  [AS 别名]      
                          .....
                          FROM 第二阶段的基础镜像
                          COPY --from=别名/0  第一阶段构建的文件/目录  当前阶段的文件/目录

三、Dockefile的实际运用

 1.Dockfile源码编译nginx

 通过Dockerfile创建源码编译的nginx(基于centos7基础镜像),并且通过后台运行

vim Dockerfile#基于镜像的指定
FROM centos:7
#作者信息
MAINTAINER this is nginx image <cx 20230724>
ADD nginx-1.22.0.tar.gz /usr/local/
RUN yum install -y pcre-devel zlib-devel openssh-devel gcc gcc-c++ make ncurses ncurses-devel bison cmake gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel
RUN useradd -M -s /sbin/nologin nginx && \
cd /usr/local/nginx-1.22.0 && \
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make installEXPOSE 80
#EXPOSE 443CMD ["/usr/local/nginx/sbin/nginx", "-g","daemon off;"]

 注意:容器里的服务必须为前台启动程序,否则会容器启动又关闭,无法正常提供服务。

所以在进行容器提供服务时,需要了解各种服务的前台运行,若该服务没有前台运行选项,则需要在容器中挂一个占用前台的运行指令,避免容器开启后有关闭。

2.镜像容量过大的解决方案  

1)尽可能的使用小体积的基础镜像
2)尽可能检查Dockerfile文件中指令的数量
3)可以构建镜像步骤最后添加清空系统和应用程序的缓存命令
4)使用多阶段(多级)构建 FROM 第一阶段的基础镜像  [AS 别名]      
                          .....
                          FROM 第二阶段的基础镜像
                          COPY --from=别名/0  第一阶段构建的文件/目录  当前阶段的文件/目录

 针对上面的镜像的创建进行基础镜像的进行多阶级构建 :

第一阶段构建
FROM centos:7 AS first
MAINTAINER this is nginx image <cx 20230724>
ADD nginx-1.22.0.tar.gz /usr/local/
RUN yum install -y pcre-devel zlib-devel openssh-devel gcc gcc-c++ make ncurses ncurses-devel bison cmake gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel
RUN useradd -M -s /sbin/nologin nginx && \
cd /usr/local/nginx-1.22.0 && \
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install && \
yum clean all#第二阶段构建
FROM centos:7
#复制第一阶段的目录到当前阶段
COPY --from=first /usr/local/nginx/ /usr/local/nginx/
RUN useradd -M -s /sbin/nologin nginx
EXPOSE 80
#EXPOSE 443CMD ["/usr/local/nginx/sbin/nginx", "-g","daemon off;"

 四、总结

Dockerfile结构大致分为四个部分:基础镜像信息(用from指定)、维护者信息(maintainer、镜像操作指令和容器启动时执行指令。

  • 第一行必须使用FROM指令指明所基于的镜像名称;
  • 之后使用MAINTAINER 指令说明维护该镜像的用户信息;
  • 然后是镜像操作相关指令,如RUN指令/EXPOSE/ADD/ENV/ARG等等。每运行一条指令,都会给基础镜像添加新的一层。(多条命令可以使用 ; 或 && 合并成一条命令,减少镜像的层数)
  • 最后使用CMD或者ENTRYPOINT指令指定启动容器时要运行的命令操作。

相关文章:

【云原生】Docker镜像的创建,Dockerfile

一、Docker镜像的创建 创建镜像有三种方法&#xff0c;分别为【基于已有镜像创建】、【基于本地模板创建】以及【基于Dockerfile创建】。 1.基于现有镜像创建 &#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里做修改docker run -it --name web centos:7 /bin/…...

了解Unity编辑器之组件篇Event(七)

Event&#xff1a;用于在对象之间进行通信和交互的机制。它可以帮助你实现触发和响应特定动作或状态的逻辑一、Event System&#xff1a;用于处理 UI 事件的系统组件 First Selected 属性&#xff1a;定义了在场景加载或 UI 激活时&#xff0c;哪个 UI 元素将成为首选的选中元素…...

bash: 睡觉的冒号;是不是两个点?

文章目录 简介躺着的冒号是两个点正常冒号总结简介 在bash里冒号和躺着的冒号的用法不一样一定要注意别用错。 躺着的冒号是两个点 难道正常的不是两个点)的作用: A sequence expression takes the form {x…y[…incr]}, where x and y are either integers or single cha…...

揭秘爱数AnyShare认知助手:大模型深度产品化,深化人与机器的“分工协作”

文 | 智能相对论 作者 | 叶远风 大模型竞逐日趋白热化&#xff0c;百模大战热闹非凡。 但是&#xff0c;对产业主体或者普通看客而言&#xff0c;大模型究竟如何改变一线业务、实现工作方式的变革甚至组织转型&#xff0c;很多人并没有具象化的认知。 技术厉害、产品牛&…...

ad+硬件每日学习十个知识点(10)23.7.21

文章目录 1.verilog新建文件夹结构2.怎么在quartus2里新建工程?3.如果在quartus2新建工程后,发现器件选择错误,怎么修改?4.在quartus2新建工程后,怎么新建文件编写程序?4.在quartus2新建工程后,怎么添加已有文件编写程序?5.quartus2怎么调节字体?6.刚下载完quartus2的…...

RCU 使用及机制源码的一些分析

》内核新视界文章汇总《 文章目录 1 介绍2 使用方法2.1 经典 RCU2.2 不可抢占RCU2.3 加速版不可抢占RCU2.4 链表操作的RCU版本2.5 slab 缓存支持RCU 3 源码与实现机制的简单分析3.1 数据结构3.2 不可抢占RCU3.3 加速版不可抢占RCU3.4 可抢占RCU3.5 报告禁止状态3.6 宽限期的开…...

【第二套】Java面试题

第二套&#xff1a; 一、JavaScript前端开发 1、下列的代码输出什么&#xff1f; var y 1; if(function f(){}){y typeof f; } console.log(y);正确的答案应该是 1undefined。 JavaScript中if语句求值其实使用eval函数&#xff0c;eval(function f(){}) 返回 function f()…...

CSS3 实现边框圆角渐变色渐变文字效果

.boder-txt {width: 80px;height: 30px; line-height: 30px;padding: 5px;text-align: center;border-radius: 10px;border: 6rpx solid transparent;background-clip: padding-box, border-box;background-origin: padding-box, border-box;/*第一个linear-gradient表示内填充…...

第二天 kali代理配置

文章目录 环境一、虚拟机网络模式&#xff08;1&#xff09;NAT&#xff08;2&#xff09;NAT模式&#xff08;3&#xff09;桥接模式&#xff08;4&#xff09;仅主机模式&#xff08;5&#xff09;总结 二、配置代理&#xff08;桥接模式&#xff09;1、基础设置2、虚拟机浏览…...

stable-diffusion-webui汉化教程

第一种方法 1.打开stable diffusion webui&#xff0c;进入"Extensions"选项卡 2.点击"Install from URL" 3、注意"URL for extension’s git repository"下方的输入框 4、填入地址&#xff1a;https://github.com/VinsonLaro/stable-diffus…...

热备盘激活失败导致raid5阵列崩溃的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 一台Linux Redhat操作系统服务器上有一组由5块硬盘组建的raid5阵列&#xff0c;包含一块热备盘。上层部署一个OA系统和Oracle数据库。 服务器故障&#xff1a; raid5阵列中的1块磁盘离线&#xff0c;硬盘离线却没有激活热备盘&#xff0c;直到…...

【ribbon】Ribbon的负载均衡和扩展功能

Ribbon的核心接口 参考&#xff1a;org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration IClientConfig&#xff1a;Ribbon的客户端配置&#xff0c;默认采用DefaultClientConfigImpl实现。IRule&#xff1a;Ribbon的负载均衡策略&#xff0c;默认采用ZoneA…...

数据链路层是如何传递数据的

数据链路层是如何传递数据的 数据链路层功能概述封装成帧透明传输差错控制 数据链路层功能概述 数据链路层的主要作用就是加强物理层传输原始比特流的功能。其负责将物理层提供的可能出错的物理连接&#xff0c;改造成逻辑上无差错的数据链路。 数据链路层包括三个基本问题&a…...

积分规划:构建全面的会员积分管理系统

在现代私域营销中&#xff0c;会员积分管理系统是提升用户忠诚度和增加用户参与度的关键工具。通过建立全面的会员积分管理系统&#xff0c;企业可以吸引更多用户参与&#xff0c;提高用户活跃度&#xff0c;并在竞争激烈的市场中保持竞争优势。本文将详细介绍如何进行积分规划…...

amd的cpu有哪些型号(amd的cpu系列介绍)

1、amd处理器有什么系列&#xff1f; 2、AMD各系列CPU和对应的主板型号有哪些&#xff1f; 3、AMD双核CPU有哪几个型号? amd处理器有什么系列&#xff1f; amd处理器的系列有: 1、锐龙&#xff1a;AMD Ryzen是AMD开发并推出市场的x86微处理器品牌&#xff0c;AMD Zen微架构…...

网络安全(黑客)自学——从0开始

为什么学习黑客知识&#xff1f;有的人是为了耍酷&#xff0c;有的人是为了攻击&#xff0c;更多的人是为了防御。我觉得所有人都应该了解一些安全知识&#xff0c;了解基本的进攻原理。这样才可以更好的保护自己。这也是这系列文章的初衷。让大家了解基本的进攻与防御。 一、怎…...

uniapp使用uni-swipe-action后右侧多了小于1px的间隙

问题&#xff1a;uniapp使用uni-swipe-action后右侧多了小于1px的间隙。且在真机上没有问题&#xff0c;但是在微信开发者工具中有问题。 代码如下&#xff1a;在滑动滑块或者点击这个区域时&#xff0c;就会出现问题。 <scroll-view :scroll-y"true" :style&quo…...

随手笔记——演示如何提取 ORB 特征并进行匹配

随手笔记——演示如何提取 ORB 特征并进行匹配 说明知识点源代码 说明 演示如何提取 ORB 特征并进行匹配 知识点 特征点由关键点&#xff08;Key-point&#xff09;和描述子&#xff08;Descriptor&#xff09;两部分组成。 ORB 特征亦由关键点和描述子两部分组成。它的关键…...

Python访问者模式介绍、使用

目录 一、Python访问者模式介绍 二、访问者模式使用 一、Python访问者模式介绍 访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为型设计模式&#xff0c;它能够将算法与对象结构分离&#xff0c;使得算法可以独立于对象结构而变化。这个模式的主要思想是&#…...

深度学习实际使用经验总结

以下仅是个人在使用过程中的经验总结&#xff0c;请谨慎参考。 常用算法总结 图像分类 常用算法&#xff08;可作为其他任务的骨干网络&#xff09;&#xff1a;服务端&#xff1a;VGG、ResNet、ResNeXt、DenseNet移动端&#xff1a;MobileNet、ShuffleNet等适用场景&#x…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...