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.rhkb.cn/news/275869.html

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

相关文章

ssm蛋糕甜品商城系统(程序+文档+数据库)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

电玩城游戏大厅计时软件怎么用,佳易王计时计费管理系统软件定时语音提醒操作教程

电玩城游戏大厅计时软件怎么用&#xff0c;佳易王计时计费管理系统软件定时语音提醒操作教程 一、前言 以下软件操作教程以 佳易王电玩计时计费软件V18.0为例 说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、软件计时计费&#xff0c;只需点击开…

26 网络中的网络 NiN 【李沐动手学深度学习v2课程笔记】

LeNet、AlexNet和VGG都有一个共同的设计模式&#xff1a;通过一系列的卷积层与汇聚层来提取空间结构特征&#xff1b;然后通过全连接层对特征的表征进行处理。 AlexNet和VGG对LeNet的改进主要在于如何扩大和加深这两个模块。 或者&#xff0c;可以想象在这个过程的早期使用全连…

电脑远程桌面选项变成灰色没办法勾选怎么办?

有些人在使用Windows系统自带的远程桌面工具时&#xff0c;会发现系统属性远程桌面选项卡中勾选启用“允许远程连接到此计算机”。 导致此问题出现的原因主要是由于组策略或者注册表设置错误造成的。 修复远程桌面选项变灰的两种方法&#xff01; 方法一&#xff1a;设置本地组…

Java初阶数据结构队列的实现

1.队列的概念 1.队列就是相当于排队打饭 2.在排队的时候就有一个队头一个队尾。 3.从队尾进对头出 4.所以他的特点就是先进先出 所以我们可以用链表来实现 单链表实现要队尾进队头出{要有last 尾插头删} 双向链表实现效率高&#xff1a;不管从哪个地方当作队列都是可以的&…

ElasticSearch深度分页问题如何解决

文章目录 概述解决方法深度分页方式from size深度分页之scrollsearch_after 三种分页方式比较 概述 Elasticsearch 的深度分页问题是指在大数据集上进行大量分页查询时可能导致的性能下降和资源消耗增加的情况。这种情况通常发生在需要访问大量数据的情形下&#xff0c;比如用…

算法空间复杂度计算

目录 空间复杂度定义 影响空间复杂度的因素 算法在运行过程中临时占用的存储空间讲解 例子 斐波那契数列递归算法的性能分析 二分法&#xff08;递归实现&#xff09;的性能分析 空间复杂度定义 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大…

PHP序列化基础知识储备

一、序列化与反序列化 1、概念 PHP中的序列化是指将复杂的数据类型转换为可存储或可传输的字符串&#xff0c;而反序列化则是将这些字符串重新转换回原来的数据类型。 序列化通常使用 serialize() 函数完成&#xff0c;它可以将数组、对象、字符串等复杂数据类型压缩到一个字…

uniapp发行H5获取当前页面query

阅读uni的文档大致可得通过 onLoad与 onShow()的形参都能获取页面传递的参数&#xff0c;例如在开发时鼠标移动到方法上可以看到此方法的简短介绍 实际这里说的是打开当前页面的参数&#xff0c;在小程序端的时候测试并无问题&#xff0c;但是发行到H5时首页加载会造成参数获取…

vscode setting.json 全局设置 工作区设置 位置 优先级

vscode中setting.json有两种配置权限 一、全局配置&#xff1a;setting.json文件位于C:\Users\Administrator\AppData\Roaming\Code\User\settings.json 二、工作区配置&#xff1a;setting.json文件位于工作区的.vscode\settings.json 当两种配置同时存在时&#xff0c;工作区…

什么是测试自动化平台?为什么需要测试自动化平台?如何选择平台

什么是测试自动化平台&#xff1f; 测试自动化平台是一种软件工具或框架&#xff0c;可帮助软件开发团队实现测试流程的自动化。它集成了多种功能和工具&#xff0c;使测试人员能够更高效地进行测试计划、用例设计、测试执行和结果分析。 为什么需要测试自动化平台&#xff1f…

qiankun:vite/webpack项目配置

相关博文&#xff1a; https://juejin.cn/post/7216536069285429285?searchId202403091501088BACFF113F980BA3B5F3 https://www.bilibili.com/video/BV12T411q7dq/?spm_id_from333.337.search-card.all.click qiankun结构&#xff1a; 主应用base&#xff1a;vue3historyv…

Python环境搭建 -- Python与PyCharm安装

一、Python安装 我们先找到Python的官方网站&#xff0c;在浏览器中搜索Python即可&#xff0c;然后进入Python官网 点击Downloads&#xff0c;选择对应匹配的操作系统 点进去之后&#xff0c;Python的版本分为稳定的版本和前置版本&#xff0c;前置的版本就是还没有发行的版本…

爬虫练习:获取某网站的房价信息

一、相关网站 二、相关代码 import requests from lxml import etree import csv with open(房天下数据.csv, w, newline, encodingutf-8) as csvfile:fieldnames [名称, 地点,价格,总价,联系电话]writer csv.DictWriter(csvfile, fieldnamesfieldnames)writer.writeheader…

力扣串题:字符串中的第二大数字

此题的精妙之处在于char类型到int类型的转化&#xff0c;需要运算来解决 int secondHighest(char * s) {int max1-1;int max2-1;int szstrlen(s);int i 0 ;for(i0;i<sz;i){if(s[i]>0&&s[i]<9){if((s[i]-0)>max1){max2max1;max1s[i]-0;}else if((s[i]-0)&l…

西井科技参与IATA全球货运大会 以AI绿动能引领智慧空港新未来

3月12日至14日&#xff0c;由国际航空运输协会IATA主办的全球货运大会&#xff08;World Cargo Symposium&#xff09;在中国香港成功举办&#xff0c;这是全球航空货运领域最大规模与影响力的年度盛会。作为大物流领域全球领先的“智能化与新能源化”综合解决方案提供商&#…

NLP:HanLP的下载与使用

昨天说到要做一个自定义的训练模型&#xff0c;但是很快这个想法就被扑灭了&#xff0c;因为这个手工标记的成本太大&#xff0c;而且我的上级并不是想要我做这个场景&#xff0c;而是希望我通过这个场景展示出可以接下最终需求的能力。换句话来说&#xff1a;可以&#xff0c;…

C语言之文件操作(万字详解)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 目录 前言 文件的打开和关闭 流和标准流 文件指针 文件的打开和关闭 文件的顺序读写 顺序读写函数介绍 fputc的使用 fgetc的使用 fput…

嵌入式常用5种通信协议

简介&#xff1a; 嵌入式常用五种通信协议为&#xff1a;UART、RS232、RS485、IIC、SPI。 由于这几种通信协议十分相似又有区别&#xff0c;所以分组记忆&#xff0c;红色的为一组&#xff0c;蓝色的为一组。 ①组都有两条线&#xff0c;且都是异步通信没得时钟线&#xff0c…

C#快速入门基础

本篇文章从最基础的C#编程开始学习&#xff0c;经过非常优秀的面向对象编程思想和方法的学习&#xff0c;为C#编程打下基础。 第 01 章 C#开发环境之VS使用和.NET平台基础 1.1 Visual Studio 开发环境 1.1.1 硬件环境 i5CPUi5CPU&#xff08;建议 4核 4线程或以上 &#xff0…