Dockerfile 镜像创建

news2024/11/13 15:03:09

目录

 一、创建镜像的三种方法:

二、基于已有镜像创建:

 1.启动一个镜像:

​编辑

 2.将修改后的容器提交为新的镜像:

三、基于本地模板创建:

 1.下载模板:

 2.导入为镜像:

四、基于Dockerfile 创建:

 1. 联合文件系统(UnionFS):

 2. 镜像加载原理:

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

 4. Docker 镜像结构的分层:

 5. Dockerfile 操作常用的指令:

 5.1 CMD 和 ENTRYPOINT 的区别:

  5.2 ADD 和 COPY 的区别:

6. 使用 Dockerfile 构建镜像步骤:

五、Dockerfile 案例:

 1. 建立工作目录:

 2.创建Dockerfile:

 3. 准备网站页面:

 4. 生成镜像:

​编辑

 5. 新镜像运行容器:

 6.测试:


 一、创建镜像的三种方法:

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

二、基于已有镜像创建:

 1.启动一个镜像:

docker create -it centos:7 /bin/bash

docker ps -a

 2.将修改后的容器提交为新的镜像:

      注意:需要使用该容器的 ID 号创建新镜像

docker commit -m "new" -a "centos" bd35fd9d7ccb  centos:test

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

三、基于本地模板创建:

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

 1.下载模板:

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

 2.导入为镜像:

cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test

四、基于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. Docker 镜像结构的分层:

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

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

 5. Dockerfile 操作常用的指令:

指令含义
FROM指定新镜像所基于的镜像。 第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令
MAINTAINER说明新镜像的维护人信息(可写可不写)
RUN命令每一条RUN后面跟一条命令 ,在所基于的镜像上执行命令,并提交到新的镜像中, RUN必须大写。
CMD [“要运行的程序”,“参数1”,“参数2”]指定启动容器时需要运行的命令或脚本, Dockerfile只能有一条CMD命令, 如果指定多条则只能执行最后一条,“/bin/bash”也是一条CMD,并且会覆盖images镜像里面的cmd
ENTRYPOINT [“要运行的程序”,“参数1”,“参数2”]设定容器启动时第一个运行的命令及其参数。可以通过使用命令:docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容
EXPOSE [端口号]指定新镜像加载到Docker时要开启的端口 “暴露端口”,就是这个容器暴露出去的端口号。
ENV [环境变量] [变量值]设置一个 “ 环境变量 ”的值,会被后面的RUN使用,容器可以根据自己的需求创建时传入环境变量,镜像不可以
ADD [源文件/目录] [目标文件/目录]①将源文件复制到目标文件, 源文件要与Dockerfile位于相同目录中。 ②或者时一个URL。 ③若源文件时压缩包的则会将其解压。
COPY [源文件/目录] [目标文件/目录]将本地主机上的文件/目录复制达到目标地点,源文件/目录要与Dockerfile在相同的目录中, copy只能用于复制,add复制的同时,还可以将对象解压, copy比add节省资源
VOLUME [“目录”]在容器中创建一个挂载点,简单来说就是 -v,指定镜像的目录挂载到宿主机上。
USER [用户名/UID]指定运行容器的用户
WORKDIR [路径]为后续的RUN、CMD、ENTRYPOINT指定工作目录, 相当于一个临时的“CD ” ,否则需要使用绝对路径,例如 workdir /opt ,移动到opt目录下, 后续执行的指令都是在/opt下面操作
ONBUILD [命令]指定所生成的镜像作为一个基础镜像时所要运行的命令 “(是一种优化)”
HEALTHCHECK健康检查

 5.1 CMD 和 ENTRYPOINT 的区别:

  • 共同点:都可以用来指定容器启动命令
  • 区别:ENTRYPOINT指定的容器启动命令优先级更高,如果CMD和ENTRYPOINT同时存在,那么CMD指定的内容将作为ENTRYPOINT指定的容器启动命令的选项或参数使用
     

  5.2 ADD 和 COPY 的区别:

  • 共同点:都可以将本地的文件/目录复制到镜像里
  • 区别:ADD还可以通过URL下载文件复制到镜像里,还能将本地的压缩包解压后复制到镜像里(URL下载和压缩包解压特性不能同时使用)
     

6. 使用 Dockerfile 构建镜像步骤:

  1. 先在第一行用 FROM 指令指定基础镜像
  2. 还可以再用 MAINTAINER 指定镜像维护人信息(可跳过)
  3. 之后用 RUN EXPOSE ENV ADD COPY 等指令编写构建镜像的过程
  4. 结尾用 CMD/ENTRYPOINT 指定容器启动时执行的命令
  5. 最后用 docker build -t 新镜像名:标签 . [-f Dockerfile文件路径] 命令构建镜像
     

五、Dockerfile 案例:

 1. 建立工作目录:

mkdir  /opt/apache
cd  /opt/apache

 2.创建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
ENTRYPOINT [ "/usr/sbin/apachectl" ]
CMD ["-D", "FOREGROUND"]

 3. 准备网站页面:

echo "this is test web" > index.html

 4. 生成镜像:

docker build -t httpd:centos .   

 5. 新镜像运行容器:

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

 6.测试:

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

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

相关文章

AD9371 官方例程HDL详解之JESD204B TX_CLK生成 (一)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 参考资料&#xff1a; UltraScale Architecture GTH Transceive…

Windows 11中无法通过默认应用更改文件关联

这里写自定义目录标题 现象解决方法 这里以.md格式文件为例。 现象 在 Windows 11 计算机上安装第三方软件后&#xff0c;关联 JPG、JPE、JPEG、PNG、MPG、MPEG、MD 等文件类型和其他文件类型的能力可能会受到阻碍。以下是尝试更改上述文件类型的文件关联时可能遇到的问题。 …

docker部署与基础操作

目录 一、Docker 概述&#xff1a; 1. docker简介&#xff1a; 2. 容器的优点&#xff1a; 3. 容器在内核中支持2种重要技术&#xff1a; 4 . 容器与虚拟机 的区别&#xff1a; 5. docker三个核心概念&#xff1a; 二、安装docker&#xff1a; 1. 关闭防火墙&#xff1a; 2. 安…

字节码进阶之JVM Attach API详解

字节码进阶之JVM Attach API详解 文章目录 字节码进阶之JVM Attach API详解附加到虚拟机加载代理和获取信息分离虚拟机 使用Attach API的基本步骤1. **获取虚拟机实例**&#xff1a;2. **附加到虚拟机**&#xff1a;3. **加载代理或获取信息**4. **从虚拟机分离**&#xff1a;…

GCC安装

查看gcc版本 gcc -vUsing built-in specs. COLLECT_GCCgcc COLLECT_LTO_WRAPPER/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper Target: x86_64-redhat-linux Configured with: ../configure --prefix/usr --mandir/usr/share/man --infodir/usr/share/info --with-…

Identity-Preserving Talking Face Generation with Landmark and Appearance Priors

主要问题:1)模型如何生成具有与输入音频一致的面部运动(特别是嘴部和下颌运动)的视频?2)模型如何在保留身份信息的同时生成视觉上逼真的帧? 摘要: 从音频生成说话脸部视频引起了广泛的研究兴趣。一些特定个人的方法可以生成生动的视频,但需要使用目标说话者的视频进行训…

【tg】6: MediaManager的主要功能

【tg】2:视频采集的输入和输出 的管理者是 media manager‘ media 需要 network的支持:NetworkInterface friend class MediaManager::NetworkInterfaceImpl;NetworkInterfaceImpl 直接持有 MediaManager 的指针即可:发送rtp包、rtcp包、设置socket选项?

SpringMVC系列-5 消息转换器

背景 SpringMVC系列的第五篇介绍消息转换器&#xff0c;本文讨论的消息转换指代调用Controller接口后&#xff0c;对结果进行转换处理的过程。 内容包括介绍自定义消息转换器、SpringMVC常见的消息转换器、Spring消息转换器工作原理等三部分。 本文以 SpringMVC系列-2 HTTP请求…

Android Settings解析

首语 Android设置应用是Android系统中一个非常重要的系统应用&#xff0c;它允许用户调整和设置系统的各种参数和功能&#xff08;系统设置/自定义设置/控制应用权限/开发者选项/系统信息等&#xff09;&#xff0c;使用户获得更好的使用体验。同时它一般也是Android系统开发者…

数据结构(递归,链表实现递归)

a.宏观描述&#xff1a;本质上说&#xff0c;递归将原问题转化为更小的同一问题。 b.递归本身也是一个函数&#xff0c;来完成某一功能。 1.递归终止的条件 2.递归操作 1.猴子吃桃问题 猴子第一天偷吃了该堆桃子的一半&#xff0c;觉得好吃多吃了一个&#xff1b;第二天吃了该堆…

【计算机网络】计算机网络中的一些基本概念

IP地址&#xff08;互联网协议地址&#xff09;&#xff1a; IP地址是分配给连接到互联网的设备的唯一标识符。它是由四个数字&#xff08;IPv4&#xff09;或者由八个数字&#xff08;IPv6&#xff09;组成。这些数字是网络层协议的一部分&#xff0c;它定义了数据包的路由。…

源码解析SpringMVC处理请求的完整流程

1.WebMvcAutoConfiguration EnableWebMvcConfiguration自动装配类负责加载SpringMVC涉及的HandlerAdapter、HandlerMapping、ExceptionHandlerExceptionResolver等。 SpringMVC利用 DispatchServlet 处理上游Tomcat的请求时,会被HandlerMapping、HandlerAdapter的相关子类分别…

Java JDK环境变量配置

JDK 安装和配置完成后&#xff0c;可以测试其是否能够正常运行。选择“开始”|“运行”命令&#xff0c;在打开的“运行”对话框中输入 cmd 命令&#xff0c;按 Enter 键进入到 DOS 环境下。 在命令提示符后输入并执行java -version命令&#xff0c;系统如果输出类似图 1 所示的…

Java类的继承

继承&#xff1a; 类的继承基本思想是基于某个父类进行扩展&#xff0c;得到一个新的子类&#xff0c;子类可以继承父类的原有属性和方法&#xff0c;也可以增加原来父类所不具备的属性和方法&#xff0c;或者重写父类中的方法; 重写&#xff1a; 【重写】也可以称为【覆盖】&…

阿里云服务结构--长期更新

CNCF 全称Cloud Native Computing Foundation&#xff08;云原生计算基金会&#xff09;&#xff0c;成立于 2015 年7月21日&#xff08;于美国波特兰OSCON 2015上宣布&#xff09;&#xff0c;其最初的口号是坚持和整合开源技术来让编排容器作为微服务架构的一部分&#xff0…

基于​Segment-and-Track Anything与ProPainter实现视频一键目标移除与一键祛除水印

一、 ProPainter 1.算法简介 ProPainter是由新加坡南洋理工大学&#xff08;Nanyang Technological University&#xff09;的S-Lab团队开发的一款视频修复工具。它融合了图像和特征修复的优势&#xff0c;以及高效的Transformer技术&#xff0c;旨在提供高质量的视频修复效果…

SolidWorks模型导入到Gazebo中

首先建立好solidworks模型&#xff0c;然后另存为stl格式&#xff0c; 导出为STL文件时&#xff0c;文件名最好不要是中文&#xff0c;并且要将后缀STL改为stl&#xff0c;否则Gazebo无法识别 这是我创建好的机器人充电桩模型&#xff1a; 尺寸是单位是mm&#xff1a; 135mm …

C语言程序的翻译环境和执行环境

目录 一、概述&#xff1a;翻译环境、执行环境 1.翻译环境 2.执行环境&#xff08;运行环境&#xff09; 二、详述翻译环境——编译环境、链接环境 1.编译环境 2.链接环境 三、详述编译过程——预编译、编译、汇编 1.预编译&#xff08;预处理&#xff09; 2.编译&…

JVM 堆外内存查看方法

JVM 堆外内存查看方法 概述 是否曾经想过为什么Java应用程序通过众所周知的*-Xms和-Xmx调整标志消耗的内存比指定的数量大得多 &#xff1f;由于各种原因和可能的优化&#xff0c;JVM可能会分配额外的本机内存。这些额外的分配最终可能使消耗的内存超出-Xmx* 限制。在本教程中…

第6周 .NET

好嘛&#xff01;本来以为上周SQL Server环境配置等已经够恶心了&#xff0c;没想到这周又得去搞所谓的Microsoft Visual Studio 2005了。 首先非常离谱的是&#xff0c;这个Microsoft Visual Studio 2005如果就是指Visual Studio 2005&#xff0c;那么已经是8年前的老的不行的…