Dockerfile 详解

ops/2024/10/16 0:24:53/

Dockerfile是自定义Docker镜像的一套规则,由多条指令构成,每条指令都会对应于Docker镜像中的每一层,因为Docker是分层存储的。以下是Dockerfile中各个参数的详解及演示解析:

1. FROM

  • 功能:指定待扩展的父级镜像(基础镜像)。除了注释以外,文件开头必须是一个FROM指令,接下来的指令便在这个父级镜像的环境中运行,直到遇到下一个FROM指令。通过添加多个FROM命令,可以在同一个Dockerfile文件中创建多个镜像。

  • 示例FROM centos:7

2. MAINTAINER(已废弃,建议使用LABEL)

  • 功能:声明创建的镜像的作者信息(用户名、邮箱)。非必须,但在某些情况下有助于了解镜像的来源和维护者。
  • 格式MAINTAINER <AUTHOR_NAME>
  • 示例MAINTAINER xiaoli
  • 注意:Docker官方推荐使用LABEL指令代替MAINTAINER来指定镜像的元数据。

3. LABEL

  • 功能:为镜像指定标签,可以包含多个键值对。
  • 格式LABEL <key>=<value> <key>=<value> ...
  • 示例
dockerfile">LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"

4. RUN

  • 功能:用来修改镜像的命令,常用来安装库、程序以及配置程序。一条RUN指令执行完毕后,会在当前镜像上创建一个新的镜像层,接下来的指令会在新的镜像上继续执行。

  • 格式

    • RUN <command>(在/bin/sh环境中执行的指令)
    • RUN ["executable", "param1", "param2"](直接使用系统调用exec来执行)
  • 示例

dockerfile">RUN yum -y install httpd
RUN ["yum", "install", "nginx"]

5. EXPOSE

  • 功能:用来指明容器内进程对外开放的端口,多个端口之间使用空格隔开。运行容器时,通过参数-P(大写)即可将EXPOSE里所指定的端口映射到主机上另外的随机端口,其他容器或主机就可以通过映射后的端口与此容器通信。
  • 格式EXPOSE <port> [<port>/<protocol>...]
  • 示例EXPOSE 80 443

6. ADD 与 COPY

  • ADD:向新镜像中添加文件,这个文件可以是一个主机文件、一个网络文件或一个文件夹。如果源文件是主机上zip或tar形式的压缩文件,Docker会先解压缩,然后将文件添加到镜像的指定位置。如果源文件是一个通过URL指定的网络压缩文件,则不会解压。

  • COPY:从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>。COPY指令不会解压压缩文件,但会保留原文件的基本信息(如读、写、执行权限、文件变更时间等)。

  • 格式

    • ADD <source> <destination>
    • COPY <source> <destination>
  • 示例

dockerfile">ADD httpd-2.4.tar.gz /usr/local/
COPY index.html /usr/share/nginx/html/

7. VOLUME

  • 功能:在镜像里创建一个指定路径(文件或文件夹)的挂载点,这个容器可以来自主机或者其它容器。多个容器可以通过同一个挂载点共享数据,即便其中一个容器已经停止,挂载点也仍然可以访问。
  • 格式VOLUME ["/data"]
  • 示例VOLUME /data

8. WORKDIR

  • 功能:为接下来执行的指令指定一个新的工作目录,这个目录可以是绝对目录,也可以是相对目录。根据需要,WORKDIR可以被多次指定。当启动一个容器时,最后一条WORKDIR指令所指的目录将作为容器运行的当前工作目录。
  • 格式WORKDIR <dirpath>
  • 示例
dockerfile">WORKDIR /opt

9. ENV

  • 功能:设置容器运行的环境变量。在运行容器的时候,通过-e参数可以修改这个环境变量值,也可以添加新的环境变量。
  • 格式ENV <key> <value>ENV <key>=<value>
  • 示例
dockerfile">ENV MYSQL_USER docker_user
ENV MYSQL_PASS docker_password

10. CMD

  • 功能:用来设置启动容器时默认运行的命令。Dockerfile中可以写多个CMD指令,但只有最后一个生效。CMD会被docker run之后的参数替换。

  • 格式

    • CMD ["executable","param1","param2"](推荐使用)
    • CMD command param1 param2(在/bin/sh中执行)
    • CMD ["param1","param2"](提供给ENTRYPOINT的默认参数)
  • 示例

dockerfile">CMD ["python", "app.py"]

11. ENTRYPOINT

  • 功能:与CMD类似,也是用来指定容器启动时的默认运行的命令。区别在于,运行容器时添加在镜像之后的参数,对ENTRYPOINT是拼接,CMD是覆盖。
  • 格式ENTRYPOINT ["executable", "param1", "param2"]
  • 示例
dockerfile">ENTRYPOINT ["curl", "-s", "https://ip.cn"]

12. USER

  • 功能:为容器的运行及接下来RUN、CMD、ENTRYPOINT等指令的运行指定用户或UID。
  • 格式USER <username>USER <UID>
  • 示例USER xiaoli

13. ONBUILD

  • 功能:触发器指令。构建镜像时,Docker的镜像构建器会将所有的ONBUILD指令指定的命令保存到镜像的元数据中,这些命令在当前镜像的构建过程中并不会执行。只有新的镜像使用FROM指令指定父镜像为这个镜像时,便会触发执行。
  • 格式ONBUILD <INSTRUCTION>
  • 示例
dockerfile">ONBUILD ADD ./app/src /app/src

Dockerfile图解

在这里插入图片描述

演示解析

1.以下是一个简单的Dockerfile示例,用于构建一个包含httpd应用的Docker镜像:
dockerfile"># 使用官方的CentOS7作为基础镜像
FROM centos:7# 维护者信息
MAINTAINER xwey# 设置环境变量
ENV PATH="/usr/local/nginx/sbin:$PATH"# 将本地nginx的tar包复制到容器中,ADD模块会自动解压tar包
ADD nginx-1.16.1.tar.gz /usr/local/# 删除原有yum源,安装ali源,安装编译软件
RUN rm -rf /etc/yum.repos.d/* && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo && yum install -y epel-release.noarch && yum install -y gcc gcc-c++ make openssl-devel pcre-devel && yum clean all# 创建nginx用户设置不可登录
RUN useradd -s /sbin/nologin -M nginx# 和cd一样,进入解压后的nginx目录
WORKDIR /usr/local/nginx-1.16.1# 编译nginx
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-pcre && make && make install && rm -rf /usr/local/nginx-1.16.1# 暴露nginx应用默认端口
EXPOSE 80# 启动nginx
CMD ["nginx","-g","daemon off;"]# 使用build -t 打标签 (定义版本)
[root@docker ~]# docker build -t nginx:v1 .
[root@docker ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED             SIZE
nginx           v1        188f961b7cf5   2 hours ago         367MB
centos          7         eeb6ee3f44bd   3 years ago         204MB
2.使用Dockerfile创建httpd镜像
dockerfile"># 文件清单
[root@docker ~]# tree apache_centos/
apache_centos/
├── Dockerfile
├── httpd-2.4.41.tar.gz
└── run.sh# 创建run.sh
[root@docker apache_centos]# cat run.sh 
#!/bin/bash
/usr/local/apache2/bin/httpd -D FOREGROUND# 准备Dockerfile
[root@docker apache_centos]# cat Dockerfile 
# 使用官方的CentOS7作为基础镜像
FROM centos:7# 维护者信息
MAINTAINER xwey# 删除原有yum源,配置ali源,安装编译软件
RUN rm -rf /etc/yum.repos.d/* && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo && yum install -y gcc make apr-devel apr apr-util apr-util-devel pcre-devel && yum clean all# 将本地下载好的httpd的tar包传入镜像
ADD httpd-2.4.41.tar.gz /usr/local/src/# 将本地创建的启动脚本传入镜像
ADD run.sh /usr/local/sbin/run.sh# 和cd一样,进入解压后的目录
WORKDIR /usr/local/src/httpd-2.4.41# 开始编译,修改httpd配置文件,给启动文件加上执行权限
RUN ./configure --prefix=/usr/local/apache2 --enable-mods-shared=most --enable-so && make && make install && rm -rf /usr/local/src/* && sed -i 's/#ServerName www.example.com:80/ServerName localhost:80/g' /usr/local/apache2/conf/httpd.conf && /usr/local/apache2/bin/httpd && chmod 755 /usr/local/sbin/run.sh# 暴露httpd默认端口
EXPOSE 80# 启动上传的脚本
CMD ["/usr/local/sbin/run.sh"]# 使用build -t 打标签 (定义版本)
[root@docker ~]# docker build -t apache:v1 .
[root@docker ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED             SIZE
apache          v1        d6d9554494ab   About an hour ago   377MB
nginx           v1        188f961b7cf5   2 hours ago         367MB
centos          7         eeb6ee3f44bd   3 years ago         204MB# 启动测试
[root@docker ~]# docker run -d -p 8111:80 apache:v1 /usr/local/sbin/run.sh
[root@docker ~]# curl 192.168.73.128:8111
<html><body><h1>It works!</h1></body></html>

http://www.ppmy.cn/ops/126190.html

相关文章

Spring Boot学习资源库:构建你的技术宝库

1绪 论 1.1研究背景 目前&#xff0c;在网络大环境下&#xff0c;越来越多高校开始实行网络教学&#xff0c;利用网络教学方式有利于学生更好的学习。 网络教学是指以计算机及网络为基础&#xff0c;来实现教学资源的上传、存储、传播和共享的教学手段。它是一种教学活动&#…

安卓流式布局实现记录

效果图&#xff1a; 1、导入第三方控件 implementation com.google.android:flexbox:1.1.0 2、布局中使用 <com.google.android.flexbox.FlexboxLayoutandroid:id"id/baggageFl"android:layout_width"match_parent"android:layout_height"wrap_co…

Python网络爬虫

随着互联网的迅猛发展&#xff0c;数据成为了新的“石油”。人们对于信息的需求日益增涨&#xff0c;尤其是在市场分析、学术研究和数据挖掘等领域。网络爬虫作为一种自动提取网络数据的技术&#xff0c;因其强大的能力而备受关注。而Python&#xff0c;凭借其简洁的语法和丰富…

Top6 最好的 Android 数据恢复软件免费获取

虽然在智能手机上随身携带您最喜爱的音乐收藏或珍贵的录音很方便&#xff0c;但如果您的设备出现技术问题或您不小心删除了文件&#xff0c;文件也有可能丢失。 不管文件是如何删除或丢失的&#xff0c;丢失那些珍贵的音频文件的痛苦对每个人来说都是一样的。这就是我们创建本…

【Java 并发编程】单例模式

前言 单例模式是一种十分常用但却相对而言比较简单的单例模式。虽然它简单但是包含了关于线程安全、内存模型、类加载机制等一些比较核心的知识点。本章会介绍单例模式的设计思想&#xff0c;会去讲解了几种常见的单例实现方式&#xff0c;如饿汉式、懒汉式、双重检锁、静态内部…

Python脚本爬取目标网站上的所有链接

一、爬取后txt文件保存 需要先pip install requests和BeautifulSoup库 import requests from bs4 import BeautifulSoup# 定义要爬取的新闻网站URL url https://www.chinadaily.com.cn/ # China Daily 网站# 发送请求获取页面内容 response requests.get(url)# 检查请求是否…

杨中科 .netcore Linq 。一前期准备知识

为什么要学Linq 一、为什么要学LINQ? 让数据处理变得简单: 统计一个字符串中每个字母出现的频率(忽略大小写)&#xff0c;然后按照从高到低的顺序输出出现频率高于2次的单词和其出现的频率。 var itemss.Where(c >char.lsLetter(c))//过滤非字母 .Select(c>char.ToLo…

Qt 每日面试题 -8

71、了解Qt的QPointer吗? QPointer只能用于指向QObject及派生类的对象。 当一个QObject或派生类对象被删除后&#xff0c;QPointer能自动将其内部的指针设置为0 &#xff0c;这样在使用QPointer之前就可以判断一下是否有效。QPointer对象超出作用域时&#xff0c;并不会删除它…