微服务02-docker

news2024/9/24 11:28:05

1、Docker架构

1.1 镜像和容器

Docker中有几个重要的概念:

镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。Docker镜像是用于创建 Docker 容器的模板 。就像面向对象编程中的类。

容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。Docker容器是镜像运行时的实体。 就像面向对象编程中类的实例。一个类可以创建出 N多个实例,那么一个镜像同样也可以创建出 N 多个容器。每个处于运行状态的容器中都包含着一个或多个相关的应用,且它的运行不会干扰到其它容器。因为它们之间是相互隔离的。

仓库 Repository:Docker镜像仓库用来保存相关的一组镜像 ,这组镜像具有相同的镜像名称,都与镜像仓库名称相同 。 仓库根据其中的镜像是否可以被公开共享,可以分为公开库与私有库。

标签 Tag:通过< repository>:< tag>即可唯一定位一个镜像。即镜像标签其实就是镜像仓库中用于区分各个镜像的一种标识 ,同一仓库中的镜像具有不同的标签。

=================================================================================================
一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。

镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。

容器呢,就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。

在这里插入图片描述

1.2 DockerHub

  • DockerHub:DockerHub是一个官方的Docker镜像的托管平台。这样的平台称为Docker Registry。

  • 国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务、阿里云镜像库等。

我们一方面可以将自己的镜像共享到DockerHub,另一方面也可以从DockerHub拉取镜像:
在这里插入图片描述

1.3 Docker架构

我们要使用Docker来操作镜像、容器,就必须要安装Docker。

Docker是一个CS架构的程序,由两部分组成:

  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等

  • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。

在这里插入图片描述

2、Docker的基本操作

2.1.镜像操作

2.1.1.镜像名称

首先来看下镜像的名称组成:

  • 镜名称一般分两部分组成:[repository]:[tag]。
  • 在没有指定tag时,默认是latest,代表最新版本的镜像

在这里插入图片描述

2.1.2.镜像命令

常见的镜像操作命令如图:
在这里插入图片描述

2.1.3 拉取、查看镜像

需求:从DockerHub中拉取一个nginx镜像并查看

1)首先去镜像仓库搜索nginx镜像,比如DockerHub:
在这里插入图片描述

2)根据查看到的镜像名称,拉取自己需要的镜像,通过命令:docker pull nginx
或者拉取带指定版本的,eg:。例如,docker pull zookeeper:3.7.1(拉取 zookeeper 的 3.7.1 版本镜像)

pull 命令中的 < tag > 也可以不写,此时默认的 < tag >为 latest

在这里插入图片描述

3)通过命令:docker images 查看拉取到的镜像
在这里插入图片描述其中:

标签含义
REPOSITORY镜像仓库名称
TAG镜像版本号
IMAGE ID镜像的唯一标识
CREATE镜像的创建时间
SIZE镜像大小

也可查看 指定镜像 ,命令:

docker images  [镜像名称]

在这里插入图片描述
也可查看完整镜像 ID,使用 --no-trunc 参数后显示的是完成的镜像 id 。命令:

docker images  [镜像名称] --no-trunc

也可查看镜像 digest ,–digests 选项可以查看所有镜像或指定镜像的 digest 信息。命令:

docker images  [镜像名称] --digests

也可仅显示镜像 ID,-q 选项可仅显示本地所有镜像的 ImageID 。
在这里插入图片描述

4)简化日志:加上选项 -q 后就可简化拉取过程中的日志输出
在这里插入图片描述

5)通过 digest 拉取
docker pull可通过镜像的 digest 进行拉取。语法格式为 docker pull < repository>@<digest>

digest,是镜像内容的一个 Hash 值,即所谓的 Content Hash (内容散列)。只要镜像内容发生了变更,其内容散列值就一定会发生改变。注意, digest 是包含前面的 sha256 的,表示该 digest 的产生所采用的 Hash 算法是 SHA256
在这里插入图片描述

6 ) 过滤镜像
-f 选项用于过滤指定条件的镜像。下面例举一些常用的过滤条件。

dangling=true 用于过滤出悬虚镜像,即没有 Repository 与 Tag 的镜像。对于悬虚镜像的REPOSITORY 与 TAG ,显示的是 < none>
在这里插入图片描述

-f before 用于列举出本地镜像中指定镜像创建时间之前创建的所有镜像。
在这里插入图片描述

-f since 用于列举出本地镜像中指定镜像创建时间之后的创建的所有镜像。
在这里插入图片描述

-f reference 用于列举出 < repository>:< tag> 与指定表达式相匹配的所有镜像。
在这里插入图片描述

7 ) 格式化显示
该选项用于格式化输出docker images 的内容,格式需要使用 GO 模板指定。
在这里插入图片描述

2.1.4.保存、导入镜像

需求:利用docker save将nginx镜像导出磁盘,然后再通过load加载回来

1)利用docker xx --help命令查看docker save和docker load的语法

例如,查看save命令用法,可以输入命令:

docker save --help

结果:
在这里插入图片描述

命令格式:

docker save -o [保存的目标文件名称] [镜像名称]

2)使用docker save导出镜像到磁盘

运行命令:

docker save -o nginx.tar nginx:latest

结果如图:

在这里插入图片描述

3)使用docker load加载镜像

先删除本地的nginx镜像:

docker rmi nginx:latest

然后运行命令,加载本地文件:

docker load -i nginx.tar

结果:

在这里插入图片描述

2.1.5 从 docker hub 上查看镜像

通过docker search 命令可以从 docker hub 上查看指定名称的镜像。
而通过docker images 命令可查看本地所有镜像资源信息。
在这里插入图片描述

1 ) 过滤 检索结果
例如:仅查询出官方提供的镜像

docker search [镜像名称] --filte is-official=true

在这里插入图片描述

2 ) 限制 检索数量
可通过 limit 选项来指定显示的结果数量。

docker search [镜像名称] --limit=5

在这里插入图片描述

2.1.6 删除镜像

rmi(remove images ),该命令用于删除指定的本地镜像。镜像通过 < repository>:< tag> 指定。如果省略要删除镜像的 tag ,默认删除的是 lastest 版本。

docker rmi [镜像名称]

在这里插入图片描述
1 ) 删除多个镜像
docker rmi 命令可一次性删除多个镜像,多个要删除的镜像间使用空格分隔。
在这里插入图片描述

2 ) 通过 ImageID 删除镜像

docker rmi [镜像ID]

在这里插入图片描述

3 ) 强制删除镜像

docker rmi -f [镜像名称]

4 ) 删除所有镜像
使用组合命令删除所有镜像。当然,如果不携带-f 选项,则不会删除已打开容器的镜像。
在这里插入图片描述

2.2 镜像分层

Docker镜像由一些松耦合的只读镜像层组成, Docker Daemon 负责堆叠这些镜像层,并将它们关联为一个统一的 整体 ,即对外表现出的是一个独立的对象。通过docker pull 命令拉取指定的镜像时,每个 Pull complete 结尾的行就代表下载完毕了一个镜像层。

例如,下面的redis:latest 镜像就包含 6 个镜像层。
在这里插入图片描述

在这里插入图片描述
分层优点:

  • 每个分层都是只读的,所有对分层的修改都是以新分层的形式出现,并不会破坏原分层内容
  • 每个分层只记录变更内容,所以有利于节省存储空间
  • 在不同镜像间实现 资源共享 ,即 不同镜像对相同下层镜像的复用 (※)

每个镜像层由两部分构成:
镜像文件系统 与 镜像 json 文件 。这两部分具有相同的 ImageID。

镜像文件系统就是对镜像占有的磁盘空间进行管理的文件系统,拥有该镜像所有镜像层的数据内容。而镜像 json 文件则是用于描述镜像的相关属性的集合,通过 docker inspect [ 镜像 ]就可以直观看到。
在这里插入图片描述

2.3 镜像摘要

摘要,即 digest 。是镜像内容的一个 Hash 值,即所谓的 Content Hash (内容散列)。只要镜像内容 发生了变更,其内容散列值就一定会发生改变。也就是说,一个镜像一旦创建完毕,其digest就不会发生改变了,因为镜像是只读的。

摘要的主要作用是区分相同 < repository>:< tag>的不同镜像

2.4 容器操作

在这里插入图片描述

2.4.1 容器相关命令

容器操作的命令如图:
在这里插入图片描述

容器保护三个状态:

  • 运行:进程正常运行
  • 暂停:进程暂停,CPU不再运行,并不释放内存
  • 停止:进程终止,回收进程占用的内存、CPU等资源

其中:

  • docker run:创建并运行一个容器,处于运行状态

  • docker pause:让一个运行的容器暂停

  • docker unpause:让一个容器从暂停状态恢复运行

  • docker stop:停止一个运行的容器

  • docker start:让一个停止的容器再次运行

  • docker rm:删除一个容器

2.4.2 创建并运行一个容器

创建并运行nginx容器的命令:

docker run --name containerName -p 80:80 -d nginx

命令解读:

  • docker run :创建并运行一个容器
  • –name : 给容器起一个名字,比如叫做mn
  • -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
  • -d:后台运行容器
  • nginx:镜像名称,例如nginx

这里的-p参数,是将容器端口映射到宿主机端口。

默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器中的nginx。

现在,将容器的80与宿主机的80关联起来,当我们访问宿主机的80端口时,就会被映射到容器的80,这样就能访问到nginx了:

在这里插入图片描述

2.4.3 进入容器,修改文件

需求:进入Nginx容器,修改HTML文件内容,添加“传智教育欢迎您”

提示:进入容器要用到docker exec命令。

步骤

1)进入容器。进入我们刚刚创建的nginx容器的命令为:

docker exec -it mn bash

命令解读:

  • docker exec :进入容器内部,执行一个命令

  • -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互

  • mn :要进入的容器的名称

  • bash:进入容器后执行的命令,bash是一个linux终端交互命令

2)进入nginx的HTML所在目录 /usr/share/nginx/html

容器内部会模拟一个独立的Linux文件系统,看起来如同一个linux服务器一样:
在这里插入图片描述

nginx的环境、配置、运行文件全部都在这个文件系统中,包括我们要修改的html文件。

查看DockerHub网站中的nginx页面,可以知道nginx的html目录位置在/usr/share/nginx/html

我们执行命令,进入该目录:

cd /usr/share/nginx/html

查看目录下文件:
在这里插入图片描述

3)修改index.html的内容

容器内没有vi命令,无法直接修改,我们用下面的命令来修改:

sed -i -e 's#Welcome to nginx#传智教育欢迎您#g' -e 's#<head>#<head><meta charset="utf-8">#g' index.html

在浏览器访问自己的虚拟机地址,例如我的是:http://192.168.150.101,即可看到结果:
在这里插入图片描述

2.4.4 容器创建命令

docker create命令仅创建容器但不启动,其用法与 docker run 非常相似。注意,其没有-d 选项。
在这里插入图片描述

2.4.5 容器退出命令

退出并停止容器 exit
在这里插入图片描述
退出不停止容器 Ctrl + P + Q
注:先按下Ctrl + P ,然后再按下 Q 。
使用快捷键 Ctrl + P + Q 能够返回到了宿主机命令行。
再通过docker ps 可以查看到其是 UP 状态,说明容器退出了但并没有停止。

2.5 数据卷(容器数据管理)

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

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

相关文章

js代码执行顺序(同步与异步)

1.同步与异步 异步任务又分为宏任务和微任务 2.执行规则 同步代码遇到,直接执行Promise中.then前的代码直接执行,.then后的代码丢入微任务队列中遇到定时器直接将里面的代码丢入宏任务队列中同步代码执行完&#xff0c;去看微任务,有则执行&#xff1b;再去看宏任务&#xf…

文件的权限

1、修改文件的所属者和所属组 2、修改文件某一类人&#xff08;所属者、所属组、其他人&#xff09;的权限 一、用户对于普通文件的权限 二、用户对于目录文件的权限 三、访问控制列表ACL 四、特殊权限&#xff08;了解&#xff09; wuneng创建了几个文件&#xff0c;xiaoming对…

【C语言】预处理详解

本文目录 1 预定义符号 2 #define 2.1 #define 定义标识符 2.2 #define 定义宏 2.3 #define 替换规则 2.4 #和## 2.5 带副作用的宏参数 2.6 宏和函数对比 2.7 命名约定 3 #undef 4 命令行定义 5 条件编译 6 文件包含 6.1 头文件被包含的方式 6.2 嵌套文件包含 1 预定义符号 __…

2023亚马逊秋季大促定档!卖家要做好准备!

亚马逊Prime秋季促销&#xff0c;又称亚马逊Prime会员早享日&#xff08;Prime Early AccessSale&#xff09;&#xff0c;是亚马逊在2022年才正式推出的一个面向Prime会员的促销活动&#xff0c;与每年7月举办的Prime Day大促是同等级活动&#xff0c;去年秋季大促也是在10月举…

C - The Battle of Chibi

题意&#xff1a;就是问你数组中长度为m的上升子序列(没说连续&#xff09;有多少个。 1&#xff1a;可以想到状态表示dp[ i ][ j ] 代表以 a[i] 为结尾的且长度为 j 的严格单增子序列的数目&#xff0c; 那么状态计算就为 , 那我们如果不优化直接写&#xff0c;一层n&am…

数据结构刷题训练——链表篇(一)

目录 前言 题目一&#xff1a;链表的中间节点 思路 分析 题解 题目二&#xff1a;链表中倒数第k个结点 思路 分析 题解 题目三&#xff1a;合并两个有序链表 思路 分析 题解 方法二 题解 题目四&#xff1a;链表的回文结构 思路 分析 题解 总结 前言 今天我将开…

家政小程序开发制作

家政小程序是一种基于移动互联网的工具&#xff0c;旨在为用户提供方便快捷的家政服务。下面是家政小程序的功能介绍&#xff1a; 1. 家政服务展示&#xff1a;家政小程序可以展示各类家政服务的详细信息&#xff0c;包括清洁、保姆、月嫂、保洁等多种服务项目&#xff0c;以及…

【vue3】基础知识点-pinia

学习vue3&#xff0c;都会从基础知识点学起。了解setup函数&#xff0c;ref&#xff0c;recative&#xff0c;watch、computed、pinia等如何使用 今天说vue3组合式api&#xff0c;pinia 戳这里&#xff0c;跳转pinia中文文档 官网的基础示例中提供了三种写法 1、选择式api&a…

性能测试场景分析并设计?超细案例讲解

前言 性能测试场景&#xff0c;其实和功能测试没什么区别&#xff0c;只是侧重点不同。 我们在功能测试中经常用到的等价类边界值等分析和设计测试case的方法&#xff0c;目的是为了尽可能的覆盖业务场景&#xff0c;避免遗漏导致的功能逻辑缺失或者未达到预期。 而在性能测试…

【C++】初识模板

C模板入门 一、泛型编程 二、函数模板1. 函数模板的概念2. 函数模板格式3. 函数模板的原理4. 函数模板的实例化5. 模板参数的匹配原则 三、类模板 一、泛型编程 假设我们想实现一个交换函数&#xff0c;并且支持不同类型的参数实现&#xff0c;我们可以用 typedef 将类型进行重…

V2MOM工作法

V2MOM分别代表愿景&#xff08;vision&#xff09;、价值&#xff08;values&#xff09;、方法&#xff08;methods&#xff09;、障碍&#xff08;obstacles&#xff09;、衡量指标&#xff08;measurement&#xff09;。 第一&#xff0c;我真正想要的是什么呢&#xff1f;这…

ubuntu磁盘管理

show partition information 挂载设备在这 显示文件系统信息 build file system mkfs -t ext4 /dev/nvme0n1p4命令作用&#xff1a;将/dev/nvme0n1p4 格式化为 ext4 建立交换分区 mkswap -c -v1 /dev/nvme0n1p4 102400-c&#xff1a;check -v1&#xff1a;新版交换分区 -v0&…

四、web应用程序技术——HTTP

文章目录 1 HTTP请求2 HTTP响应3 HTTP方法4 URL5 HTTP消息头5.1 常用消息头5.2 请求消息头5.3 响应消息头 6 cookie7 状态码8 HTTP代理9 HTTP身份验证 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是访问万维网使用的核心通信协议&…

Linux 1.2.13 -- IP分片重组源码分析

Linux 1.2.13 -- IP分片重组源码分析 引言为什么需要分片传输层是否存在分段操作IP分片重组源码分析ip_createip_findip_frag_createip_doneip_glueip_freeip_expireip_defragip_rcv 总结 本文源码解析参考: 深入理解TCP/IP协议的实现之ip分片重组 – 基于linux1.2.13 计网理论…

2023Android面试,如果想卷请继续。备战金九银十

随着移动互联网的快速发展&#xff0c;Android开发岗位竞争也越来越激烈。作为一名Android程序员&#xff0c;面试是进入理想公司的重要一步。本文将分析市场对Android开发岗位的需求&#xff0c;分析2022年的Android开发岗位面试情况&#xff0c;并总结出历年来常见的面试题目…

MySQL中同比和环比语句如何写?

营收表如下&#xff08;表名&#xff1a;a&#xff09;如下图&#xff1a; 营收表 year month money 2021 1 1000 2021 2 1200 2022 1 1300 2022 2 1500 需要算出2022年营收同比与环比&#xff1a; 同比&#xff1a;和去年同月相比&#xff08;1300-1000/1000*100%&#xff0…

Python类的设计

Python类的设计 # 定义一个闹钟类 class Clock:__cureen_keyNone # 私有成员不能改变和使用def __init__(self, id, price): # 类对象是立即自动执行self.id idself.price pricedef ring(self):import winsound # 内置声音方法winsound.Beep(2000,3000)clock1 Clock(…

自然语言处理学习笔记(六)————字典树

目录 1.字典树 &#xff08;1&#xff09;为什么引入字典树 &#xff08;2&#xff09;字典树定义 &#xff08;3&#xff09;字典树的节点实现 &#xff08;4&#xff09;字典树的增删改查 DFA&#xff08;确定有穷自动机&#xff09; &#xff08;5&#xff09;优化 1.…

Python基础--序列操作/函数

Python基础 1.序列的操作 2.函数 1. 数据类型的具体操作 1.1 序列操作--列表具体操作&#xff1a; #定义列表 listA [] #定义一个空列表 listB [1,2.8,"你好",listA,[1,2,3]] # 访问列表 print(listB)#查看整个列表 print(listB[2])#查看单个…

docker 安装mongodb 虚拟机安装mongodb

生产环境直接安装比较好&#xff0c;以及使用集群环境&#xff0c;本文仅测试交流使用&#xff0c;我用来写分布式im测试使用&#xff1a; nami-im: 分布式im, 集群 zookeeper netty kafka nacos rpc主要为gate&#xff08;长连接服务&#xff09; logic &#xff08;业务&…