Dockerfile详解

一、介绍

1.基于dockerfile创建

  • dockerfile是由一组指令组成的文件。

  • dockerfile结构四部分

    • 基础镜像信息
    • 维护者信息
    • 镜像操作指令
    • 容器启动时执行指令
  • dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#”号开头的注释

二、操作指令

1642039184753

1.ADD和COPY的区别

COPY只能用于复制,ADD复制的同时,如果复制的对象是压缩包,ADD还可以解压。但是COPY比ADD节省资源。

2.CMD和ENTRYPOINT的区别

CMD设置容器启动后默认执行的命令及其参数,但CMD能够被docker run后面跟的命令行参数替换(覆盖)。如果docker run没有指定任何的执行命令或者dockerfile里面也没有entrypoint,那么就会使用cmd指定的默认执行命令执行。cmd命令只有最后一个会生效。
entrypoint指定容器启动时要执行的命令,可以追加命令。entrypoint指定的命令需要与docker run启动容器进行搭配,将docker run指令后面跟的内容当做参数作为entrypoint指令指定的运行命令的参数,entrypoint指定的linux命令一般是不会被覆盖的。entrypoint指令并不是必须的,因为它会增加复杂度。

总结:
CMD 是容器环境启动时默认加载的命令。
ENTRYPOINT 是容器环境启动时第一个加载的命令程序/脚本程序 init(init pid 1)

如果 ENTRYPOINT 使用了 shell 模式,CMD 指令会被忽略。
如果 ENTRYPOINT 使用了 exec 模式,CMD 指定的内容被追加为 ENTRYPOINT 指定命令的参数。
如果 ENTRYPOINT 使用了 exec 模式,CMD 也应该使用 exec 模式。
ENTRYPOINT ["sh","-c","echo $HOME"]

三、docker镜像的分层

1642325681780

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

  • Dockerfile 中的每个指令都会创建一个新的镜像层

  • 镜像层会被缓存和复用(下一层执行完后的缓存会给上一层使用)

  • 当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
    如果某层命令修改了,当前缓存层会失效,上层引用当前缓存层的也会失效,需要重构镜像,常用于版本升级(功能修改、添加)

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

  • Docker 镜像每一层有唯一的编号,可以通过 docker history 来查看一个镜像由哪些层组成

    查看源图像

四、dockerfile基础编写

例:tomcat镜像

1642326634962

Dockerfile镜像实例 - 丨君丶陌 - 博客园 (cnblogs.com)

五、dockerfile优化

我们在构建镜像的时候会发现官网上下的镜像比我们自己构建的镜像小很多,这是因为官网上下载的镜像都经过了优化,常用的优化方式有以下几种:

  • 不需要输出的指令丢入/dev/null
  • 减少RUN构建
  • 多阶段构建(使用FROM命令生成多个镜像,将指定的镜像做为其他镜像的基础镜像环境来构建)
  • 使用更为轻量级的Linux发行版本(debian,alpine)

未优化之前

image-20220117172036021

不需要输出的指令丢入/dev/null

image-20220117172959713

减少RUN构建

image-20220117173634717

多阶段构建

image-20220117182506409

DockerfileDocker镜像构建的脚本文件,通过Dockerfile文件可以定义镜像的构建过程,包括基础镜像、软件安装、环境变量设置、运行命令等。 Dockerfile的基本语法如下: ``` # Comment INSTRUCTION arguments ``` 其中,#后面的内容为注释,INSTRUCTION为指令,arguments为指令的参数。 常用的指令包括: - FROM:指定基础镜像 - MAINTAINER:指定镜像维护者信息 - RUN:执行命令,可以用\换行 - CMD:指定容器启动时执行的命令,可以被docker run的命令行参数覆盖 - ENTRYPOINT:指定容器启动时执行的命令,不能被docker run的命令行参数覆盖 - EXPOSE:指定容器中的应用监听的端口 - ENV:设置环境变量 - ADD:将本地文件或目录复制到容器中 - COPY:将本地文件或目录复制到容器中,与ADD不同的是,COPY只复制文件,不会自动解压缩文件 - VOLUME:指定容器中的数据卷 - USER:指定容器中的用户 - WORKDIR:指定容器中的工作目录 一个简单的Dockerfile示例: ``` # Use an official Python runtime as a parent image FROM python:2.7-slim # Set the working directory to /app WORKDIR /app # Copy the current directory contents into the container at /app COPY . /app # Install any needed packages specified in requirements.txt RUN pip install --trusted-host pypi.python.org -r requirements.txt # Make port 80 available to the world outside this container EXPOSE 80 # Define environment variable ENV NAME World # Run app.py when the container launches CMD ["python", "app.py"] ``` 以上Dockerfile的作用是: - 使用Python 2.7镜像作为基础镜像 - 设置工作目录为/app - 将当前目录下的文件复制到容器的/app目录下 - 安装requirements.txt中指定的Python依赖库 - 暴露容器的80端口 - 设置环境变量NAME为World - 启动app.py。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值