Docker(四) 文件和网络

news2024/11/18 7:33:07

1 Dockerfile

1.1 什么是Dockerfile

        Dockerfile是一个文本文件,包含一系列命令,这些命令用于在 Docker 镜像中自动执行操作。Dockerfile 定义了如何构建 Docker 镜像的步骤和所需的操作。

        Dockerfile 中包含的命令可以设置和定制容器的环境,包括安装软件、设置系统参数、添加文件和目录等等。在运行时,这些命令将自动执行,以构建所需的容器。

        使用 Dockerfile 构建镜像有如下优点:

  • 可重复性:Dockerfile 中的指令可以被重复执行,以生成相同构建的镜像。
  • 可跟踪性:Dockerfile 中的每一个指令都会生成一层镜像,并且每层镜像都有唯一的 ID。这可以方便地跟踪镜像的构建历史。
  • 自动化:Dockerfile 中的指令可以自动化构建过程并且能简化构建过程。例如,如果在容器中需要安装多个软件包,那么可以将这个操作自动化,而不是手动执行。

1.2 Dockerfile指令

        Dockerfile 是用于定义 Docker 镜像构建指令的文件。下面是 Dockerfile 中最常用的一些指令。

        1、FROM:指定一个基础镜像。在 Dockerfile 中,必须从一个已有的镜像构建所需的镜像。

        2、RUN:在当前镜像的文件系统上执行命令。执行RUN指令后,Docker 会将当前镜像的文件系统和状态提交为新的镜像。

        3、CMD:容器启动后要执行的命令。可以使用多种方式定义 CMD 指令以执行指定操作。

        4、WORKDIR:指定在容器中要使用的某个目录。

        5、COPY 或 ADD :将文件或目录从构建上下文复制到新镜像中。COPY 复制本地文件夹的方法。ADD 可以将远程文件作为 URL 复制过来并解压缩。

        6、EXPOSE:容器开放的端口。该指令通知Docker,容器在运行时监听指定的网络端口。你可以指定端口监听的是TCP还是UDP,如果没有指定协议,默认是TCP。

        7、ENV:设置环境变量。

        8、ARG:定义构建时可用的变量。

1.3 Dockerfile示例

        创建Dockerfile文件:

mkdir -p /opt/df/demo1 # 创建存放Dockerfile的文件夹

cd /opt/df/demo1 # 进入该文件夹

vim Dockerfile  # 创建示例文件

        Dockerfile文件中的内容如下:

FROM rockylinux:9.0

RUN yum install -y java-17-openjdk-devel

CMD java -version

        使用build命令基于Dockerfile构建Docker镜像:

docker build -t java17:latest . # java17:latest 是新的image名称, .表示Dockerfile文件在当前目录下

        查看镜像:

        运行镜像:

2 镜像分层

2.1 什么是镜像分层

        在 Docker 中,镜像有一个很重要的特性叫做分层。这是一种轻量级的虚拟化机制,可以帮助用户更加高效地制作和管理容器镜像。

        每个镜像都由一系列分层的文件系统组成,每一层都包含了特定软件包、库和文件。当我们从一个已有的镜像构建容器时,Docker会利用这些分层文件系统来向容器提供所需的文件和配置信息。

2.2 镜像分层的优点

        镜像分层最大的一个好处就是共享资源。

        1、易于更新和维护:只需更新需改的一层即可,其他层可以不变,避免了不必要的构建和复制。

        2、空间利用率高:同样大小的源码只需要存储一次,以后每个基础镜像只需要存储在它前一个基础镜像之上的那一层的数据即可。

        3、加快镜像构建:在构建时,Docker 可以轻松地缓存已经存在的层,当下次构建时,只需要重复利用已有的层即可,快速进行增量式更新。

        4、更好的镜像交付:分层的机制使得将一个完整的应用程序打包成一个镜像更加容易,不同样层可以用于不同的应用场景。

2.3 可写的容器层

        在 Docker 中,每次从镜像启动容器时,Docker 会自动创建一个可写的容器层(也称为容器快照层),用于保存容器中的写入操作结果。这个可写层会在容器启动时创建,可以对容器进行修改、更新等操作,但不会影响到镜像本身。

        具体来说,每个容器层都是由一个只读的基础镜像层和一个可写的容器层组成。当容器需要从镜像中获取文件系统时,它会在基础镜像层中搜索文件,如果找到了则直接返回;如果没有找到,则会在容器层中搜索。如果找到,则会将它返回给容器。

        可写的容器层允许我们创建和更改文件、目录、文件权限和用户等等,这样我们就可以制定应用程序所需的环境和设置了。它也是容器打包交付的开发流程中一个重要的组成部分,我们可以将容器层中的数据打包成独立的Docker镜像以供部署。

        需要注意的是,可写层存储的内容是暂时性的,当容器被删除时,容器层中的所有内容也会被删除。我们应该保证重要数据的备份和持久性存储,不要放在容器层中保存。

2.4 容器层的细节

        当我们使用 Docker 运行一个容器时,Docker会将镜像层叠加在一起。在容器层中,用户看到的是一个由所有镜像层叠加之后的文件系统。不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,在最终的容器中,只保留了上层镜像中的 /a 文件。

        1、添加文件:在容器中创建文件时,新文件被添加到容器层中。

        2、读取文件:在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后打开并读入内存。

        3、修改文件:在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。

        4、删除文件:在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。(只是记录删除操作)

        只有当需要修改时才复制一份数据,这种特性被称作Copy-on-Write。容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。

3 Docker 网络

3.1 Docker网络概述

        Docker网络是Docker提供的用于容器间通信以及容器与主机或其他网络实体之间通信的解决方案。Docker支持多种类型的网络,可以根据不同的场景选择不同的网络方案。

        Docker 的网络子系统使用了基于驱动程序的可插拔设计。Docker默认存在多种网络驱动程序,较为常用的有:

        1、bridge:是Docker的默认网络驱动,Docker 容器启动时会自动创建一个与主机相连的虚拟网络桥接,然后将容器连接到这个桥接上。容器之间可以通过容器名称访问,而不需要暴露端口。

        如果两个容器属于同一个网络(如默认的 bridge 网络),则容器之间可以使用不同的网络配置通过网络互相通信。当容器不具有公共IP时,可以用容器名称来代替IP地址。

        2、host:网络驱动不会为容器创建额外的网络命名空间,而是容器直接使用主机的网络命名空间,实现容器与主机之间的通信。使用 host 网络驱动可以提高网络性能,但是容器之间无法直接相互通信,只能通过主机来中转。

        3、none:网络驱动表示容器没有任何网络接口,即没有网络连接,只有回环地址。在某些场景下可能会使用到这种网络类型,例如一个完全隔离的容器场景。

        需要注意的是,Docker 内置的网络驱动并不支持跨主机的容器通信,如果需要在多台主机的 Docker 容器之间通信,可以使用第三方的网络插件,如Weave Net、Calico等。

3.2 Docker网络操作

        Docker Network命令是Docker提供的用于管理网络的子命令集合,可以使用这些命令来创建、删除、连接和断开连接Docker容器的网络,以及查看已存在的网络等操作。以下是一些常用的 Docker Network 命令和说明:

        1、create:这个命令用于创建一个 Docker 网络。通过指定不同的网络驱动程序和选项,可以创建不同类型的网络。

  • 例如:docker network create --driver bridge my-bridge-network,将创建一个名为my-bridge-network的桥接网络

        2、ls:用来列出所有现有的 Docker 网络。

        3、inspect:用来查看某个 Docker 网络的详细信息。

        4、connect:使用该命令可以将一个已启动的 Docker 容器连接到一个指定的网络上。

  • docker network connect my-bridge-network container-name

        5、disconnect:使用该命令可以将已连接到 Docker 网络的某个容器与网络断开连接。

  • docker network disconnect my-bridge-network container-name

3.3 Docker网络示例

        本示例展示创建MariaDB服务器容器,并通过MaraiDB客户端和其他客户端实现对MariaDB服务器容器的访问。

        首先,创建一个新的桥接网络:        

docker network create new-network

        然后,查看当前主机的所有网络:

docker network ls

        创建一个MariaDB的容器,连接到new-network网络:

docker run --detach --network new-network --name myMariadb --env MARIADB_USER=root --env MARIADB_PASSWORD=root --env MARIADB_ROOT_PASSWORD=root  mariadb:10.3

        其中 –env是配置镜像使用的环境变量,本例中是为MariaDB数据库配置初始的用户名和密码。

        创建完成的镜像可能自动关闭,使用docker ps -a命令查看镜像运行状态,如果没有处于运行状态,使用docker start命令启动该镜像。

        通过如下命令启动一个MariaDB的客户端:

docker run -it --network new-network --rm mariadb:10.3 mysql -hmyMariadb -uroot -proot

        上述命令中:

  • --network new-network:将容器绑定到new-network
  • --rm:容器退出后自动删除
  • mariadb:10.3:镜像的名称和版本
  • mysql -hmyMariadb -uroot -proot:进入容器后执行的命令,启动MaraiaDB客户端,访问主机名为myMariadb的服务器,这里是直接使用了前面启动的容器的名称作为主机名

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

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

相关文章

30.包名的修改和新建后端模块

权限和第三方登录确实令人头疼,我们来学一点简单一点的。 另外,如果各位有属于自己的域名和ICP/IP备案,布置一个作业,自行实现第三方QQ登录。 我们所说的包名修改,是一次性修改ruoyi的全部包名,因为发现很多人有这样的需求,下载别人的代码,想要改成自己公司的包名,结…

android11屏蔽下拉菜单快捷开关

1.文件位置&#xff1a; frameworks/base/packages/SystemUI/res/values/config.xml a.这个文件定义了初始化的一些组件&#xff0c;部分代码如下&#xff1a; //overlay/frameworks/base/packages/SystemUI/res/values/config.xml<!-- The default tiles to display in …

git使用介绍

一、为什么做版本控制&#xff08;git是版本控制工具&#xff09; 为了保留之前所以的版本&#xff0c;以便回滚和修改 二、点击安装 三、基础操作 1、初步认识 想要让git对一个目录进行版本控制需要以下步骤&#xff1a; 进入要管理的文件夹进行初始化命令 git init管理…

工厂做外贸,国内公司跟香港公司有什么区别

最近有不少做内贸的工厂朋友想转型做外贸&#xff0c;问我要不要单独注册一个公司&#xff0c;以及注册哪里的公司&#xff0c;国内的公司跟香港的公司有什么区别&#xff1f;今天就简单来给大家分享一下这块的一个区别。 首先工厂转型做外贸的话&#xff0c;比较建议注册一个…

【C++】 单例设计模式的讲解

前言 在我们的学习中不免会遇到一些要设计一些特殊的类&#xff0c;要求这些类只能在内存中特定的位置创建对象&#xff0c;这就需要我们对类进行一些特殊的处理&#xff0c;那我们该如何解决呢&#xff1f; 目录 1. 特殊类的设计1.1 设计一个类&#xff0c;不能被拷贝&#xf…

算法特训,AB5 .点击消除BC.149简写单词牛客.除2!牛客.Fibonacci数列

目录 AB5 .点击消除 BC.149简写单词 牛客.除2&#xff01; 牛客.Fibonacci数列 AB5 .点击消除 点击消除&#xff0c;类似于括号匹配a(b[b]a){c{d,这种&#xff0c;利用栈去消除,这样正好可以处理&#xff0c;假如相同就不进栈&#xff0c;同时还要出栈。注意我们这么搞完他是…

Leaflet【二】图层绘制——UI图层【点线面】 矢量图层【img、svg】

layer图层 在leaflet当中使用图层比OL当中简便一点&#xff0c;我们创建的layer图层可以直接通过 addTo 方法加到地图上&#xff0c;不需要通过layer、source再去做一些区分&#xff0c; 图标 Icon 创建Marker时提供的一个Icon 详细配置–>go // 导入一张图片作为图标imp…

在 Android 上存档短信:4 种方法的终极指南

概括 无论是个人对话还是专业信件&#xff0c;我们的短信收件箱很快就会因大量线程和对话而变得混乱。为了帮助管理这种过载&#xff0c;许多 Android 用户转向了归档短信这一便捷功能。在本指南中&#xff0c;我们将探讨如何在 Android 设备上存档短信的详细信息&#xff0c;…

文心一言 VS 讯飞星火 VS chatgpt (265)-- 算法导论20.1 4题

四、假设不使用一棵叠加的度为 u \sqrt{u} u ​ 的树&#xff0c;而是使用一棵叠加的度为 u 1 k u^{\frac{1}{k}} uk1​的树&#xff0c;这里 k 是大于 1 的常数&#xff0c;则这样的一棵树的高度是多少&#xff1f;又每个操作将需要多长时间&#xff1f;如果要写代码&#xf…

JPHS-JMIR Public Health and Surveillance

文章目录 一、期刊简介二、征稿信息三、期刊表现四、投稿须知五、投稿咨询 一、期刊简介 JMIR Public Health and Surveillance是一本多学科期刊&#xff0c;专注于公共卫生创新与技术的交叉领域&#xff0c;包括公共卫生信息学、监测&#xff08;监测系统和快速报告&#xff…

大模型难落地?聊聊大模型在智能财务应用的正确打开方式

大模型难落地&#xff1f;No&#xff0c;是你还不够了解它&#xff01; &#xff08;全文4989字&#xff0c;阅读约需10分钟&#xff09; 这两天&#xff0c;大模型几乎成了WAIC&#xff08;世界人工智能大会&#xff09;的唯一主题。大会上&#xff0c;各家企业的大模型悉数…

excel转pdf并且加水印,利用ByteArrayOutputStream内存流不产生中间文件

首先先引入包&#xff1a;加水印和excel转PDF的 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.12</version></dependency><dependency><groupId>org.apache.poi&l…

vue核心模块源码解析

响应式原理 Object.definePropertysetterProxy var count 1 var state {} Object.defineProperty(state , count,{get(){return count},set(val){count val} }) //弊端&#xff1a;不能主动监听到对象属性的新增或者删除&#xff0c;add/deleteref和reactive 声明响应式数…

Golang net/http标准库常用方法(二)

大家好&#xff0c;针对Go语言 net/http 标准库&#xff0c;将梳理的相关知识点分享给大家~~ 围绕 net/http 标准库相关知识点还有许多章节&#xff0c;请大家多多关注。 文章中代码案例只有关键片段&#xff0c;完整代码请查看github仓库&#xff1a;https://github.com/hltfa…

K8S认证|CKA题库+答案| 1. 权限控制RBAC

1、权限控制RBAC 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Master node Worker node k8s master …

【云原生】Kubernetes 核心概念

什么是 Kubernetes Kubernetes&#xff0c;从官方网站上可以看到&#xff0c;它是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语&#xff0c;它的中文翻译是“舵手”或者“飞行员”。在一些常见的资料中也会看到“ks”这个词&#xff0c;也就是“k8s”&#xff0c;它…

2024年信息素养大赛图形化编程、Python、算法创真题汇总

2024年信息素养大赛编程赛道初赛&#xff08;Scratch图形化编程、Python、C算法创意&#xff09;已经结束&#xff0c;根据Scratch实验室的了解全国青少年信息素养大赛初赛晋级及初赛成绩内容如下&#xff1a; 1.参赛选手将在 5 个工作日(节假日不计在内)内&#xff0c;通过信…

开源的数据标注工具--Label-Studio

最近在了解构建知识图谱的相关知识&#xff0c;收集了一些数据&#xff0c;对数据进行标注时尝试了下Label-Studio这个工具&#xff0c;它是开源的数据标注工具&#xff0c;个人觉得还是挺好用的。 Label-studio的安装 我是直接在服务器上用pip安装的&#xff0c;命令如下&am…

【刷题篇】位运算

文章目录 1、判定字符是否唯一2、丢失的数字3、两整数之和4、只出现一次的数字 II5、 消失的两个数字 1、判定字符是否唯一 class Solution { public:bool isUnique(string astr) {int nastr.size();if(n>26)//鸽巢原理return false;int bitMap0;for(auto& e : astr){in…

echart 折线图tooltip

运行结果 代码 import { truncate, merge } from lodash; import { getBasePieOptions, getTooltipFormatter } from "*/money/utils";const colorArray [#1F8BFF, #EDBE75, #26E3F0, #AF8FFF, #61DDAA, #FD996A, #8367E0, #1AAF87]export function getLineOptions…