利用Dockerfile开发定制镜像实战.

写在前面

本文主要介绍了Docker File的原理和基础语法


Dockerfile的原理

dockerfile是一种文本格式的文件,用于描述如何构建Docker镜像。在Dockerfile中,我们可以定义基础镜像、安装依赖、添加文件等操作,最终生成一个可以直接运行的容器镜像。
Dockerfile的原理可以分为以下几个步骤:

  1. 选择基础镜像:Dockerfile中的第一条指令就是选择基础镜像,该镜像作为构建的基础。它可能是官方提供的基础镜像,也可以是其他第三方提供的。
  2. 执行指令:Dockerfile中包含一系列指令,用于在基础镜像上安装软件、配置环境变量、添加文件等操作。这些指令会被依次执行,每个指令都会生成一个新的镜像层。
  3. 创建镜像:在Dockerfile中所有指令执行完毕后,Docker引擎会自动将多个镜像层合并为单个镜像,并命名为名称和版本。
    由于镜像层是只读的,每次对镜像的修改都会生成新的镜像层,不会对原有镜像造成任何影响。因此,Dockerfile提供了一种非常方便和可移植的方式,用于构建和分享Docker镜像。

Docker指令语法详细解释和示例

  1. FROM
    FROM 是 Dockerfile 中的第一个指令,用于指定基础镜像名称以及其版本信息。一切都是从一个基础镜像开始构建的。FROM 接收一个参数,表示所使用的基础镜像名称。
    示例:
    FROM ubuntu:18.04
    #意思是以一个 Ubuntu 18.04 作为当前镜像的基础镜像构建。
  2. MAINTAINER
    MAINTAINER 指令用于指定镜像的维护者信息。这是一个可选项,一般也是我们不加的,因为这个用处不大。
    示例:
    MAINTAINER someone@example.com
  3. RUN
    RUN 指令用于在 Docker 容器中运行指定的命令。可以使用 RUN 运行各种命令,比如 apt-get 安装、pip 安装等等。最好将 apt-get 和 pip 安装命令放在同一行中,以免出现多个镜像层。
    示例:
    RUN apt-get update && apt-get install -y
    nginx
    php-fpm
    php-mysql
  4. USER
    USER 指令用于设置在容器中运行命令时的用户身份(用户名或用户 ID)。
    示例:
    USER someone
    #切换为某个用户
  5. ADD / COPY
    ADD 和 COPY 指令用于将 中的文件或目录复制到容器中的 。两者的细微区别在于,ADD 指令支持更多的功能,例如获取网络资源并自动解压缩压缩包,由此可见copy添加文件的体积会更小,所以日常使用会更多。
    示例:
    COPY ./app /app
    ADD ./app.tar.gz /
    日常工作常常以下指令组合在这里插入图片描述
  6. CMD
    CMD 指令用于在启动容器时执行指定的命令。一个 Dockerfile 文件只能包含一个 CMD 指令,该指令可以被覆盖(强制替换),只运行最后一条,或者docker run运行时候的参数覆盖,和run的区别是run是docker build 构建镜像阶段执行操作的一条指令,cmd是启动容器后调用,用于docker run阶段运行。
    示例:
    CMD [“nginx”, “-g”, “daemon off;”]
    #这里运行了一个 nginx 服务器
  7. ENTRYPOINT
    ENTRYPOINT 指令与 CMD 极为相似,但是它不会被覆盖,而是始终会运行。ENTRYPOINT 与 CMD 指令的一个重要区别是,每次运行容器时,都会将 CMD 参数附加到 ENTRYPOINT 参数上,比如如下图,如果需要更改nginx配置文件路径,在docker run时候指定路径即可。
    在这里插入图片描述
    示例:
    ENTRYPOINT [“ping”]
    CMD [“-c”, “5”, “localhost”]
    #运行时默认运行 ping localhost 命令,该命令会ping 5次localhost。
  8. ENV
    ENV 指令用于设置环境变量。它可以设置一个或多个键值对,这些键值对可以在容器运行时被使用。可以用 $key 格式来使用值。
    示例:
    ENV MY_NAME=“Alice”
    MY_EMAIL=“alice@example.com”
  9. EXPOSE
    EXPOSE 指令用于指定容器应该监听哪些网络端口。它不会创建端口映射,只是声明容器应该监听哪些端口。
    示例:
    EXPOSE 80/tcp
  10. WORKDIR
    WORKDIR 指令用于设置工作目录,相当于切换到该目录。一旦指定了一个工作目录,后续的指令都将在该目录下执行。
    示例:
    WORKDIR /app
  11. VOLUME
    VOLUME 指令用于在运行时创建挂载点(也称为数据卷)。数据卷可以是主机文件系统中的目录,也可以是其他容器中的目录,可以把docker中的数据实时挂载到本地的目录中,避免误删目录造成数据丢失。可以通过docker inspect [image] 查看容器的详细信息,找到mounts节点,可以找到本地的数据的挂在的目录。
    示例:
    VOLUME /app/logs

Dockerfile build 命令的用法

Dockerfile 创建完成后,可以使用 docker build 命令根据 Dockerfile 构建一个镜像。
Docker build常用的指令包括两个参数:
◆ -t 指定镜像的名字,
◆ -f 显示指定构建镜像的 Dockerfile 文件

构建镜像的原理

Dockerfile 是一种文本文件,用于定义 Docker 镜像的构建过程。当我们运行 docker build 命令时,Docker 会依据 Dockerfile 中的指令来构建镜像。
构建 Docker 镜像的主要步骤如下:

  1. 读取 Dockerfile 文件,解析其中的指令;
  2. 根据指令和 Dockerfile 中的内容创建一个新的容器;
  3. 在新的容器中执行指令,如安装软件等;
  4. 执行完所有指令后,将容器制作成镜像,保存到本地或远程仓库中。
    在整个构建过程中,每个指令都会生成一个新的临时容器,执行指令,然后把结果保存下来,作为下一步构建镜像的基础。这种机制使得 Dockerfile 可以精准、灵活地定义镜像的构建流程,而且可以高效地利用 Docker 中的资源,极大提升构建的速度和效率。
    在这里插入图片描述

编写Dockerfile的几条建议

  1. 单一职责
  2. 提供注释信息
  3. 保持容器最小化
  4. 合理选择基础镜像
  5. 最小化镜像层数
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值