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

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

相关文章

【初阶数据结构】通讯录项目(可用作课程设计)

文章目录 概述1. 通讯录的效果2. SeqList.h3. Contact.h4. SeqList.c5. Contact.c6. test.c 概述 通讯录项目是基于顺序表这个数据结构来实现的。如果说数组是苍蝇小馆&#xff0c;顺序表是米其林的话&#xff0c;那么通讯录就是国宴。 换句话说&#xff0c;通讯录就是顺序表…

个人可识别信息(PII) AI 去除 API 数据接口

个人可识别信息(PII) AI 去除 API 数据接口 ai / 隐私保护 基于 AI 模型自动去除个人识别信息&#xff08;PII&#xff09; 个人信息保护 / AI 模型 。 1. 产品功能 基于自有专业模型进行 PII 自动去除高效处理敏感信息全接口支持 HTTPS&#xff08;TLS v1.0 / v1.1 / v1.2 /…

【剑指 offer】镜像二叉树

目 录 描述&#xff1a; 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像 思路&#xff1a; 仔细观察可以发现&#xff0c;所谓的二叉树镜像本质是自顶向下(or自底向上)进行左右子树交换的过程 public class Solution {public void Mirror(TreeNode root) {if(root nu…

音视频开发继续学习

RGA模块 RGA模块定义 RGA模块是RV1126用于2D图像的裁剪、缩放、旋转、镜像、图片叠加等格式转换的模块。比方说&#xff1a;要把一个原分辨率1920 * 1080的视频压缩成1280 * 720的视频&#xff0c;此时就要用到RGA模块了。 RGA模块结构体定义 RGA区域属性结构体 imgType&am…

LeetCode-3148. 矩阵中的最大得分

本人算法萌新,为秋招找工作开始磨炼算法,算法题均用python实现,如果我有哪些地方做的有问题的,还请大家不吝赐教. 1.题干 给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格&#xff08;不必相邻&…

提高办公效率,四款语音转文字工具推荐!

无论是在会议记录、采访速记还是日常笔记中&#xff0c;语音转文字技术都展现出了其独特的价值。接下来是就为大家推荐几款市面上广受好评的语音转文字工具&#xff01; 365在线转文字 链接&#xff1a;https://www.pdf365.cn/ 365在线转文字是一款非常实用的在线语音转文字…

【Unity/网络】Unity和内网穿透的网络测试 —— 以聊天室为例

这两天在做那个CodeMonky的胡闹厨房的案例&#xff0c;一直困扰我的是关于Lobby和Relay的相关网络服务&#xff0c;需要挂加速器并且延迟不低&#xff0c;所以我一直在寻找一些其他替代方案&#xff0c;想起来之前做一个UEC的网络枪战时做过一个内网穿透的方法&#xff0c;所以…

机械行业数字化生产供应链产品解决方案(十二)

我们为机械行业提供的数字化生产供应链解决方案通过集成物联网、人工智能和大数据技术&#xff0c;打造了一套智能化的生产和供应链管理系统&#xff0c;实现了从设计、生产到物流的全程数字化、智能化。该系统通过实时数据采集与分析&#xff0c;优化生产计划和资源配置&#…

前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第二篇:项目登录功能的实现

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

怎么等比例调整图片尺寸大小?调整图片尺寸的8个方法

在数字时代&#xff0c;图片已成为我们日常生活与工作中不可或缺的一部分。从社交媒体分享到专业设计项目&#xff0c;图片的质量和外观直接影响着信息的传达与接收。因此&#xff0c;在处理图片时&#xff0c;保持其原始的纵横比&#xff0c;即等比例调整图片尺寸&#xff0c;…

梅丽尔·斯特里普表演艺术家中心对外开放并恢复线下活动 体现了她的“卓越”

梅丽尔斯特里普表演艺术家中心对外开放并恢复线下活动 体现了她的“卓越” 2024-08-14 20:38 发布于&#xff1a;河北省 该中心将为美国演员工会和美国电视广播艺人协会的艺术家提供资源和机会&#xff0c;而且全部免费 同时命名的还有汤姆汉克斯和丽塔威尔逊放映室、妮可…

PHP 无参数RCE总结

在这篇文章中&#xff0c;我总结了在参与CTF比赛过程中积累的关于PHP无参数远程代码执行&#xff08;RCE&#xff09;的经验。由于一直以来时间有限&#xff0c;今天终于有机会整理这些知识点。 可能用到的函数&#xff08;PHP的内置函数&#xff09; localeconv() 函数返回一…

安美数字酒店宽带运营系统 weather.php 任意文件读取漏洞复现

0x01 产品简介 HiBOS酒店宽带运营系统是由安美世纪(北京)科技有限公司开发的一套专为酒店设计的宽带管理系统。该系统旨在提升酒店宽带服务的运营效率和安全性&#xff0c;为酒店客人提供稳定、高速、便捷的上网体验。 0x02 漏洞概述 安美数字酒店宽带运营系统 weather.php …

Ansible自动化运维中剧本角色(roles)来完成apache服务操作

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; Ansible…

Kafka服务端日志详解

文章目录 服务端日志Topic消息存储方式主体介绍log文件追加记录消息index和timeindex索引文件 日志文件清理Kafka的文件高效读写机制Kafka的文件结构顺序写磁盘零拷贝 合理配置刷盘频率客户端消费进度管理 服务端日志 Kafka的日志信息是通过conf/server.properties文件中的log…

互联网红利消退,AI 大模型接棒新红利

在科技发展的浪潮中&#xff0c;互联网曾经是推动经济增长和社会变革的强大引擎&#xff0c;为无数企业和个人带来了巨大的红利。然而&#xff0c;随着时间的推移&#xff0c;互联网红利似乎正在逐渐消退&#xff0c;而与此同时&#xff0c;AI 大模型正以其强大的创新能力和广泛…

搜索旋转排序数组

搜索旋转排序数组 没思路。 看了下全网的思路,一个个来o&#xff0c;多做点题就知道了二分不仅仅只能用在有序的数组中。 这道题很关键的一个值就是nums[0]。 法一&#xff1a;先用二分找到旋转点&#xff0c;旋转点两边都是的&#xff0c;判断要搜索的值在哪边&#xff0c;…

玩转haproxy --花十分钟看看,全是干货

Haproxy是一款开源集群软件&#xff08;在上一篇文章中提到过集群的相关知识&#xff0c;往期点击http://t.csdnimg.cn/qWtQG&#xff09;是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的&#xff0c;是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器 …

Linux Day1 系统编程和文件操作

系统编程内容 文件I/O (输入/输出): 1&#xff09;使用标准库函数如fopen, fclose, fread, fwrite, fgetc, fputc, fgets, fprintf, fscanf等进行文件操作。 2&#xff09;使用open, close, read, write等系统调用来实现底层文件操作。 进程管理: 1&#xff09;使用fork, e…

安卓用户专属福利:OfficeSuite中文高级版,让你的工作更轻松!

OfficeSuite – 世界顶级移动办公软件&#xff01;Google Play商店下载最多的办公软件应用&#xff0c;迄今为止&#xff0c;智能手机平台上&#xff0c;功能最强大、兼容性最好的移动Office办公套件。创建&#xff0c;查看和编辑Word&#xff0c;Excel和PowerPoint文档&#x…