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/273499.html

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

相关文章

Java面试题之JVM

JVM整体架构 堆 minor gc&#xff1a;回收年轻代的垃圾对象 full GC&#xff1a;回收整个堆的垃圾对象 当full GC也回收不了就会OOM STW运行时会停掉所有用户线程 JVM调优的真正目的就是为了减少STW的次数 为什么会有STW&#xff1a;避免非垃圾对象发生变化&#xff0c;暂…

【深度学习笔记】优化算法——Adam算法

Adam算法 &#x1f3f7;sec_adam 本章我们已经学习了许多有效优化的技术。 在本节讨论之前&#xff0c;我们先详细回顾一下这些技术&#xff1a; 在 :numref:sec_sgd中&#xff0c;我们学习了&#xff1a;随机梯度下降在解决优化问题时比梯度下降更有效。在 :numref:sec_min…

Linux-socket套接字

前言 在当今数字化时代&#xff0c;网络通信作为连接世界的桥梁&#xff0c;成为计算机科学领域中至关重要的一部分。理解网络编程是每一位程序员必备的技能之一&#xff0c;而掌握套接字编程则是深入了解网络通信的关键。本博客将深入讨论套接字编程中的基本概念、常见API以及…

GitOps实践之Argo CD (2)

argocd 【-1】argocd可以解决什么问题? helm 部署是手动的?依赖流水线。而有时候仅仅更新一个小东西,流水线跑好久,CD真的不应该和CI耦合。不同环境的helm配置不同,手动修改问题多,可以用git管理起来,例如分不同环境用目录区分。argocd创建应用可以不通环境部署到不同集…

Langchain-Chatchat本地搭建ChatGLM3模型和提取PDF内容

文章目录 1、软件要求2、安装CUDA2.1、安装gcc2.2、安装CUDA 3、安装Anaconda33.1、下载Anaconda33.2、创建python虚拟环境 4、部署系统4.1、下载源码4.2、安装依赖4.3、下载模型4.4、初始化配置和知识库4.4.1、初始化配置4.4.2、初始化知识库 4.5、运行4.6、运行4.6.1、启动4.…

C语言编译成库文件的要求

keil编译成库文件 在Keil中&#xff0c;将C语言源文件编译成库文件通常需要进行以下步骤&#xff1a; 创建一个新的Keil项目&#xff0c;并将所需的C语言源文件添加到该项目中。 在项目设置中配置编译选项&#xff0c;确保生成的目标文件符合库文件的标准格式。 编译项目&…

基于PHP的餐厅管理系统APP设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 MVC 3 1.2 ThinkPHP 3 1.3 MySQL数据库 3 1.4 uni-app 4 1.5 本章小结 4 2 系统分析 5 2.1 功能需求 5 2.2 用例分析 7 2.3 非功能需求 8 2.4 本章小结 8 3 系统设计 9 3.1 系统总体设计 9 3.2 系统详细设计 10 3.3 本章小…

基于Java+springboot+VUE+redis实现的前后端分类版网上商城项目

基于Java springbootVUEredis实现的前后端分类版网上商城项目 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言…

Ajax、Axios、Vue、Element与其案例

目录 一.Ajax 二.Axios 三.Vue 四.Element 五.增删改查案例 一.依赖&#xff1a;数据库&#xff0c;mybatis&#xff0c;servlet&#xff0c;json-对象转换器 二.资源&#xff1a;elementvueaxios 三.pojo 四.mapper.xml与mapper接口 五.service 六.servlet 七.html页…

css flex 布局换行

默认使用display: flex;是不换行的&#xff0c;只需要加上flex-wrap: wrap;就行了&#xff0c;效果图 .app-center {display: flex;flex-wrap: wrap;justify-content:flex-start; } 通过上面我们发现虽然时间换行了&#xff0c;但是每行的边距不一样 加上这个就行了&#xff…

微信小程序-分包

分包 1.什么是分包 分包指的是把一个完整的小程序项目&#xff0c;按照需求划分为不同的子包&#xff0c;在构建时打包成不同的分包&#xff0c;用户在使用时按需进行加载。 2.分包的好处 对小程序进行分包的好处主要有以下两点&#xff1a; 可以优化小程序首次启动的下载时间…

二维码图案样式怎么改?二维码改样式的简单方法

怎么修改二维码图案的样式呢&#xff1f;一般情况下生成的二维码图案大多是黑白的普通样式&#xff0c;那么很多人会为了提高展现效果或者增加辨识度&#xff0c;需要修改二维码的图案样式、添加logo、文字等其他内容&#xff0c;那么面对这样的需求该如何解决呢&#xff1f;下…

docker学习(十四)docker搭建私服

docker私服搭建&#xff0c;配置域名访问&#xff0c;设置访问密码 启动registry docker run -d \-p 5000:5000 \-v /opt/data/registry:/var/lib/registry \registrydocker pull hello-world docker tag hello-world 127.0.0.1:5000/hello-world docker push 127.0.0.1:5000…

SQL中如何添加数据

SQL中如何添加数据 一、SQL中如何添加数据&#xff08;方法汇总&#xff09;二、SQL中如何添加数据&#xff08;方法详细解说&#xff09;1. 使用SQL脚本&#xff08;推荐&#xff09;1.1 在表中插入1.1.1 **第一种形式**1.1.2 **第二种形式**SQL INSERT INTO 语法示例SQL INSE…

Keepalived+LVS构建高可用集群

目录 一、Keepalive基础介绍 1. Keepalive与VRRP 2. VRRP相关技术 3. 工作原理 4. 模块 5. 架构 6. 安装 7. Keepalived 相关文件 7.1 配置组成 7.2 全局配置 7.3 VRRP实例配置&#xff08;lvs调度器&#xff09; 7.4 虚拟服务器与真实服务器配置 二、Keepalived…

IDEA管理Git + Gitee 常用操作

文章目录 IDEA管理Git Gitee 常用操作1.Gitee创建代码仓库1.创建仓库1.点击新建仓库2.完成仓库信息填写3.创建成功4.管理菜单可以修改这个项目的设置 2.设置SSH公钥免密登录基本介绍1.找到.ssh目录2.执行指令 ssh-keygen3.将公钥信息添加到码云账户1.点击设置2.ssh公钥3.复制.…

软件开发服务合同套用模板

一、合作方式 二、合同标的 三、开发进度及软件成果交付 四、开发费用 五、付款结算方式 六、知识产权条款 七、双方的权利和义务 八、验收 九、售后服务支持 十、培训 十一、保密责任 十二、不可抗力 十三、争议的解决 十四、其它事项 软件开发全套资料获取下载…

python之海龟绘图

海龟绘图&#xff08;turtle&#xff09;是一个Python内置的绘图库&#xff0c;也被称为“Turtle Graphics”或简称“Turtles”。它采用了一种有趣的绘图方式&#xff0c;模拟一只小海龟在屏幕上爬行&#xff0c;而小海龟爬行的路径就形成了绘制的图形。这种绘图方式最初源自20…

elasticsearch篇:RestClient操作

1. RestClient ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给ES。官方文档地址&#xff1a;Elasticsearch Clients | Elastic 其中的Java Rest Client又包括两种&#xff1a; Java Low Level Res…

Microsoft SQL Server 编写汉字转拼音函数

目录 应用场景 举例 函数实现 小结 应用场景 在搜索应用中&#xff0c;我们一般会提供一个搜索框&#xff0c;输入关健字&#xff0c;点击查询按钮以获取结果数据。大部分情况我们会提供模糊查询的形式以在一个或多个字段进行搜索以获取结果。这样可以简化用户的操作&…