首页 > 其他分享 >六、Dockerfile解析

六、Dockerfile解析

时间:2023-11-29 14:00:51浏览次数:40  
标签:容器 指令 构建 镜像 docker 解析 Dockerfile

课前思考:

分别准备好两个已经写好的.net 程序与springboot程序, 如何让这两个程序在docker 中运行呢?

1. 什么是Dockerfile

Dockerfile 是用来构建Docker镜像的构建文件 ,是由一系列命令和参数构成的脚本。

构造三个步骤

  • 1.编写Dockerfile文件

  • 2.编译:docker build

  • 3.生成容器:docker run ....

2. 基础知识

  • 1.每条保留字指令都必须为大写字母且后面要跟随至少一个参数

  • 2.指令按照从上到下,顺序执行

  • 3.# 表示注释

  • 4.每条指令都会创建一个新的镜像层并对镜像进行提交

 

从软件开发的角度来说,可以分为三个层次:

Dockerfile --------> 产品原型

镜像文件 ---------> UI设计图

运行的容器 ---------> 最终交付的成品

 

3.Dockerfile体系结构(保留字指令)

FROM :基础镜像,当前新镜像是基于哪个镜像的

MAINTAINER:镜像维护者的姓名和邮箱地址

RUN:容器构建时需要运行的命令(使用&&连接多条命令,不建议使用多个RUN指令,因为会造成镜像层太多)

FROM centos:6.9
MAINTAINER 任我行码农场
RUN sed -i "s|enabled=1|enabled=0|g" /etc/yum/pluginconf.d/fastestmirror.conf && curl -o /etc/yum.repos.d/CentOS-Base.repo https://www.xmpan.com/Centos-6-Vault-Aliyun.repo && yum -y install vim

 

EXPOSE:当前容器对外暴露的端口

WORKDIR:指定在创建容器后,终端默认登陆进来的工作目录,一个落脚点(进入容器之后默认所在的目录位置)

ENTRYPOINT:指定一个容器启动时要运行的命令,与CMD一样。

COPY:类似ADD,拷贝文件 和目录到镜像中。将从构建上下文目录中(源路径)的文件 /目录复制到新的一层的镜像内(目标路径 )位置

FROM mcr.microsoft.com/dotnet/aspnet:6.0
COPY . /unit8
WORKDIR /unit8
EXPOSE 8888
ENTRYPOINT ["dotnet", "Step4.Unit8.dll","--urls","http://0.0.0.0:8888"]

 

ENV:用来在构建镜像过程中设置环境变量(可理解为事先定义了一个变量,可参考官网的tomcat案例)

ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包(比COPY命令更强大)

VOLUME:容器数据卷,用于数据保存和持久化工作

CMD:指定一个容器启动时要运行的命令,如果有多个CMD命令,则只有最后一个生效。如果指定了 ENTRYPOINT,则CMD表示传参。CMD命令会被docker run 之后的参数替换掉(可以恶意在docker run 后 面加/bin/bash 参数)。

FROM mcr.microsoft.com/dotnet/aspnet:6.0
MAINTAINER 任我行
ENV DOTNET_HOME=/app
WORKDIR $DOTNET_HOME
ADD ./unit8 $DOTNET_HOME   # 相对路径是相对Dockerfile所在目录的路径
EXPOSE 8888
ENTRYPOINT ["dotnet","Step4.Unit8.dll"]
CMD ["--urls","http://0.0.0.0:8888"]

 

ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被 子继承后父镜像的onbuild被 触发。

我们在一个Dockerfile文件中加上ONBUILD指令,该指令对利用该Dockerfile构建镜像(比如为A镜像)不会产生实质性影响。

但是当我们编写一个新的Dockerfile文件来基于A镜像构建一个镜像(比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。 需要注意的是,如果是再利用B镜像构造新的镜像时,那个ONBUILD指令就无效了,也就是说只能再构建子镜像中执行,对孙子镜像构建无效

 

4.构建镜像

语法:docker build [-f Dockerfile文件名] -t 新镜像名:[TAG]

  • -t:表示指定镜像名

  • -f 表示指定Dockerfile文件名,若未指定,默认会扫描当前目录下名称为Dockerfile文件

  • 注意:最好在你的项目目录中将Dockerfile文件放进来,并在当前目录下执行docker build

例如:

docker build -f ./Dockerfile -t new_redis .

大坑:最后的那个. 千万不要忘记了!!!!

5. 镜像压缩

目的:主要是为了方便镜像的传输

语法:docker save -o 文件名.tar 镜像名:版本号

如:

docker save -o product.tar productservice:1.0

7. 导入为镜像文件

目的:将镜像压缩包解压成镜像文件

语法:docker load --input 文件名.tar

如:

docker load --input productservice.tar

 

8. 虚悬镜像

虚悬镜像(dangling image) , 那些没有标签的镜像被称为悬虚镜像,在列表中展示为 <none> :

<none>      <none>     00285df0df87    5 days ago   342 MB

 

通常出现这种情况,是因为构建了一个新镜像,然后为该镜像打了一个已经存在的标签。当此情况出现,Docker会构建新的镜像,然后发现已经有镜像包含相同的标签,接着Docker会移除旧镜像上面的标签,将该标签标在新的镜像之上。例如,首先基于alpine:3.4构建一个新的镜像,并打上dodge:challenger标签。然后更新Dockerfile,将alpine:3.4替换为alpine:3.5,并且再次执行docker image build命令。该命令会构建一个新的镜像,并且标签为dodge:challenger,同时移除了旧镜像上面对应的标签,旧镜像就变成了悬虚镜像
  • 查询显示虚悬镜像

docker images -f dangling=true

 

  • 删除虚悬镜像

    一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的

docker rmi $(docker images -q -f dangling=true)
或者
docker image prune

 

 

配套视频链接:全网首发java/.net双案例Docker精品课程,Docker 进阶教程(双语言双案例助力教学)-已完结_哔哩哔哩_bilibili

 

 

 

标签:容器,指令,构建,镜像,docker,解析,Dockerfile
From: https://www.cnblogs.com/xuyubing/p/17864701.html

相关文章

  • 深度解析工业网络交换机与工业自动化的紧密关系
    随着工业化程度的不断提高,工业控制系统的自动化程度也在不断增强,工业网络交换机作为数据通信和网络连接的重要设备,在工业自动化中扮演着关键的角色。工业网络交换机将不同的工业控制设备连接起来,实现数据的高效传输和实时互联,为工业自动化系统提供了可靠的网络基础。本文将围绕工业......
  • Dockerfile使用
    什么是Dockerfile?Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。命令注意:Dockerfile的指令每执行一次都会在docker上新建一层。所以过多无意义的层,会造成镜像膨胀过大。可以放在一起的命令尽量放在一起。FROMFROMnginx#FRO......
  • 2024年项目管理利器:十大工具全面解析!
    十大项目管理系统包括:1.产品研发项目管理工具:PingCode;2.通用项目协作工具:Worktile;3.开源项目管理系统:Redmine;4.IT/敏捷项目管理系统:Jira;5.免费个人项目管理:Teambition;6.桌面项目管理工具:MSProject;7.在线项目管理工具:Asana;8.小团队项目管理工具平台:Trello;9.通用型项目管理APP:Cl......
  • sendevent、getevent解析及底层操作
    getevent实时获取触控事件getevent-lt/dev/input/event1-t时间-l文本显示状态记录示例//事件类型事件码事件值EV_ABSABS_MT_TRACKING_ID0000000fEV_ABSABS_MT_POSITION_X00002bbcEV_ABSABS_MT_POSITION_Y00001......
  • 期望最大化(EM)算法:从理论到实战全解析
    本文深入探讨了期望最大化(EM)算法的原理、数学基础和应用。通过详尽的定义和具体例子,文章阐释了EM算法在高斯混合模型(GMM)中的应用,并通过Python和PyTorch代码实现进行了实战演示。关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济......
  • 期望最大化(EM)算法:从理论到实战全解析
    本文深入探讨了期望最大化(EM)算法的原理、数学基础和应用。通过详尽的定义和具体例子,文章阐释了EM算法在高斯混合模型(GMM)中的应用,并通过Python和PyTorch代码实现进行了实战演示。关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济......
  • Java程序员必备技能:Collections工具类深度解析!
    在之前的文章中,我们学习了单列集合的两大接口及其常用的实现类;在这些接口或实现类中,为我们提供了不少的实用的方法。本篇文章我们来介绍一种java开发者为我们提供了一个工具类,让我们更好的来使用集合Collections工具类Collections是一个操作Set,List,Map等的集合工具类它提......
  • Uboot顶层Makefile解析-1. defconfig过程分析
    1版本号TopMakefile的开头会有版本描述,VERSION是主版本号,PATCHLEVEL是补丁版本号,SUBLEVEL是次版本号,这三个一起构成了uboot的版本号,比如当前的uboot版本号就是“2016.03”。EXTRAVERSION是附加版本信息,NAME是和名字有关的,一般不使用这两个。2MAKEFLAGS有两个特......
  • C\C++ 使用RapidJSON库,轻松解析和生成JSON
    简介  RapidJSON是一个高效的C++JSON解析器和生成器。它专注于性能和易用性,使得处理JSON数据变得简单和快速。RapidJSON支持现代的JSON特性,如嵌套对象、数组、Unicode编码和注释。它的API简洁易用,可以轻松解析和生成JSON数据。无论你的项目需要处理大量的JSON数据,还是只需要解析......
  • 接收网络包的过程——从硬件网卡解析到IP层
    当一些网络包到来触发了中断,内核处理完这些网络包之后,我们可以先进入主动轮询poll网卡的方式,主动去接收到来的网络包。如果一直有,就一直处理,等处理告一段落,就返回干其他的事情。当再有下一批网络包到来的时候,再中断,再轮询poll。这样就会大大减少中断的数量,提升网络处理的效率,这......