当前位置: 首页 > news >正文

[Docker精进篇] Docker镜像构建和实践 (三)

前言:

Docker镜像构建的作用是将应用程序及其依赖打包到一个可移植、自包含的镜像中,以便在不同环境中快速、可靠地部署和运行应用程序。

在这里插入图片描述

文章目录

  • Docker镜像构建
    • 1️⃣是什么?
    • 2️⃣为什么?
    • 3️⃣镜像构建
      • 一、用现有容器构建新镜像
      • 二、Dockerfile构建镜像
    • 4️⃣总结

这篇文章是我的笔记,旨在带您快速入门上手docker,更加深入学习docker知识

Docker镜像构建

做事三步走:是什么,为什么,怎么办 我们一步一步来进行分析

磨刀不误砍柴工,让我们一步一步去分析和深入。😉

1️⃣是什么?

Docker镜像构建提供了一种强大且灵活的方式来打包、部署和管理应用程序。通过实现环境一致性、快速部署、版本控制、资源隔离和易维护性等优点,它大大简化了应用程序的交付和运维过程,提高了开发和运维的效率,并促进了应用程序的可移植性和可靠性。

在这里插入图片描述

2️⃣为什么?

相信大家能从往期文章学到挺多docker的相关知识,在看了上面的相关介绍,应该很清楚的知道镜像构建的好处和优点,下面我简单汇总总结一下:

  1. 环境一致性和可移植性: Docker镜像构建允许将应用程序及其所有依赖项打包到一个独立的、可移植的单元中。这意味着可以在不同的环境中运行相同的镜像,无需担心由于环境差异而导致的不兼容问题。无论是开发、测试还是生产环境, 可以使用相同的镜像保持环境一致性,确保应用程序在不同环境中的行为一致。

  2. 快速部署和扩展: Docker镜像构建使部署应用程序变得非常简单和快速。一旦构建好镜像,可以将其部署到任何支持Docker的主机上,无需繁琐的依赖项安装和配置过程。此外,由于镜像具有轻量级的特性,可以快速地复制和部署多个容器实例,从而轻松地进行应用程序的水平扩展。

  3. 版本控制和可重复性: Docker镜像构建可以与版本控制系统(如Git)集成,将构建过程纳入代码管理。通过在代码库中包含Dockerfile,可以确保每个构建步骤都是可追溯和可重复的。这样一来,可以轻松地管理和维护应用程序的不同版本,以及构建和发布过程的变更。

  4. 资源隔离和安全性: Docker容器提供了一种轻量级的虚拟化方式,能够实现资源隔离并增强应用程序的安全性。镜像构建过程允许您明确定义应用程序的依赖项和运行时环境,从而减少了应用程序与宿主机之间的耦合。这种隔离性可以防止应用程序对主机环境的干扰,同时减少了系统故障和依赖冲突的风险。

  5. 易于维护和更新: 通过Docker镜像构建,您可以轻松地更新和维护应用程序。一旦构建了镜像,您可以对其进行版本控制和标记,以便追踪和管理不同版本的应用程序。当需要进行更新或修复时,只需构建一个新的镜像,然后将其部署到运行中的容器上即可。这种更新过程通常非常简单和可靠,减少了应用程序维护的工作量和风险。

3️⃣镜像构建

镜像构建有两种方式,一种是使用现有容器去构建新镜像,一种是通过dockerfile去构建新的镜像。

在这里插入图片描述

一、用现有容器构建新镜像

首先我们先来了解docker镜像构建命令:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

下面我们来一步一步讲解:

  • OPTIONS:可选参数,用于配置创建镜像的各种选项。

    • -a, --author: 设置新镜像的作者信息。
    • -c, --change: 应用指定的 Dockerfile 指令。
    • -m, --message: 设置新镜像的提交消息。
    • -p, --pause: 在创建过程中暂停容器。

例子:
创建一个新镜像,并设置作者信息为 “John Doe”。

	docker commit -a "John Doe" container_id repository:tag

创建一个新镜像,并在构建过程中应用指定的 Dockerfile 指令,例如设置一个名为 DEBUG 的环境变量

	docker commit -c "ENV DEBUG=true" container_id repository:tag

创建一个新镜像,并设置提交消息为 “Added new dependencies”。

	docker commit -m "Added new dependencies" container_id repository:tag

暂停容器的运行状态,并将其转换为一个新的可运行镜像

	docker commit -p container_id repository:tag

docker commit 命令时,一般使用 Dockerfile 来定义和构建镜像,以便更好地管理和复现构建过程。

二、Dockerfile构建镜像

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明
在这里插入图片描述
首先我们先看示例:

# 指明构建的新镜像是来自于 centos:7 基础镜像
FROM centos:7
# 通过镜像标签声明了作者信息
LABEL maintainer="mszlu.com"
# 设置工作目录
WORKDIR /usr/local
# 新镜像构建成功以后创建指定目录
RUN mkdir -p /usr/local/java && mkdir -p /usr/local/tomcat
# 拷贝文件到镜像中并解压
ADD jdk-11.0.8_linux-x64_bin.tar.gz /usr/local/java
ADD apache-tomcat-9.0.59.tar.gz /usr/local/tomcat
# 暴露容器运行时的 8080 监听端口给外部
EXPOSE 8080
# 设置容器内 JAVA_HOME 环境变量
ENV JAVA_HOME /usr/local/java/jdk-11.0.8/
ENV PATH $PATH:$JAVA_HOME/bin
# 启动容器时启动 tomcat
CMD ["/usr/local/tomcat/apache-tomcat-9.0.59/bin/catalina.sh", "run"]

内容很长,不用担心,我们一步一步去分析:
命令:代码在上,翻译在下,通过几个实例让你进一步了解相关命令使用

FROM <image>:<tag>

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

MAINTAINER <name>

指明镜像维护者及其联系方式(一般是邮箱地址)。官方说明已过时,推荐使用 LABEL。

LABEL maintainer="mszlu.com"

功能是为镜像指定标签。也可以使用 LABEL 来指定镜像作者

RUN mkdir -p /usr/local/java

构建镜像时运行的 Shell 命令,比如构建的新镜像中我们想在 /usr/local 目录下创建一个 java 目录。

ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java

拷贝文件或目录到镜像中。将本地的jdk拷贝到虚拟机中/usr/local/java

COPY jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java

拷贝文件或目录到镜像中。将本地的jdk拷贝到虚拟机中/usr/local/java, 用法同 ADD,只是不支持自动下载和解压。

EXPOSE 80 443 8080/tcp

暴露容器运行时的监听端口给外部,可以指定端口是监听 TCP 还是 UDP,如果未指定协议,则默认为 TCP。想使得容器与宿主机的端口有映射关系,必须在容器启动的时候加上 -p 参数

ENV JAVA_HOME /usr/local/java/jdk-11.0.6/

设置容器内环境变量。

CMD ehco $JAVA_HOME

启动容器时执行的 Shell 命令。在 Dockerfile 中只能有一条 CMD 指令。如果设置了多条 CMD,只有最后一条 CMD 会生效。如果创建容器的时候指定了命令,则 CMD 命令会被替代,会被docker run给覆盖掉

ENTRYPOINT ehco $JAVA_HOME

启动容器时执行的 Shell 命令,同 CMD 类似,不会被 docker run 命令行指定的参数所覆盖。在 Dockerfile 中只能有一条 ENTRYPOINT 指令。如果设置了多条 ENTRYPOINT,只有最后一条 ENTRYPOINT 会生效。

WORKDIR /usr/local

为 RUN、CMD、ENTRYPOINT 以及 COPY 和 AND 设置工作目录

VOLUME ["/var/lib/mysql"]

容器的 /var/lib/mysql 目录会在运行时自动挂载为匿名卷,匿名卷在宿主机的 /var/lib/docker/volumes 目录下

4️⃣总结

在这里插入图片描述
Docker镜像构建是将应用程序和其依赖项打包到一个独立、可移植的容器环境中的过程。通过使用Dockerfile定义构建步骤和环境配置,可以实现快速、一致和可重复的镜像构建。镜像构建的好处包括环境一致性、快速部署、版本控制、资源隔离和易于维护更新。

如果您在学习过程中有什么疑问或者不懂的地方,可以随时私信我,看到会及时回复!!

相关文章:

[Docker精进篇] Docker镜像构建和实践 (三)

前言&#xff1a; Docker镜像构建的作用是将应用程序及其依赖打包到一个可移植、自包含的镜像中&#xff0c;以便在不同环境中快速、可靠地部署和运行应用程序。 文章目录 Docker镜像构建1️⃣是什么&#xff1f;2️⃣为什么&#xff1f;3️⃣镜像构建一、用现有容器构建新镜像…...

【Unity细节】Unity中的层级LayerMask

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…...

修改el-table行悬停状态的背景颜色

.content:deep().el-table tr:hover>td {background-color: #f5f5f5 !important; /* 设置悬停时的背景颜色 */ }/*这一点很重要&#xff0c;否则可能会导致hover行时操作列还是原来的背景色*/ .content:deep().el-table__body tr.hover-row>td{background-color: #f5f5f5…...

记一次mysql not in的使用问题

现象&#xff1a;使用not in 某个id集合&#xff0c;出现脏数据&#xff0c;存在null数据。例如&#xff1a;not in(1,2,null)&#xff0c;结果会一条数据都没有&#xff0c;为空 原因&#xff1a; 当使用NOT IN操作符时&#xff0c;传递给它的值列表中不能包含NULL值&#xf…...

JavaFx基础学习【四】:UI控件的通用属性

目录 前言 一、介绍 二、继承关系 三、常用通用属性 四、属性Properties 五、属性绑定 六、属性监听 七、事件驱动 八、其他章节 前言 如果你还没有看过前面的文章&#xff0c;可以通过以下链接快速前往学习&#xff1a; JavaFx基础学习【一】&#xff1a;基本认识_明…...

【Leetcode】101.对称二叉树

一、题目 1、题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例1: 输入:root = [1,2,2,3,4,4,3] 输出:true示例2: 输入:root = [1,2,2,null,3,null,3] 输出:false提示: 树中节点数目在范围 [1, 1000] 内-100 <= Node.val <= 100进阶:你可以…...

用Java实现原神抽卡算法

哈喽~大家好&#xff0c;好久没有更新了&#xff0c;也确实遇到了很多事&#xff0c;这篇开始恢复更新&#xff0c;喜欢的话&#xff0c;可以给个的三连&#xff0c;什么&#xff1f;你要白嫖&#xff1f;那可以给个免费的赞麻。 &#x1f947;个人主页&#xff1a;个人主页​​…...

微服务—Eureka注册中心

eureka相当于是一个公司的管理人事HR,各部门之间如果有合作时&#xff0c;由HR进行人员的分配以及调度&#xff0c;具体选哪个人&#xff0c;全凭HR的心情&#xff0c;如果你这个部门存在没有意义&#xff0c;直接把你这个部门撤销&#xff0c;全体人员裁掉&#xff0c;所以不想…...

AI问答:JSBridge / WebView 与 Native 通信

一、理解JSBridge JSBridge是一种连接JavaScript和Native代码的桥梁&#xff0c;它提供了一种方法&#xff0c;使得JavaScript可以直接调用Native的代码&#xff0c;同时使得Native的代码也能直接调用JavaScript的方法&#xff0c;从而实现了JavaScript和Native之间的相互调用和…...

Mybatis动态SQL,标签大全

动态SQL常用场景 批量删除delete from t_car where id in(1,2,3,4,5,6,......这里的值是动态的&#xff0c;根据用户选择的 id不同&#xff0c;值是不同的);多条件查询哪些字段会作为查询条件是不确定的&#xff0c;根据用户而定 select * from 1 t_car where brand like 丰田…...

zotero在不同系统的安装(win/linux)

1 window系统安装 zotero 官网&#xff1a; https://www.zotero.org/ 官方文档 &#xff1a;https://www.zotero.org/support/ (官方)推荐常用的插件: https://www.zotero.org/support/plugins 入门视频推荐&#xff1a; Zotero 文献管理与知识整理最佳实践 点击 exe文件自…...

web会话跟踪以及JWT响应拦截机制

目录 JWT 会话跟踪 token 响应拦截器 http是无状态的&#xff0c;登录成功后&#xff0c;客户端就与服务器断开连接&#xff0c;之后再向后端发送请求时&#xff0c;后端需要知道前端是哪个用户在进行操作。 JWT Json web token (JWT), 是为了在网络应用环境间传递声明而…...

Web菜鸟入门教程 - Swagger实现自动生成文档

如果是一个人把啥都开发了&#xff0c;那用不到Swagger-UI&#xff0c;但一般情况是前后端分离的&#xff0c;所以就需要告诉前端开发人员都有哪些接口&#xff0c;传入什么参数&#xff0c;怎么调用&#xff0c;返回什么。有了Swagger-UI就能把这部分文档编写的业务给省去了。…...

2023国赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…...

第7章:贝叶斯分类器

贝叶斯决策论 贝叶斯分类器&#xff1a;使用贝叶斯公式 贝叶斯学习&#xff1a;使用分布估计&#xff08;不同于频率主义的点估计&#xff09; 极大似然估计 朴素贝叶斯分类 半朴素贝叶斯 条件独立性假设&#xff0c;在现实生活中往往很难成立。 半朴素贝叶 斯的一个常用策略…...

【LeetCode】88.合并两个有序数组

题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并…...

05 - 研究 .git 目录

查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;GIT常用场景- 目录 文章目录 1. HEAD2. config3. refs4. objects 1. HEAD 2. config 3. refs 4. objects Git对象一共有三种&#xff1a;数据对象 blob、树对象 tree以及提交对象 commit&#xff0c;这些对象都被保…...

MySQL之索引和事务

索引什么是索引索引怎么用索引的原理 事务使用事务事务特性MySQL隔离级别 索引 什么是索引 索引包含数据表所有记录的引用指针&#xff1b;你可以对某一列或者多列创建索引和指定不同的类型&#xff08;唯一索引、主键索引、普通索引等不同类型&#xff1b;他们底层实现也是不…...

⛳ 将本地已有的项目上传到 git 仓库

目录 ⛳ 将本地已有的项目上传到 git 仓库&#x1f3ed; 一、克隆 拷贝&#x1f3a8; 二、强行合并两个仓库 ⛳ 将本地已有的项目上传到 git 仓库 有两种方法&#xff1a; ​ 一、克隆 拷贝 ​ 二、强行合并两个仓库 &#x1f3ed; 一、克隆 拷贝 ​ 直接用把远程仓库拉到本…...

ADB常用命令整理(全网最全)

调试Android程序时&#xff0c;我们经常需要使用adb shell命令。adb是Android Debug Bridge的缩写&#xff0c;它充当调试桥梁的作用&#xff0c;就像一条连接开发机和设备之间的桥梁。 通过adb&#xff0c;我们可以在Eclipse中使用DDMS来调试Android程序&#xff0c;简单来说…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...