Docker进阶:深入了解 Dockerfile

Docker进阶:深入了解 Dockerfile

  • 一、Dockerfile 概述
  • 二、Dockerfile 优点
  • 三、Dockerfile 编写规则
  • 四、Dockerfile 中常用的指令
    • 1、FROM
    • 2、LABEL
    • 3、RUN
    • 4、CMD
    • 5、ENTRYPOINT
    • 6、COPY
    • 7、ADD
    • 8、WORKDIR
    • 9、 ENV
    • 10、EXPOSE
    • 11、VOLUME
    • 12、USER
    • 13、注释
    • 14、ONBUILD 命令
    • 15、HEALTHCHECK
  • 五、Dockerfile构建镜像


💖The Begin💖点点关注,收藏不迷路💖

在这里插入图片描述

一、Dockerfile 概述

Dockerfile 是用来定义 Docker 镜像里的内容和构建步骤的文本文件。通过编写 Dockerfile,可以定制化镜像的构建过程,包括基础镜像选择、软件安装、环境变量设置等操作。通过编写 Dockerfile,用户可以自定义和构建自己的 Docker 镜像,实现应用程序的快速部署和跨环境运行。

二、Dockerfile 优点

1、容器化趋势: 容器化技术正在成为软件开发和部署的主流趋势。Docker 是当前最流行的容器化平台之一,而 Dockerfile 是定义 Docker 镜像的关键工具,掌握 Dockerfile 可以帮助开发人员更好地理解和应用容器化技术。

2、快速部署与交付: 使用 Dockerfile 可以定义应用程序的环境和依赖,将其打包成镜像,使得应用程序能够在不同环境中快速部署和交付。这种标准化的部署方式大大简化了部署流程,提高了开发团队的工作效率。

3、环境一致性: 通过 Dockerfile 构建的镜像可以确保应用程序在不同环境中的一致性运行,避免了因环境差异导致的问题,从而提高了应用程序的可移植性和稳定性。

4、资源隔离与安全性: Docker 容器提供了资源隔离和安全性,使用 Dockerfile 可以定义容器的运行环境和权限,确保应用程序在容器中的安全运行。

5、持续集成与持续部署: Dockerfile 可以作为持续集成和持续部署流程的一部分,帮助构建自动化的部署流程。

三、Dockerfile 编写规则

Dockerfile 是一个文本文件,其中包含用于构建 Docker 镜像的指令。每个指令都会创建一层,并且可以基于之前的层构建。

1、文件名以 Dockerfile命名。

2、Dockerfile 中引用的所有文件都应该与 Dockerfile 文件处于相同的目录层级,在 Dockerfile 中引用文件时,默认路径是相对于 Dockerfile 所在的目录。

3、Dockerfile 中非注释行的第一行必须是 FROM 指令,用于指定基础镜像。

4、注释:以井号(#)开头,用于注释 Dockerfile 中的内容。

5、通常为了提高可读性和一致性,建议按照惯例以大写形式书写 Dockerfile 指令,例如:

# Nginx基础镜像,并指定了使用最新版本
FROM nginx:latest# 将本地的 nginx.conf 文件复制到容器中的 /etc/nginx 目录下
COPY nginx.conf /etc/nginx/nginx.conf# 暴露 Nginx 的默认 HTTP 端口
EXPOSE 80INSTRUCTION:指令,是关键字,告诉 Docker 如何处理后续的命令。
arguments:指令的参数,具体取决于指令的类型。

6、编写 Dockerfile 时,可以在同一目录下创建一个名为 .dockerignore 的文件,并根据需要列出需要排除的文件和目录。这样可以确保在构建 Docker 镜像时,只包含必要的文件,避免不必要的文件被添加到镜像中,减小镜像大小并提高构建效率。

以下是一些示例 .dockerignore 文件的用法:# 忽略所有 .git 目录
.git# 忽略所有 .DS_Store 文件
.DS_Store# 忽略 log 目录及其下所有内容
log/# 忽略 Dockerfile 中引用的一些文件
config.json
secrets/

四、Dockerfile 中常用的指令

指令含义
FROM 镜像指定基础镜像,用于构建新镜像的起点。
MAINTAINER 名字说明镜像的维护人信。已在Docker中弃用,建议使用LABEL代替
RUN 命令在镜像中执行命令,用于安装软件包、设置环境等操作。
CMD [ " 要运行的程序"," 参数1"," 参数2"]指定容器启动时默认要运行的命令。
EXPOSE 端口号声明容器运行时监听的端口,但并不会自动映射到宿主机的端口。
ENV 环境变量 变量值设置环境变量。
ADD 源文件/目录 目标文件/目录将文件或目录复制到容器中。
COPY 源文件/目录 目标文件/目录类似于 ADD,将文件或目录复制到容器中,但更推荐使用 COPY。
VOLUME ["目录 "]声明持久化目录,用于存储数据或与其他容器共享数据。
USER 用户名/UID指定运行容器的用户。
WORKDIR 路径设置工作目录,指定容器中命令执行的默认路径。
ONBUILD 命令定义触发器指令,在子镜像中执行。指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK用于指定容器的健康检查命令,可以检查容器内应用程序的状态。

以下是 Dockerfile 中常用的指令及其详细解释:

1、FROM

作用:指定基础镜像,用于构建新镜像的起点。
语法:FROM 镜像名称:标签 [AS <name>]
示例1:FROM python:3.9-slim
示例2:FROM ubuntu:20.04标签(可选):指定基础镜像的标签,表示特定版本。
[AS <name>](可选):为基础镜像设置一个别名,用于多阶段构建。

2、LABEL

作用:为镜像添加元数据,通常用于提供关于镜像的描述信息。
语法:LABEL <key>=<value> <key>=<value> ...
示例1:LABEL maintainer="John Doe" description="My custom image"
示例2:LABEL version="1.0" description="This is a sample Docker image"

3、RUN

作用:在镜像中执行命令,用于安装软件包、设置环境等操作。
语法:RUN <command>
示例1:RUN apt-get update && apt-get install -y python3
示例2:RUN npm install express

4、CMD

作用:容器启动时要运行的命令。
语法:
Exec 格式:CMD ["executable","param1","param2"]
Shell 格式:CMD command param1 param2
示例:
Exec 格式:CMD ["nginx", "-g", "daemon off;"]
Shell 格式:CMD nginx -g 'daemon off;'示例1:CMD ["python", "app.py"]
示例2:CMD ["npm", "start"]

5、ENTRYPOINT

ENTRYPOINT 指令用于设置容器启动时执行的默认命令。与 CMD 不同,ENTRYPOINT 指定的命令不会被 docker run 命令中指定的命令参数覆盖,而是作为容器启动时执行的固定命令。

ENTRYPOINT 可以在 Dockerfile 中以两种方式指定:Shell 格式和 Exec 格式。

Shell 格式示例:

ENTRYPOINT echo "Hello, World"

这条命令将作为 shell 命令执行,输出 “Hello, World” 并结束容器运行。

Exec 格式示例:

ENTRYPOINT ["/bin/bash", "-c", "echo Hello, World"]

这条命令以执行格式指定了一个可执行文件 “/bin/bash” 以及参数 “-c”,并最终执行了 “echo Hello, World” 命令。

在实际使用中,ENTRYPOINT 经常与 CMD 结合使用,以便提供灵活性和定制化。如果在 Dockerfile 中同时使用了 ENTRYPOINT 和 CMD,CMD 的内容会被当作 ENTRYPOINT 的参数。

作用:设置容器启动时要运行的命令。
语法:ENTRYPOINT ["executable", "param1", "param2"]
示例:ENTRYPOINT ["nginx", "-g", "daemon off;"]

6、COPY

作用:复制文件或目录到镜像中。
语法:COPY <src> <dest>
示例1:COPY app.py /app/
示例2:COPY index.html /var/www/html/index.html

7、ADD

作用:复制文件或目录到镜像中(类似于 COPY,但功能更多)。
语法:ADD <src> <dest>
示例1:ADD file.txt /app/
# 将 JDK 压缩包添加到镜像中
示例2:ADD jdk.tar.gz /usr/local/

在 Dockerfile 中,ADD 和 COPY 都用于将文件从构建上下文复制到容器中,但它们之间有一些关键区别:

COPY:
COPY 只能复制本地文件或目录到容器中,不支持 URL。
COPY 只进行简单的文件复制操作,不会对文件进行解压缩或其他处理。

总的来说,COPY 更加明确和简单,而 ADD 则具有更多功能。 在大多数情况下,如果只需要简单的文件复制操作,推荐使用 COPY。如果需要额外功能或复杂的复制需求,可以考虑使用 ADD。

8、WORKDIR

作用:设置工作目录,指定容器中命令执行的默认路径。
语法:WORKDIR /path/to/workdir
示例1:WORKDIR /usr/src/app
示例2:WORKDIR /home/node/app

9、 ENV

作用:设置环境变量。
语法:ENV <key> <value>
示例1:ENV APP_ENV=production
示例2:ENV PORT=3000

10、EXPOSE

作用:声明容器监听的端口。
语法:EXPOSE <port>
示例1:EXPOSE 80
示例2:EXPOSE 8000

11、VOLUME

作用:声明持久化目录,用于存储数据或与其他容器共享数据。
语法:VOLUME /myvolume
示例1:VOLUME /data
示例2:VOLUME ["/data"]
示例3:VOLUME ["/var/log/app"]

12、USER

作用:指定运行容器时的用户。
语法:USER <username>
示例:USER appuser

13、注释

作用:在 Dockerfile 中添加注释。
示例:# This is a comment

14、ONBUILD 命令

作用:定义触发器指令,在子镜像中执行。
语法:ONBUILD 命令
示例1:ONBUILD COPY . /app
示例2:ONBUILD RUN bundle install

15、HEALTHCHECK

作用:用于指定容器的健康检查命令,可以检查容器内应用程序的状态。
语法:HEALTHCHECK [选项] CMD 命令
示例1:HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost/ || exit 1
示例2:HEALTHCHECK --interval=5s --timeout=2s CMD wget -qO- http://localhost:8080/ || exit 1

五、Dockerfile构建镜像

1、创建Dockerfile 使用的文件 index.html

<html>
<body><h1>hello,运维魔法师!</h1><p>2024.03.11</p></body>
</html>

2、编写 Dockerfile

[root@zyl-server ~]# mkdir mynginx-app
[root@zyl-server ~]# cd mynginx-app/
[root@zyl-server mynginx-app]# 
[root@zyl-server mynginx-app]# 
[root@zyl-server mynginx-app]# vi Dockerfile
[root@zyl-server mynginx-app]# 

以下是一个简单的示例 Dockerfile,用于构建一个基于 Nginx 的镜像:

# 使用官方的 Nginx 镜像作为基础镜像
FROM nginx:latest# 将本地的 nginx.conf 文件复制到容器中的 /etc/nginx/nginx.conf
# COPY nginx.conf /etc/nginx/nginx.conf# 将本地的 index.html 文件复制到容器中的 /usr/share/nginx/html/index.html
COPY index.html /usr/share/nginx/html/index.html# 暴露 Nginx 默认的 HTTP 端口 80
EXPOSE 80# 在容器启动时自动启动 Nginx 服务
CMD ["nginx", "-g", "daemon off;"]

在这里插入图片描述

3、执行构建镜像:

docker build -t my-nginx-image .

在这里插入图片描述

4、查看当前系统中的 Docker 镜像列表

docker images

5、运行镜像

docker run -d -p 8080:80 my-nginx-image

这将会在端口 8080 上启动一个基于该镜像的 Nginx 服务器。你可以通过访问 http://localhost:8080 来查看 Nginx 默认页面。

在这里插入图片描述

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

U盘启动盘 制作Linux Ubuntu CentOS系统启动盘 系统安装

U盘启动盘 制作Linux Ubuntu CentOS系统启动盘 系统安装 准备条件 准备一个U盘&#xff0c;建议容量至少为8GB&#xff0c;以便存放系统镜像文件 一台已经安装好操作系统的计算机&#xff0c;用于制作U盘启动盘 Ubuntu和CentOS的Linux ISO镜像文件。可以从官方网站或相关资源…

【学一点RISC-V】RISC-V IMSIC

IMSIC RISC-V AIA 文档 第三章 Incoming MSI Controller (IMSIC) 传入 MSI 控制器&#xff08;IMSIC&#xff09;是一个可选的 RISC-V 硬件组件&#xff0c;与 hart 紧密相连&#xff0c;每个 hart 有一个 IMSIC。IMSIC 接收并记录 Hart 的传入消息信号中断 (MSI)&#xff0c;并…

【框架学习 | 第五篇】SpringMVC(常用注解、获取请求参数、域对象共享数据、拦截器、异常处理、上传/下载文件)

文章目录 1.SpringMVC简介1.1定义1.2主要组件1.3工作流程1.3.1简要流程1.3.2详细流程 1.4优缺点 2.常用注解3.获取请求参数3.1通过 HttpServletRequest 获取请求参数3.2通过控制器方法的形参获取请求参数3.2.1请求路径参数与方法形参一致3.2.2请求路径参数与方法形参不一致3.2.…

【附学习笔记】现在学网络安全主要是实战还是打CTF?

作为一个5年资深网络安全工程师前来分享我的看法。 在我看来&#xff0c;无论是实战还是打CTF&#xff08;Capture The Flag&#xff0c;夺旗赛&#xff09;&#xff0c;都是学习网络安全的重要方面&#xff0c;只是侧重点可能有所不同。 网络安全是一个复杂且不断发展的领域…

springboot学习(八十六) springboot使用graalvm编译native程序

一、windows环境下 1.下载graalvm的jdk https://injdk.cn/ 下载windows版本 配置java环境变量&#xff0c;配置过程略 2.下载visual Studio Build Tools 下载地址&#xff1a;https://aka.ms/vs/17/release/vs_BuildTools.exe 安装后选择组件&#xff1a; 其中windows S…

《ElementPlus 与 ElementUI 差异集合》el-form-item CSS 属性 display 有变化

差异 element-ui el-form 中&#xff0c;属性display: flex; 导致元素在一排&#xff1b;element-plus el-form 中&#xff0c;属性display: block; 元素按照自己的属性排列&#xff1b; /* element ui */ display: block;/*element plus */ display: flex;如图所示 解决方案…

深度解析:cache的基本概念原理扫盲

引流关键词:缓存,高速缓存,cache, CCI,CMN,CCI-550,CCI-500,DSU,SCU,L1,L2,L3,system cache, Non-cacheable,Cacheable, non-shareable,inner-shareable,outer-shareable, optee、ATF、TF-A、Trustzone、optee3.14、MMU、VMSA、cache、TLB、arm、armv8、armv9、TEE、安全、内存…

【BUG 弹药库】Tortoise git 绿色的勾 ✔ 和 红色的 !突然不见了该如何解决呢?

文章目录 1. 出现的问题描述如下所示&#xff1a;2. 如何解决这个问题呢 &#xff1f; 1. 出现的问题描述如下所示&#xff1a; 用 TortoiseGit 提交代码的时候&#xff0c;红色的 ! 和 绿色的 ✔ 突然消失了&#xff1b; 2. 如何解决这个问题呢 &#xff1f; ① 首先按住快…

商业模式的深度解析:以四个特点构筑成功之路

商业模式&#xff0c;是企业将产品、服务、信息流、资金流等要素组合在一起&#xff0c;形成独特价值主张&#xff0c;并通过特定的渠道和方式传递给目标市场&#xff0c;从而获取利润的一种系统性设计。一个成功的商业模式&#xff0c;往往具备四个显著特点&#xff1a;重点突…

企业微信如何接入第三方应用?

1.登录企业微信管理后台&#xff1a;https://work.weixin.qq.com/wework_admin​​​​​ 2.点击创建应用&#xff1b; ​​​​​​​ 3. 此时可以看到已经创建好的应用&#xff0c;并且生成应用的唯一id&#xff08;agentId&#xff09; 4. 第三方应用申请域名 (举例&…

智慧楼宇物联网建设实施方案(2)

建设方案 楼宇综合管理平台 智慧楼宇物联网应用综合管理系统是对整个物联网系统的集中监控和展示。其主要功能是对各应用子系统的关键监测数据进行数据格式解析并呈现。进而使管理者能够从整体上对整个物联网系统运行状态有个直观的了解。其不同于各专业子系统的管理软件,重…

flstudio教程如何设置成中文 flstudio基础教程 flstudio免费

Fl studio编曲软件总共有英文和中文两种语言供用户选择&#xff0c;对于我们来说&#xff0c;更习惯于使用中文版本的flstudio编曲软件&#xff0c;包括我自己也比较习惯于使用中文版本的flstudio&#xff0c;同时也能提高工作效率。Flstudio编曲软件默认语言是英文&#xff0c…

vue:功能【xlsx】动态行内合并

场景&#xff1a;纯前端导出excel数据&#xff0c;涉及到列合并、行合并。 注&#xff09;当前数据表头固定&#xff0c;行内数据不固定。以第一列WM为判断条件&#xff0c;相同名字的那几行数据合并单元格。合并的那几行数据&#xff0c;后面的列按需求进行合并。 注&#x…

CV论文--2024.3.13

1、Sora Generates Videos with Stunning Geometrical Consistency 中文标题:Sora 生成具有惊人几何一致性的视频。 简介&#xff1a;最近发布的 Sora 模型展示了在视频生成领域的出色表现&#xff0c;引发了人们对其模拟真实世界现象能力的激烈讨论。尽管该模型越来越受欢迎&…

如何保证Redis和数据库数据一致性

缓存可以提升性能&#xff0c;减轻数据库压力&#xff0c;在获取这部分好处的同时&#xff0c;它却带来了一些新的问题&#xff0c;缓存和数据库之间的数据一致性问题。 想必大家在工作中只要用了咱们缓存势必就会遇到过此类问题 首先我们来看看一致性&#xff1a; 强一致性…

前端实现生成图片并批量下载,下载成果物是zip包

简介 项目上有个需求&#xff0c;需要根据表单填写一些信息&#xff0c;来生成定制的二维码图片&#xff0c;并且支持批量下载二维码图片。 之前的实现方式是直接后端生成二维码图片&#xff0c;点击下载时后端直接返回一个zip包即可。但是项目经理说后端实现方式每次改个东西…

python基础——列表【创建,下标索引,常见操作方法】

&#x1f4dd;前言&#xff1a; 这篇文章主要讲解一下python中常见的数据容器之一——列表 本文主要讲解列表的创建以及我们常用的列表操作方法 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;C语言入门基础以及python入门基础 &#x1f380…

泰迪智能科技3月线上培训计划

有学习意向可到 泰迪智能科技官网 咨询了解

Visual Basic6.0零基础教学(3)—焦点概念和深入学习属性

焦点概念和深入学习属性 文章目录 焦点概念和深入学习属性前言一、什么是焦点(Focus)?焦点的特点 二、窗体属性一、窗体的结构二、窗体的属性三、事件四、方法 一.控件属性一. 标签 Label二.文本框 TextBox2.常用事件 三.命令按钮事件 总结 前言 今天我们来继续学习VB中的属性…

Java全系工程源码加密,防止反编译

一、前言 在大约2015年左右&#xff0c;由于公司产品序列逐渐增加&#xff0c;涉及到N多项目部署交付&#xff0c;为了有效防止产品被滥用&#xff0c;私自部署&#xff0c;当时技术中心决定开发一套统一的授权认证管理系统&#xff0c;对公司所有产品序列进行 License 控制。…