Docker最佳实践进阶(一):Dockerfile介绍使用

大家好,上一个系列我们使用docker安装了一系列的基础服务,但在实际开发过程中这样一个个的安装以及繁杂命令不仅仅浪费时间,更是容易遗忘,下面我们进行Docker的进阶教程,帮助我们更快速的部署和演示项目。

一、什么是Dockerfile?

Dockerfile 是一个文本文件,其中包含了一系列指令,用于自动化创建 Docker 镜像的过程。通过Dockerfile,你可以定义应用程序的环境,包括所需的软件、库和依赖项。简单的说就是把我们的安装一个基础服务的所有操作命令都编排在一个文件里,包含了拉取镜像,环境变量设置,容器启动等等一系列的操作。

二、如何使用Dockerfile?

2.1 Dockerfile文件解读

下面是一个简单的springboot项目的Dockerfile文件

# 使用官方Java运行环境作为基础镜像 
# 命令解释:如果本地没有openjdk:8-jre镜像  则会自动从远程镜像仓库拉取镜像
FROM openjdk:8-jre# 设置docker容器内jar工作目录
# docker容器内部的jar工作目录 也就是jar将部署在这个目录下 并非宿主机中的文件目录
WORKDIR /kim# 暴露docker容器内9200端口 
EXPOSE 9200# 设置容器时区
ENV TZ=Asia/Shanghai# 将你的jar包添加到容器中 将打包好的jar添加到容器中去  
ADD kingoffice-auth.jar /kim/kingoffice-auth.jar# 声明日志卷,容器内应用生成的日志将被存储在这个位置
VOLUME /kim/logs# 设置容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "/kim/kingoffice-auth.jar"]
2.2 构建镜像

下面执行 docker build 命令,运行脚本文件,构建镜像,注意请在Dockerfile同级目录下执行命令。

# 注意后面有一个"点"
docker build -t kingoffice-auth:1.0.0 .			
  • docker build:这是 Docker 的构建命令,用于根据 Dockerfile 中的指令创建 Docker 镜像
  • -t kingoffice-auth:1.0.0 :指定构建的镜像的名称为kingoffice-auth,同时设置版本标签为 1.0.0
  • . :这个参数指定了 Dockerfile 所在的路径,. 表示当前目录。Docker 会在当前目录下寻找名为 Dockerfile 的文件,并根据其中的指令构建镜像,也可不使用 . 可以使用绝对路径读取Dockerfile文件,此处不再赘述。

构建完成后可以在本地看到构建好的镜像文件。
在这里插入图片描述

2.3运行镜像
docker run -d -p 9200:9200 --restart=always -v /kim/logs/gateway:/kim/logs kingoffice-auth
  • -d :表示后台运行
  • -p :表示端口映射(宿主机端口:容器端口)
  • --restart=always :容器停止后自动重启
  • -v:挂载目录映射(宿主机目录:容器目录),将日志文件夹映射到主机上,方便查看日志。

通过 docker ps 命令,可以查看容器已经运行:
在这里插入图片描述

三、Dockerfile 常用命令

1. FROM

指明构建的新镜像是基于哪个基础镜像,如果没有选择 tag,那么默认值为 latest。

  • 语法:FROM <image>:<tag>
  • 示例:FROM openjdk:8-jre
2. LABEL

向镜像添加元数据,提供关于镜像的描述信息。

  • 语法:LABEL <key>=<value> <key>=<value> ...
  • 示例:LABEL version="1.0" description="My custom Docker image"
3. RUN

在构建镜像时执行命令。

  • Shell形式语法:RUN <command>
  • Exec形式语法:RUN ["apt", "update", "&&", "apt", "install", "-y", "vim"]
4. COPY

拷贝文件或目录到镜像中。

  • 语法:COPY <src> <dest>
  • 示例:COPY hello-springboot-0.0.1-SNAPSHOT.jar app.jar
5. ADD

类似于COPY,支持更多功能,如下载URL并解压缩。

  • 语法:ADD <src> <dest>
  • 示例:ADD https://example.com/file.tar.gz /tmp/
6. WORKDIR

设置工作目录,后续命令在该目录下执行。

  • 语法:WORKDIR /path/to/directory
7. ENV

在构建镜像过程中设置环境变量,这些环境变量是一直存在于镜像中的。

  • 语法:ENV key valueENV key1=value1 key2=value2

举例:

# 设置一个名为 "WORK_HOME" 的环境变量
ENV WORK_HOME /kim# 引用WORK_HOME环境变量
WORKDIR $WORK_HOME

如果在 Dockerfile 中使用 ENV 指令设置了环境变量,那么在使用 docker run 命令的时候,可以使用 -e 参数覆盖 Dockerfile 中设置的值。这在需要动态配置容器时非常有用,比如根据运行时的条件来设置不同的环境变量值。

8. ARG

ARG 命令与 ENV 命令作用一样,和 ENV 命令不同的是:这些变量只在构建过程中有效,构建完成后不会被保留在最终的镜像中。

语法:ARG key[=value]

  • name :参数的名称。
  • default_value :参数的默认值,可以缺省。

构建过程中,ARG 定义的参数可以用于在 Dockerfile 中的各个指令中,并在 docker build 命令中被覆盖。它对于在构建时动态地传递参数非常有用。

举例:

# 定义构建参数  
ARG VERSION=latest  
ARG BUILD_DATE  # 使用构建参数设置环境变量  
ENV APP_VERSION=$VERSION  
ENV BUILD_DATE=$BUILD_DATE 

在构建的时候,可以通过 --build-arg 传递参数:

# 可以传递多个参数
docker build --build-arg VERSION=1.0.0 --build-arg BUILD_DATE=$(date) -t my-image .
9. EXPOSE

EXPOSE 命令的作用就是对外暴漏端口。但是并不是打开端口,而是声明,实际还是在运行 docker run 命令的时候,通过 -p 参数指定。

  • 语法:EXPOSE <port>EXPOSE <port> [<port>/<protocol>]
  • 示例:EXPOSE 80
10. CMD

CMD 命令用于为容器指定默认的执行命令或应用程序。当容器启动时,这个命令将被执行,可以用来启动容器中的应用程序。
前面的 RUN 命令是在构建镜像的时候执行,也就是执行 docker build 命令的时候执行;而 CMD 命令是启动容器的时候执行,也就是执行 docker run 命令的时候执行。
查看官方的 Tomcat 镜像的 Dockerfile,可以看到最后一行脚本是:

CMD ["catalina.sh", "run"]

1

catalina.sh run 命令也就是启动 Tomcat 的命令。如果没有这行命令,在使用 docker run 命令启动 Tomcat 容器的时候,容器是启动起来了,但是容器中的 Tomcat 没有被启动。所以 CMD 命令可以用来启动容器中的应用程序的。
如果在 Dockerfile 中存在多个 CMD 命令,只有最后一个会生效。
CMD 命令的语法和 RUN 命令相似,也支持 ShellExec 两种格式:

# Shell格式
CMD <command># Exec格式
CMD ["参数1", "参数2", ...]

需要注意:CMD中定义的命令会被 docker run 之后的参数替换

什么意思呢?看下面的指令:

docker run -it -p 8080 tomcat /bin/bash

上面的 /bin/bash 就是 docker run 之后的参数,会替换掉 Tomcat Dockerfile文件中的 CMD ["catalina.sh", "run"] 命令中的参数,导致容器启动了,但是 Tomcat 没有被启动,所以一定要注意。

11. VOLUME
  • 作用:做匿名挂载,在启动容器时忘记挂载数据卷时会自动挂载到匿名卷。

  • 语法:

    • VOLUME <path>
    • VOLUME <path1> <path2>
    • VOLUME ["<path1>", "<path2>", ...]

例如:

FROM openjdk:8-jre
VOLUME /data
VOLUME /config

在运行容器时,你可以使用 -v 选项来将宿主机上的目录挂载到 VOLUME 声明的目录上。例如:

docker run -v /kim/data:/data -v /kim/config:/config my-image

这样宿主机上的/kim/data目录就挂载到了 容器内/data目录下。

四、虚悬镜像

虙悬镜像(Dangling Image)是指镜像名称和标签均为 <none> 的镜像。这些镜像通常出现在构建过程中出现问题、取消构建或其他异常情况下。由于这些镜像没有有效的名称和标签,它们被视为“悬浮”在Docker中,没有被任何容器所使用,也不会被Docker清理工具自动删除。
虙悬镜像的产生概率并不高,但一旦出现,可能会对系统造成一些潜在的风险和占用存储空间。因此,及时发现并删除虙悬镜像是很重要的。
查看虚悬镜像

docker image ls -f dangling=true

删除虚悬镜像

docker image prune --filter "dangling=true"

虚悬镜像会占用磁盘空间,并可能对系统造成潜在风险,因此建议及时查看和删除虚悬镜像。

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

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

相关文章

力扣面试经典算法150题:找出字符串中第一个匹配项的下标

找出字符串中第一个匹配项的下标 今天的题目是力扣面试经典150题中的数组的简单题: 找出字符串中第一个匹配项的下标 题目链接&#xff1a;https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/?envTypestudy-plan-v2&envIdto…

docker compose部署rabbitmq集群,并使用haproxy负载均衡

一、创建rabbitmq的data目录 mkdir data mkdir data/rabbit1 mkdir data/rabbit2 mkdir data/rabbit3 二、创建.erlang.cookie文件&#xff08;集群cookie用&#xff09; echo "secretcookie" > .erlang.cookie 三、创建haproxy.cfg配置文件 global log stdout fo…

深度学习基础—正则化

正则化&#xff1a;解决模型过拟合的手段&#xff0c;本质就是减小模型参数取值&#xff0c;从而使模型更简单。常用范数如下&#xff1a; 使用最多的是L2范数正则项&#xff0c;因此加入正则项的损失函数变为&#xff1a; 使用梯度下降法的权重调整公式&#xff1a; 推导后得到…

项目实战:Qt+Opencv相机标定工具v1.3.0(支持打开摄像头、视频文件和网络地址,支持标定过程查看、删除和动态评价误差率,支持追加标定等等)

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/141334834 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、Op…

二十二、状态模式

文章目录 1 基本介绍2 案例2.1 Season 接口2.2 Spring 类2.3 Summer 类2.4 Autumn 类2.5 Winter 类2.6 Person 类2.7 Client 类2.8 Client 类的运行结果2.9 总结 3 各角色之间的关系3.1 角色3.1.1 State ( 状态 )3.1.2 ConcreteState ( 具体的状态 )3.1.3 Context ( 上下文 )3.…

Airtest 的使用

Airtest 介绍 Airtest Project 是网易游戏推出的一款自动化测试框架&#xff0c;其项目由以下几个部分构成 Airtest : 一个跨平台的&#xff0c;基于图像识别的 UI 自动化测试框架&#xff0c;适用于游戏和 App &#xff0c; 支持 Windows, Android 和 iOS 平台&#xff0c…

解决银河麒麟V10登录循环的方法

解决银河麒麟V10登录循环的方法 一&#xff1a;进入命令行二&#xff1a;删除.Xauthority文件三&#xff1a;重启系统 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在使用银河麒麟桌面操作系统V10时&#xff0c;有时可能会遇到一个令人头…

【题解】—— LeetCode一周小结32

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结31 5.不含连续1的非负整数 题目链接&#xff1a;600. 不含连续…

redis列表若干记录

2、列表 ziplist ziplist参数 entry结构 entry-data:节点存储的元素prelen&#xff1a;记录前驱节点长度encoding&#xff1a;当前节点编码格式encoding encoding属性 使用多个子节点存储节点元素长度&#xff0c;这种多字节数据存储在计算机内存中或者进行网络传输的时的字节…

小型超声波清洗机哪个品牌好用?小型超声波清洗机排名前四

第一次见识到超声波清洗机的神奇是在几年前&#xff0c;当时我去眼镜店配眼镜。等待的过程中&#xff0c;店员把旧的眼镜拿去清洁了&#xff0c;30秒&#xff0c;我就看到了到小污渍和油污被震出来了&#xff0c;感觉特别神奇。几分钟后&#xff0c;清洁完毕&#xff0c;擦干镜…

3个常用zip压缩包文件打来密码删除方法

ZIP压缩包作为一种广泛使用的文件压缩格式&#xff0c;常常用于节省存储空间或便于文件传输。一般情况下为保护文件数据的安全我们会给zip压缩文件设置密码安全保护&#xff0c;但如果后续不需要密码保护了&#xff0c;如何删除密码呢&#xff1f;下面小编给大家介绍三种常用的…

java 函数接口Consumer简介与示例【函数式编程】【Stream】

Java 8 中的 消费者接口Consumer 是一个函数接口&#xff0c;它可以接受一个泛型 类型参数&#xff0c;它属于java.util.function包。 accept(T) 方法&#xff1a;是 Consumer 函数式接口的方法&#xff0c;传入单个输入参数&#xff0c;无返回值&#xff0c;可以用于 Lambda 表…

电脑监控软件有哪些,哪款更好用?一网打尽!电脑监控软件大搜罗,总有一款适合你!

甲&#xff1a;哎&#xff0c;您听说了吗&#xff1f;这年头&#xff0c;电脑监控软件那是五花八门&#xff0c;跟变戏法似的&#xff01; 乙&#xff1a;哦&#xff1f;怎么个五花八门法&#xff1f; 甲&#xff1a;嘿&#xff0c;您还别说&#xff0c;从实时监控到网络追踪…

最佳实践:敏捷需求管理——如何写好用户故事丨IDCF

丁仿&#xff0c;圣略咨询首席敏捷教练&#xff0c;研发效能&#xff08;DevOps&#xff09;工程师&#xff08;中级&#xff09;课程学员 在敏捷项目管理中&#xff0c;用户故事&#xff08;User Stories&#xff09;是需求管理的核心工具。本篇文章将从用户故事的基本概念、编…

复习之 java 锁

裁员在家&#xff0c;没有面试机会&#xff0c;整理整理面试知识点吧&#xff01; 不得不知道的java 锁 Java 中&#xff0c;提供了两种方式来实现同步互斥访问&#xff08;也就是锁&#xff09;&#xff1a;synchronized 和 Lock 多线程编程中&#xff0c;有可能会出现多个线…

期权中非常重要的行权!不懂行权先别交易!

今天带你了解期权中非常重要的行权&#xff01;不懂行权先别交易&#xff01;期权是金融市场中一种常见的衍生品工具&#xff0c;它给予持有者在特定时间内以特定价格购买或出售某个资产的权利。而“行权”是指期权持有者行使期权权利的行为。 期权行权是指期权持有者选择执行…

超网和无类间路由是什么?

​一、超网概述 超网是将多个连续的网络地址组合成一个增加的网络地址的技术。常用于减少路由器的路由表大小&#xff0c;网络的可扩展性。通过合并连续的子网&#xff0c;超网可以减少路由入侵的数量&#xff0c;从而提高网络的效率。 超网的实现基于合并多个具有连续IP地址…

java知识点详解——异常

当输入的数不是整数时 会报错 当输入的被除数为0时 会报错 在以前我们会使用if—else语句用来堵住漏洞&#xff0c;但是那样相当繁琐&#xff0c;很难穷举所有错误 Scanner in new Scanner(System.in); System.out.print("请输入被除数:"); int num1 in.nextInt(…

【Python快速入门和实践016】Python常用脚本-对视频抽取指定帧数并保存

一、功能介绍 这段代码的功能是从一个视频文件中抽取指定数量的帧&#xff0c;并将这些帧保存为图像文件。步骤如下&#xff1a; 设置路径和参数&#xff1a; video_path&#xff1a;视频文件的路径。image_folder&#xff1a;保存抽取图像的目录。num_frames_to_extract&#…

工业相机图像采集卡

什么是图像采集卡&#xff1f; 图像采集卡又称为图像卡&#xff0c;它将相机的图像视频信号&#xff0c;以帧为单位传送到计算机的内存和VGA帧存&#xff0c;供计算机处理&#xff0c;存储&#xff0c;显示和传输等使用。在机器视觉系统中&#xff0c;图像采集卡采集到的图像供…