【docker笔记】DockerFile

这篇具有很好参考价值的文章主要介绍了【docker笔记】DockerFile。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DockerFile

Docker镜像结构的分层

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

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

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

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

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

DockerFile构建过程解析

【docker笔记】DockerFile,docker,docker
官网: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,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格式

【docker笔记】DockerFile,docker,docker

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笔记】DockerFile,docker,docker

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

【docker笔记】DockerFile,docker,docker

案例

自定义镜像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 后面有个空格,有个点

运行镜像文章来源地址https://www.toymoban.com/news/detail-784094.html

docker run -it 新镜像名字:TAG

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

到了这里,关于【docker笔记】DockerFile的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker学习笔记(三)Dockerfile指令详解

    基础镜像是构建镜像的起点,定制镜像都需要以一个镜像为基础,然后对其进行修改,From就是用来指定基础镜像的,因此Dockerfile中From是必备的指令,而且必须是第一条。 Docker中存在一个特殊镜像名为 scratch 这个镜像并不存在,仅表示一个空白的镜像,下一条指令会作为镜像

    2024年04月16日
    浏览(31)
  • dockerfile避坑笔记(VMWare下使用Ubuntu在Ubuntu20.04基础镜像下docker打包多个go项目)

    docker是一种方便跨平台迁移应用的程序,通过docker可以实现在同一类操作系统中,如Ubuntu和RedHat两个linux操作系统中,实现程序的跨平台部署。比如我在Ubuntu中打包了一个go项目的docker镜像(镜像为二进制文件,相当于windows中的exe文件),这个镜像可以直接在另一台Ubuntu上运

    2024年02月05日
    浏览(69)
  • Docker技术入门| Part03:Dockerfile详解(Dockerfile概念、Dockerfile 指令、使用Dockerfile构建镜像)

    Docker镜像原理 Docker镜像是由特殊的文件系统叠加而成 最底端是bootfs,并使用宿主机的bootfs 第二层是root文件系统rootfs,称为base image 然后再往上可以叠加其他的镜像文件 统文件系统(UnionFile System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统的视角,这样就隐

    2024年02月09日
    浏览(64)
  • 《Docker极简教程》--Dockerfile--Dockerfile的基本语法

    Dockerfile是一种文本文件,用于定义Docker镜像的内容和构建步骤。它包含一系列指令,每个指令代表一个构建步骤,从基础镜像开始,逐步构建出最终的镜像。通过Dockerfile,用户可以精确地描述应用程序运行环境的配置、依赖项安装、文件复制等操作。这使得应用程序的部署

    2024年02月20日
    浏览(48)
  • docker/Dockerfile/docker compose

    https://mirror.tuna.tsinghua.edu.cn/help/docker-ce/ 在x86环境下,由容器统一管理开发及运行环境。 Docker https://mirror.tuna.tsinghua.edu.cn/help/docker-ce/ sudo dockerd 手动启动docker sudo service docker start 后台启动docker sudo dockerd 显示启动docker,看日志中的docker /var/log/docker.log sudo apt-key adv --keyserver key

    2024年02月08日
    浏览(45)
  • [Docker]五.Docker中Dockerfile详解

    Dockerfile 就是用来构建 docker 镜像的构建文件 新建一个名为 Dockerfile 文件,并在文件内添加以下内容:         要构建并实现上面的镜像, 以前的办法: 下载一个centos镜像,通过镜像启动容器,进入容器,然后下载net-tools软件,然后cd 到wwwroot目录,执行/bin/bash,然后退出容器,把这个容器

    2024年02月06日
    浏览(43)
  • 【Docker】docker入门之dockerfile编写

    嗨喽,大家好。本篇文章主要记录博主在学习docker以及编写dockerfile的过程,记录使用docker过程中遇到的问题。 Docker 是一种开源的容器化平台,用于构建、部署和运行应用程序。它提供了一种轻量级、灵活和可移植的方式来打包应用程序及其依赖项,并创建一个独立、隔离的

    2024年02月10日
    浏览(36)
  • 【Docker】Docker 仓库管理和Docker Dockerfile

    作者简介: 辭七七,目前大二,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 仓库(Repository)是集中存放镜像的地方。以下介绍一下 Docker Hub。当然不止 docker hub,只是远程的服务商不一样,

    2024年02月05日
    浏览(42)
  • Docker(五)DockerFile详解

     前言 :         学习之前需要了解docker相关概念,移步 Docker官网          此处不再赘述虚拟化技术和docker VS 虚拟机 的一些内容,有条件的建议直接移步 度娘         笔记全程操作在华为云务器,CentOS7系统。需要自行准备操作环境。 Dockerfile是用来构建Docker镜像的文本

    2024年02月05日
    浏览(42)
  • Docker容器 - DockerFile详解

    目录 DockerFile 一、是什么 二、构建步骤 DockerFile构建过程 一、DockerFile基础 二、Docker执行DockerFile的流程 三、总结 DockerFile常用保留字 零、参考Tomcat的DockerFile 一、FROM 二、MAINTAINER 三、RUN 1.shell 2.exec 四、EXPOSE 五、WORKDIR 六、USER 七、ENV 八、ADD 九、COPY 十、VOLUME 十一、CMD 1.举个

    2024年02月15日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包