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

news2024/9/23 19:15:34

大家好,上一个系列我们使用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.coloradmin.cn/o/2041679.html

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

相关文章

免费抠图项目

零元部署一个产品落地页 最近花了点时间&#xff0c;为我之前写的AI抠图项目&#xff0c;写了个产品落地页&#xff0c;效果如下。 项目使用tailwindcss和vue3实现&#xff0c;支持主题切换、中英文切换等功能。 更多功能可以点击Matting Website查看。 部署这个页面几乎是0元…

Linux文件系统之RAID

文章目录 1、前言2、RAID特性简述3、RAID实现方式4、RAID级别①RAID-0②RAID-1③RAID-5④RAID-6⑤RAID-10和RAID-01 1、前言 RAID全称Redundant Arrays of Inexpensive Disks / Redundant Arrays of Independent Disks&#xff0c;即独立冗余磁盘阵列。RAID可以通过相关技术&a…

纷享销客CRM AI产品架构概览、产品特色

一、纷享销客CRM AI产品架构概览 纷享AI平台架构分为三个主要层次&#xff1a;AI基础设施层、AI平台层和AI应用层。每个层次都由一系列功能模块组成&#xff0c;旨在为客户提供强大的技术支持和灵活的解决方案。 1.Al基础设施层 AI基础设施层是整个AI平台的底层支撑&#xff…

Spark MLlib 特征工程(上)

文章目录 Spark MLlib 特征工程(上)特征工程预处理 Encoding:StringIndexer特征构建:VectorAssembler特征选择:ChiSqSelector归一化:MinMaxScaler模型训练总结Spark MLlib 特征工程(上) 前面我们一起构建了一个简单的线性回归模型,来预测美国爱荷华州的房价。从模型效果来…

【高等代数笔记】002.高等代数研究对象(二)

1. 高等代数的研究对象 1.4 一元高次方程的求根 a n x n a n − 1 x n − 1 . . . a 1 x a 0 0 a_{n}x^{n}a_{n-1}x^{n-1}...a_{1}xa_{0}0 an​xnan−1​xn−1...a1​xa0​0 等式左边是一元多项式。 所有一元多项式组成的集合称为一元多项式环。

在亚马逊云科技上安全、合规地创建AI大模型训练基础设施并开发AI应用服务

项目简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何在亚马逊云科技利用Servi…

ARM架构(四)——异常中断和中断控制器(GIC)①

中断术语1——assert、routing、target、target to、target fromtaken 几个重要的概念:assert。routing、target、target to、target fromtaken 1.2 assert 外设发给GIC一个中断信号&#xff0c;GIC发给PE&#xff0c;PE对中断进行assert&#xff0c;断言这个中断是IRQ还是FI…

PPT怎么锁定图片不被移动?2个办公必备的实用技巧盘点!

插入到ppt的图片&#xff0c;怎么锁定不被移动&#xff1f;这是不少做PPT的人都会遇到的问题&#xff0c;想要移动的图片不会移动&#xff0c;不想移动的图片反而动了……诸如此类的迷之操作&#xff0c;直接把人整迷糊了。 ppt怎么锁定图片不被移动&#xff1f;就着这个问题&…

(贪心 + 双指针) LeetCode 455. 分发饼干

原题链接 一. 题目描述 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&…

【数学建模备赛】Ep03:皮尔逊person相关系数

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、皮尔逊person相关系数&#xff1a;☀️☀️☀️1. 总体皮尔逊person相关系数① 总体和样本② 理解协方差&#xff08;受量纲影响&#xff09;③ 剔除量纲影响 2. 样本皮尔逊person相关系数3. 相关性可视化① 皮尔…

后端代码练习1——加法计算器

1. 需求 输入两个整数&#xff0c;点击 “点击相加” 按钮&#xff0c;显示计算结果。 2.准备工作 创建Spring Boot项目&#xff0c;引入Spring Web依赖&#xff0c;把前端代码放入static目录下。 2.1 前端代码 <!DOCTYPE html> <html lang"en"> <h…

Unity + HybridCLR 从零开始

官方文档开始学习,快速上手 | HybridCLR (code-philosophy.com)是官方文档链接 1.建议使用2019.4.40、2020.3.26、 2021.3.0、2022.3.0 中任一版本至于其他2019-2022LTS版本可能出现打包失败情况 2. Windows Win下需要安装visual studio 2019或更高版本。安装时至少要包含 使…

apache-lotdb集群部署

一、下载 发行版本 | IoTDB Website jdk版本&#xff1a; 系统版本&#xff1a; 二、服务器规划 节点名称主机名服务192.168.110.110master01.110110.cnConfigNode、DataNode192.168.110.111node01.110111.cnConfigNode、DataNode192.168.110.112node02.110112.cnConfigNode、…

一文搞懂Python自动化测试框架!

一文搞懂Python自动化测试框架 如果你选用python做自动化测试&#xff0c;那么python测试框架的相关知识你必须要了解下。 首先我们先学习一下框架的基本知识。 什么是框架&#xff08;百度百科&#xff09;&#xff1f; 框架( Framwork )是构成一类特定软件可复用设计的一组…

100V-50mA超高压低压差线性稳压器具有电流保护功能

产品概述 PC6001 是一款能够耐受超高电压的线性稳压器&#xff0c;不仅融合了耐热增强型封装的优势&#xff0c;还能够承受持续直流电压或最高达 100V 的瞬态输入电压。 PC6001 器件与任何高于 2.2F 的输出电容以及高于0.47F 的输入电容搭配使用时均可保持稳定&#xff08;过…

mfc140u.dll丢失错误解决方法的基本思路——四种修复mfc140u.dll的方法

当遇到mfc140u.dll丢失的错误时&#xff0c;意味着你的系统中缺失了一个重要的动态链接库文件&#xff0c;该文件是微软 Visual C Redistributable for Visual Studio 2015 的一部分&#xff0c;对于运行那些用 Visual C 开发的程序是必需的。今天就教你mfc140u.dll丢失错误解决…

派单系统功能案例分析

派单系统是一种专门用于协调和分配任务的软件系统&#xff0c;它通过自动化和智能化的方式&#xff0c;确保任务能够高效地完成。以下是对派单系统功能的案例分析&#xff0c;主要从任务分配、实时监控、数据统计与分析以及行业应用等方面进行阐述。 一、任务分配 派单系统的核…

​线上教育_VR虚拟实验室​解决方案优缺点

线上教育的兴起也预示着对VR虚拟实验室的需求&#xff0c;这些虚拟实验室可以帮助学生学习他们研究的经验和进行实践&#xff0c;帮助学生更好地理解知识。但是&#xff0c;基于VR虚拟现实技术的虚拟实验室本质上是灵活的&#xff0c;它能让孩子们更轻松、更快速地探索各种新事…

【博主推荐】HTML5新闻,博客,官网网站源码文章瀑布流+详情页面

文章目录 1.设计来源1.1 主界面1.2 文章详情界面1.3 联系我们界面1.4 关于我们界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 【博主推荐】&#xff1a;前些天发现了一个巨牛的人工智能学习网站&…

mfc运行时报错内存不足闪退等问题

问题 mfc的打包程序源代码所在主机可以运行&#xff0c;在其他主机不能脱机运行&#xff0c;会报内存不足等莫名其妙的问题。 解决方法 排除其他代码上的问题后&#xff0c;看看是不是编译链的工具组件一致&#xff0c;我看新建项目的教程时没注意&#xff0c;红色框里的俩一…