【docker笔记】DockerFile

news2024/9/28 21:23:56

DockerFile

Docker镜像结构的分层

镜像不是一个单一的文件,而是有多层构成。

容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。

如果删除了容器,也就是删除了其最上面的读写层,文件改动也就丢失了。

Docker使用存储驱动管理镜像像每层内容及可读可写的容器层

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

DockerFile构建过程解析

在这里插入图片描述
官网:https://docs.docker.com/engine/reference/builder/

构建三步骤

1、编写DockerFile文件
2、docker build命令构建镜像
3、docker run 依镜像运行容器实例

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段

Dockerfile是软件的原材料

Docker镜像是软件的交付品

Docker容器则可以认为是软件镜像的运行态,也即依照镜像运行的容器实例

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

在这里插入图片描述

Docker执行DockerFile的大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令对容器做出修改
  3. 执行类似docker commit 的操作提交一个新的镜像层
  4. docker 在基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有执行执行完成。

DockerFile内容基础知识

  1. 每条保留字指令都必须为大写字母且后面跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层并对镜像进行提交。

DockerFile常用保留字指令

参考tomcat8的dockerfile入门

From
基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from

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

Run
容器构建时需要运行的命令,RUN是在docker build时运行
两种格式:
1.shell格式
<命令行命令>等同于,在终端操作的shell命令
RUN yum -y install vim

2.exec格式

在这里插入图片描述

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

WORKDIR
指定在创建容器后。终端默认登录的进来工作目录,一个落脚点。

USER
指定该镜像以什么样的用户去执行,如果都不指定,默认是root

ENV
用来在构建镜像过程中设置环境变量

ENV MY_PATH /usr/mytest 

这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样,
也可以在其它指令中直接使用这些环境变量, 比如:WORKDIR $MY_PATH

ADD
将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

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

COPY src dest
COPY["src","dest"]
<src源路径>:源文件或源目录
<dest目标路径>: 容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

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

CMD
指定容器启动时的要干的事情。
Dockerfile 中可以由多个CMD指令,但是只有最后一个生效,CMD会被 docker run 命令行参数中指定要运行的程序所覆盖。

他和前面RUN命令的区别 CMD 是在 docker run 时运行。 RUN 是在docker build 时运行

ENTRYPOINT
类似于CMD指令,但是ENTRYPOINT不会被docker run 后面的命令覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序。

但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序

命令格式:ENTRYPOINT[" < executeable >","< param1 >","< param2 >",...]

ENTRYPOINT 可以和CMD一起用
一般是变参才会使用 CMD ,这里的CMD等于是在给 ENTRYPOINT 传参
当制定了ENTRYPOINT 后,CMD的含义就发生了变化,不再是直接运行其命令而是将 CMD 的内容作为参数传递给 ENTRYPOINT指定,他两个组合会变成< ENTRYPOINT > “< CMD >”

优点:在执行docker run 的时候可以指定 ENTRYPOINT 运行所需的参数
注意:如果Dockerfile 中如果存在多个ENTRYPOINT 指令,仅最后一个生效。

假设已通过 Dockerfile 构建了 nginx:test 镜像:

FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参 
CMD ["/etc/nginx/nginx.conf"] # 变参 

1、不传参运行 $ docker run nginx:test
容器内会默认运行以下命令,启动主进程。

nginx -c /etc/nginx/nginx.conf 

2、传参运行 $ docker run nginx:test -c
/etc/nginx/new.conf 容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)

nginx -c /etc/nginx/new.conf

Docker之docker run参数覆盖Dockerfile中CMD命令以及CMD与ENTRYPOINT的区别

明确docker run指令中的参数是什么?
docker run 指令(-it/-p/-d等) 镜像名 参数(/bin/sh、bash等)
即docker run命令中,镜像名后面的都是给容器执行的命令参数

举例说明docker run参数覆盖Dockerfile中CMD命令的情况

在这里插入图片描述

举例说明docker run参数覆盖Dockerfile中ENTRYPOINT命令的情况

在这里插入图片描述

案例

自定义镜像mycentosjava8

要求Centos7镜像具备 vim + ifconfig + jdk8

JDK下载镜像地址
官网:https://www.oracle.com/java/technologies/downloads/#java8
https://mirrors.yangxingzhen.com/jdk/

构建Dockerfile

FROM centos
MAINTAINER mzr
  
ENV MYPATH /usr/local 
WORKDIR $MYPATH 
  
#安装vim编辑器 
RUN yum -y install vim 
#安装ifconfig命令查看网络IP 
RUN yum -y install net-tools 
#安装java8及lib库 
RUN yum -y install glibc.i686 
RUN mkdir /usr/local/java 
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置 
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/ 
#配置java环境变量 
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171 
ENV JRE_HOME $JAVA_HOME/jre 
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH 
ENV PATH $JAVA_HOME/bin:$PATH 
  
EXPOSE 80 
 
CMD echo $MYPATH 
CMD echo "success--------------ok" 
CMD /bin/bash

使用Dockerfile构建镜像

docker build -t 新镜像名字:TAG .

例如:docker build -t centosjava8:1.5 .

#【注意】上面TAG 后面有个空格,有个点

运行镜像

docker run -it 新镜像名字:TAG

例如:docker run -it centosjava8:1.5 /bin/bash

虚悬镜像

仓库名,标签都是 < none > 的镜像,俗称dangling image

构建Dockerfile

from ubuntu
CMD echo 'action is sucdess'

构建

docker build .

查看

docker image ls -f dangling=true

虚悬镜像已经失去存在价值,可以删除

docker image prune 

myubuntu

构建Dockerfile

FROM ubuntu
MAINTAINER zzyy<zzyybs@126.com> 
  
ENV MYPATH /usr/local 
WORKDIR $MYPATH 
  
RUN apt-get update 
RUN apt-get install net-tools 
#RUN apt-get install -y iproute2 
#RUN apt-get install -y inetutils-ping 
  
EXPOSE 80 
  
CMD echo $MYPATH 
CMD echo "install inconfig cmd into ubuntu success--------------ok" 
CMD /bin/bash 

使用Dockerfile构建镜像

docker build -t 新镜像名字:TAG .

例如:docker build -t myubuntu:1.0 .

#【注意】上面TAG 后面有个空格,有个点

运行镜像

docker run -it 新镜像名字:TAG

例如:docker run -it myubuntu:1.0 /bin/bash

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

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

相关文章

解决Qt的release构建下无法进入断点调试的问题

在工作的时候遇到了第三方库只提供release版本的库的情况&#xff0c;我需要在这基础上封装一层自家库&#xff0c;在调试的时候遇到如下问题&#xff0c;但是在Qt环境下&#xff0c;release的库只能在进行release构建和调试。 卡在了一直进不了断点的情况。提示内容如下&#…

苹果手机怎么退出QQ群聊?方法简单,一学就会!

QQ作为中国流行的社交软件之一&#xff0c;被大家广泛使用。有时候&#xff0c;我们可能会不小心加入了一些不需要的群聊&#xff0c;或者发现群聊的内容不再符合您的兴趣。 那么&#xff0c;大家这时候可以考虑退出群聊。怎么退出qq群聊&#xff1f;本文将为大家提供详细的步…

SpringBoot中整合ElasticSearch实现增删改查等操作

场景 SpringBoot中整合ElasticSearch快速入门以及踩坑记录&#xff1a; https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135599698 在上面进行集成的基础上&#xff0c;实现对ES数据的增删改查等操作。 注&#xff1a; 博客&#xff1a;霸道流氓气质-CSDN博客…

SeaTunnel 海量数据同步工具的使用(连载中……)

一、概述 SeaTunnel 是一个非常易用&#xff0c;高性能、支持实时流式和离线批处理的海量数据处理产品&#xff0c;前身是 WaterDrop &#xff08;中文名&#xff1a;水滴&#xff09;&#xff0c;自 2021年10月12日更名为 SeaTunnel 。2021年12月9日&#xff0c;SeaTunnel 正式…

微服务原理

微服务篇 文章目录 微服务篇SpringCloud常见组件 Nacos篇下载源码导入Nacos源码proto编译protobuf定义安装protoc编译proto 运行Nacos服务服务注册服务注册接口客户端NacosServiceRegistryAutoConfigurationNacosAutoServiceRegistrationNacosServiceRegistryNacosNamingServic…

计算机二级Python基本排序题-序号43(补充)

1. 在一组单词中&#xff0c;查找出所有长度最长的单词&#xff0c;如果给定的一组单词是&#xff1a;“cad” ,“VB”.“Python” ,“MATLAB” , “hel1o” , “world” 则输出结果为&#xff1a;the longest words are: Python MATLAB def proc(strings): …

Leetcode1441.用栈操作构建数组

文章目录 题目原题链接思路代码 题目 给你一个数组 target 和一个整数 n。每次迭代&#xff0c;需要从 list { 1 , 2 , 3 …, n } 中依次读取一个数字。 请使用下述操作来构建目标数组 target &#xff1a; “Push”&#xff1a;从 list 中读取一个新元素&#xff0c; 并将其…

多视图多标签学习

一、多视图学习 多视图学习又称多视角学习&#xff0c;在实际应用问题中&#xff0c;对于同一事物可以从多种不同的途径或不同的角度进行描述&#xff0c;这些不同的描述构成了事物的多个视图。例如&#xff1a;在与人们生活息息相关的互联网中&#xff0c;网页数据既可以用网…

参与直播领取龙年大礼盒!23年Coremail社区年终福利大放送

2023年终福利大放送 Coremail 管理员社区是由 Coremail 邮件安全团队、服务团队及多条产品线共同维护&#xff0c;集 7*24h 在线自助查询、技术问答交流、大咖互动分享、资料下载等功能于一体&#xff0c;专属于 Coremail 邮件管理员、安全员成长互动的知识库社区。 转眼间&am…

RabbitMQ交换机(2)-Direct

1.Direct 直连(路由)交换机,生产者将消息发送到交换机&#xff0c;并指定消息的Routing Key&#xff08;路由键&#xff09;。交换机会将Routing Key与队列绑定进行匹配&#xff0c;如果匹配成功&#xff0c;则将该消息路由到对应的队列中。如果没有匹配成功&#xff0c;该消息…

统计学-R语言-4.6

文章目录 前言列联表条形图及其变种---单式条形图条形图及其变种---帕累托图条形图及其变种---复式条形图条形图及其变种---脊形图条形图及其变种---马赛克图饼图及其变种---饼图饼图及其变种---扇形图直方图茎叶图箱线图小提琴图气泡图总结 前言 本篇文章是对数据可视化的补充…

利用fd子系统实现图案与图片显示方法

//第一&#xff1a;利用fb子系统画圆的方法与实现 //1、头文件信息 #include <sys/ioctl.h> #include <linux/fb.h> #include <stdio.h> #include <sys/types.h> #include <stdio.h> #include <sys/mman.h> #include <sys/types.h>…

欧姆龙plc学习NJ系列CJ系列资料Sysmac Studio编程软件视频教程

Sysmac Studio是欧姆龙公司开发的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于编程和配置欧姆龙PLC&#xff08;可编程逻辑控制器&#xff09;和其他自动化设备。Sysmac Studio支持以下型号的欧姆龙PLC&#xff1a;1. NJ系列&#xff1a;NJ501、NJ301、NJ101、…

循环冗余校验(Cyclic Redundancy Check, CRC)计算

若信息码字为111000110&#xff0c;生成多项式G(x)x^5x^3x1&#xff0c;则计算出的CRC校验码为&#xff08; &#xff09;。 A.01101 B.11001 C.001101 D.011001 循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的…

【数据库和表的管理】

数据库和表的管理 一、实验目的 了解MySQL数据库的逻辑结构和物理结构的特点。学会使用SQL语句创建、选择、删除数据库。学会使用SQL语句创建、修改、删除表。学会使用SQL语句对表进行插入、修改和删除数据操作。了解MySQL的常用数据类型。 二、实验内容SQL语句创建、选择、删…

多维时序 | Matlab实现GRO-CNN-LSTM-Attention淘金算法优化卷积神经网络-长短期记忆网络结合注意力机制多变量时间序列预测

多维时序 | Matlab实现GRO-CNN-LSTM-Attention淘金算法优化卷积神经网络-长短期记忆网络结合注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现GRO-CNN-LSTM-Attention淘金算法优化卷积神经网络-长短期记忆网络结合注意力机制多变量时间序列预测效果一览基本介绍程序设…

vivado 使用Vitis HLS源、使用模型生成器源、使用系统生成器源

使用Vitis HLS源 AMD Vitis™ 高级综合&#xff08;HLS&#xff09;工具将C规范转换为寄存器传输级&#xff08;RTL&#xff09;实现&#xff0c;您可以将其合成到AMD设备中。你可以写CC、C或SystemC中的规范&#xff0c;AMD设备提供了大规模并行与传统处理器相比&#xff0c;…

Android的setContentView流程

一.Activity里面的mWindow是啥 在ActivityThread的performLaunchActivity方法里面&#xff1a; private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {ActivityInfo aInfo r.activityInfo;if (r.packageInfo null) {r.packageInfo getP…

11 # 类:抽象类与多态

抽象类 抽象类是不允许被实例化的&#xff0c;只能被继承 abstract class Animal {}let animal new Animal(); // 错误: 不能创建一个抽象类的实例 class Dog {constructor(name: string) {this.name name;}name: string;run() {} }let dog new Dog(Tom);抽象类的好处就…

【野火i.MX6NULL开发板】ARM-GCC 和开发板的 HelloWorld(ubuntu主机和野火开发板debian交叉编译)、开发板的/mnt里没文件

0、前言 参考资料&#xff1a; 《野火 Linux 基础与应用开发实战指南基于 i.MX6ULL 系列》PDF 第24章 参考视频&#xff1a; https://www.bilibili.com/video/BV1JK4y1t7io?p26&vd_sourcefb8dcae0aee3f1aab700c21099045395 注意&#xff0c;一定要记得把虚拟机的网络适配…