docker——基础知识

简介

一、什么是虚拟化和容器化

​ 实体计算机叫做物理机,又时也称为寄主机;

​ 虚拟化:将一台计算机虚拟化为多态逻辑计算机;

​ 容器化:一种虚拟化技术,操作系统的虚拟化;将用户空间软件实例分割成多个独立的单元,变成多个实例;docker就是容器技术的事实标准;

二、为什么要虚拟化和容器化

​ 1.资源利用率高;

​ 2.环境标准化,保证测试的环境保持不变;

​ 3.资源弹性伸缩,可以灵活实现资源扩缩容;

​ 4.支持差异化的环境;

​ 5.沙箱安全,容器之间不会互相影响;

​ 6.比虚拟机更加的轻量化,启动更快,一般的虚拟机启动会加载整个内核,而容器以进程的方式运行于内核上,启动就会更快;

​ 7.维护和扩展更加容易,进行复制粘贴镜像文件快速扩展;

三、虚拟化实现方式

3.1应用程序执行环境分层

​ 应用程序层、库函数层、操作系统层、硬件层;

3.2虚拟化常见类别

​ 虚拟机:对硬件层抽象接口进行模拟,模拟出一种虚拟的硬件设备再将操作系统包括之上的层嫁接到虚拟硬件上;

​ 容器:对操作系统的接口进行模拟,将函数库层以上的功能置于操作系统中,可以使用进程的方式启动;

​ JVM之类的虚拟机:在函数库层与应用程序层之间添加一层接口,对下提供不同的版本支持不同操作系统,对上提供统一的运行环境;

3.3常见虚拟化实现

3.3.1主机虚拟化

​ 主机虚拟化:通过在物理服务器上安装一个虚拟化层实现;分为两种一种是虚拟层运行在硬件之上(典型框架Vmware ESX),一种是虚拟机运行在操作系统之上(Vmware Workstation);使用Hypervisor实现;

3.3.2容器虚拟化

​ 容器虚拟化实现原理:通过namespace进行各程序的隔离,加上cgroups的控制进行虚拟化;

3.3.2.1namespace

是什么

​ namespace:是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。

​ Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前namespace 里的进程,对其他 namespace 中的进程没有影响。

​ Linux 提供了多个 API 用来操作 namespace,它们是 clone()、setns() 和 unshare() 函数,为了确定隔离的到底是哪项 namespace,在使用这些 API 时,通常需要指定一些调用参数:CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS 和CLONE_NEWCGROUP。如果要同时隔离多个 namespace,可以使用 | (按位或)组合这些参数。

namespace隔离的全局系统资源

​ UTS:主机名和域名,对应参数是CLONE_NEWUTS;

​ IPC:信号量、消息队列、共享内存等进程间通信资源,对应参数是CLONE_NEWIPC;

​ PID:进程编号,对应参数是CLONE_NEWPID ;

​ NETWORK:网络设备、网络栈、端口,对应参数是CLONE_NEWNET;

​ MOUNT:文件系统挂载点,对应参数是CLONE_NEWNS;

​ USER:用户和用户组,对应参数是:CLONE_NEWUSER;

3.3.2.2空间隔离实战

基础知识

1.dd命令,用于读取,转换并输出数据;

dd 参数
#参数包括
#if=文件名:输入文件名;of=文件名:输出文件名;ibs=bytes:一次读入的字节数;obs=bytes:一次输出的字节数;bs=bytes:同时指定输入输出的字节数;cbs=bytes:一次转换的字节数;skip=blocks:从输入文件开头跳过blocks个块之后开始复制;seek=blocks:从输出文件开头跳过blocks个块之后再开始复制;count=blocks:仅拷贝blocks个块;conv=<关键字>:输出文件内容进行转换#如:
#dd if=/dev/zero of=test.img bs=8k count=1024 
#dd if=in.txt of=out.txt conv=ucase

2.mkfs命令,创建Linux文件系统,即格式化;

#如:
#mkfs -t ext4 ./test.img
对此文件进行格式化

3.df命令,显示磁盘使用情况;

df 参数
#-a表示将所有含有0blocks的文件系统显示出来
#-h使用人类可读的方式
#-H与-h类似,但是单位是1000不是1024
#-t限制文件系统的类型
#-T显示文件系统的形式

4.mount命令,加载文件系统到指定的加载点,Windows会自动挂载,但是Linux需要手动挂载;

mount 参数
#-l表示显示已加载的文件系统列表
#device表示指定设备的文件系统
#dir表示挂接到的目录下
#-t可以支持的文件系统,可以自动识别不指定
#-o 可选项 loop将一个文件当作一个磁盘,ro采用只读方式挂接,rw采用只写方式挂接#如
#mount test.img /data/testmymount

5.unshare命令,使用与父程序不共享的命名空间运行程序,即给运行的程序创建一个新的命名空间;

unshare [选项] 程序 [参数]
#-i表示不共享ipc空间
#-m表示不共享mount空间
#-n表示不共享net空间
#-p表示不共享pid空间
#-u表示不共享uts空间
#-U表示不共享user空间
#-V版本查看
#--fork创建一个子进程,执行unshared传入的参数
#--mount-proc表示执行子进程之前将proc优先挂载过去#案例1——uts隔离
unshare -u /bin/bash
#案例2——pid隔离
需要注意应该创建一个子进程,否则会因为新的命名空间会使用unshare的pid作为新空间的父进程,但是空间却看不到unshare进程而无法创建;
unshare --fork --mount-proc -p /bin/bash
#案例3——文件系统隔离
创建-m命名空间,目录和镜像文件,进行挂载;

6.umount 挂载点,取消文件挂载,之后再删除目录即可

3.3.2.3cgroups

是什么

​ cgroups(Control Groups) 是 linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合 ( 或分隔 ) **到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。**简单说,cgroups 可以限制、记录任务组所使用的物理资源。本质上来说,cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。

​ 换句话说就是一堆进程配对不同的配置文件,实现对资源精细化地控制,优先级控制,进程控制,统计

可以控制的子系统:

在这里插入图片描述

3.3.2.4控制组实战

基础知识

1.pidstat命令,用于监控全部或者指定进程的CPU、内存、线程、设备IO等系统资源的占用情况;

pidstat [选项] [时间间隔] [次数]
#-u默认参数,不加选项显示cpu的统计情况
#-r显示内存的统计情况
#-d显示io统计情况
#-p指定进程号,all表示所有进程
#-C指定命令
#-l显示命令名和参数

2.stress命令,压力测试工具;

stress [选项 [参数]]
#-c 进程数,产生n个进程,每个进程循环调用sqrt函数产生CPU压力,用户CPU
#-i 进程数,产生n个进程,每个进程循环调用sync将内存缓冲区内容写到磁盘中产生IO压力,内核CPU
#-m 进程数,产生n个进程,每个进程循环调用malloc/free函数分配和释放内存,--vm-bytes B:指定分配内存大小 --vm-keep:一直占用内存,不释放
#-d 进程数,产生n个进程,每个进程不断执行write和unlink,--hdd-bytes B:指定文件大小
#-t 秒数,n秒结束进程
#-q 程序在运行过程中不进行输出

实操

进行控制需要在控制组目录下创建控制组,进行配置并且挂接,需要注意取消控制并删除目录需要将tasks和cgroup.procs清空,当还是无法删除时,需要退出终端再次进行删除即可

案例1:cgroups信息查看

#版本查看
cat /proc/filesystems|grep cgroup
#子系统查看
cat /proc/cgroups
#挂载信息查看
mount -l|grep cgroup
#查看进程的cgroup限制
cat /proc/$$/cgroup
/sys/fs/cgroup/cpu目录下存放着cpu控制组信息,cpu.cfs_period_us表示时间片的数量,cpu.cfs_quota_us表示可以使用数量,-1表示不受控制;

案例2:使用cgroups对内存进行控制

1.创建控制组
mount |grep cgroup
cd /sys/fs/cgroup/memory
mkdir test_memlimit/
cd test_memlimit/
2.限制内存20m
echo '20971520'>memory.limit_in_bytes
3.将进程添加到控制组中
echo 'pid'>tasks
#当内存不足是进程就会挂掉

案例3:使用cgroups对CPU进行控制

1.创建CPU控制组
mount |grep cgroup
cd /sys/fs/cgroup/cpu
mkdir test_mycpu
cd test_mycpu
2.创建stress进程打满CPU,使用pidstat监控stress
stress -c 1 -q
pidstat -C stress -p ALL -u 2 1000
3.使用控制组对CPU进行限制
cpu.cfs_period_us表示cpu带宽,将CPU的一次运行切成了10万份,每一个是一个时间片
cpu.cfs_quota_us表示控制组中进程可以使用的带宽;
4.将stress添加到控制组当中
echo 'pid'>tasks
#会导致cpu使用率倍限制
3.3.2.5Linux容器——LXC

是什么

​ LXC(LinuX Containers)Linux 容器,一种操作系统层虚拟化技术,为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得 Linux 用户可以容易的创建和管理系统或应用容器;

​ 换句话说就是将软件本身和库以及软件运行所依赖的共享操作系统配置(内核资源)进行打包;通过使用namespace和cgroups技术来调用内核资源;

将LXC以进程的方式运行,内部存放大量的封装好的包,从上往下调用库文件,系统调用,内核中使用namespace和cgroups机制调用内核资源,在向下调用驱动程序;

​ 但是缺点就是将容器放到另一台主机上运行,并不能很好地支持;

3.3.2.6LXC实战

基础知识

常用命令

1.lxc-checkconfig,检查系统环境是否满足容器的使用需要;

lxc-checkconfig

2.lxc-create,创建lxc容器;

​ 模板的路径在/usr/share/lxc/templates/目录下;

lxc-create -n 容器名 -t 模板名称 -- 后面加模板的参数 #-r 表示发行的版本 -a表示CPU架构

3.lxc-start,启动容器;

lxc-start -n 容器名 -d#-d表示在后台运行

4.lxc-ls,列出所有容器,-f表示打印常用的信息;

lxc-ls -f#以表格的形式打印常用信息

5.lxc-info,查看容器相关的信息;

lxc-info -n 容器名

6.lxc-attach,进入容器执行命令;

lxc-attach -n 容器名 命令

7.lxc-stop,停止容器,释放cpu和内存;

lxc-stop -n 容器名

8.lxc-destroy,删除处于停机状态的容器,释放磁盘空间;

lxc-destroy -n 容器名

安装lxc:

1.安装yum源
yum install -y epel-release
2.安装程序
yum install -y lxc lxc-templates bridge-utils lxc-libs libcgroup libvirt lxc-extra debootstrap
3.启动服务
systemctl start lxc
systemctl start libvirtd
systemctl status lxc
systemctl status lxc

实操

案例1:容器的创建;

​ 需要使用root权限执行,容器创建好之后会自动形成一个用户,此用户就是容器中对应的root;

lxc-create -n container1 -t ubuntu -- -r  xenial -a amd64

案例2:设置成后台运行,否则就需要进行登录;

lxc-start -n lxchost1 -d

案例3:进入容器,进入之后可以观察到已经和原宿主机有了很大的差别,已经形成了隔离;

方式一:容器创建好之后的root用户名,ip使用lxc-ls -f查看
ssh 用户名@主机ip
方式二:
lxc-attach -n 容器名 --clear-env -- /bin/bash

案例4:停止容器

lxc-stop -n lxchost1

案例5:释放容器

lxc-destroy -n lxchost1

3.4Docker是什么

3.4.1docker本质

​ 本质就是LXC的增强版,本身不是容器,是容器的易用工具,是使用Go语言实现的一个开源项目;容器是Linux内核中的技术,docker在使用上进行了简易处理;

​ 相较于LXC,不再使用模板来实现容器的创建,而是使用了镜像技术(把一个操作系统用户空间所需要使用到的组件实现编排好,并整体打包成一个文件,image文件),然后将镜像文件集中放在一个仓库中;需要时只要执行命令就可以创建好,变成了基于镜像文件启动容器,使用docker-run,docker-stop实现启动和停止一个容器;

​ 镜像打包,包括应用程序(包括依赖的动态库),配置文件,运行环境(相关开发包),操作系统相关依赖(操作系统库文件)全部分装成一个镜像文件;

​ 优点就是可以支持一次封装,到处运行,通过build,ship,run实现;

3.4.2docker引擎迭代

​ 最早的docker就是对LXC进行了二次包装,也就是容器引擎是LXC;之后形成了自己的容器引擎libcontainer,之后又研发了RunC,截至目前docker的容器引擎还是RunC;而运行时容器引擎是containerd;也就是说现在docker引擎是靠containerd调用RunC来完成容器管理;

3.4.3docker和虚拟机的区别

​ 1.磁盘占用,传统虚拟机占用几到几十GB的空间,而docker容器占用几十到几百MB;

​ 2…CPU和内存占用,传统虚拟机占用高,docker容器占用少,因为docker容器不经过中间的虚拟化层,效率高;另外虚拟化层的实例大小过大,一般是几百MB大小,而docker容器启动之后是一个进程,没有虚拟化实例的消耗;

​ 3.启动速度,传统虚拟机启动慢,docker容器较快;

​ 4.安装管理,传统虚拟机需要专门的运维技术,而docker容器仅需要使用一个命令就可以实现docker的启动和停止;

​ 5.应用部署,传统虚拟机需要手动部署,将将镜像文件拷贝或者是部分文件拷贝部署,而docker容器可以实现自动部署,速度快,如:更新迭代时,生成新的镜像文件上传到仓库中,部署仅需要从仓库中拉取不同的版本即可;

​ 6.隔离性,传统虚拟机是系统级别上的隔离,而docker容器是进程级别的隔离;

​ 7.封装程度,传统虚拟机将整个操作系统进行了封装,而docker容器只需要将应用程序及相关的各种依赖进行打包即可;

3.4.4docker为什么比虚拟机利用率高,启动快

利用率高

​ 1.docker不需要对硬件资源进行虚拟化,运行在docker容器中的程序使用的是实际的物理机资源,不需要创建虚拟机实例占用资源;

​ 2.运行效率高,docker容器中的程序直接靠实际的物理机运行,而传统虚拟机先是经过虚拟层,然后才经过实际物理机运行;

启动快

​ 传统虚拟机需要加载虚拟机实例内核,容器不需要加载内核,而是共用内核的方式运行;

3.4.5docker和JVM虚拟化的区别

​ 1.性能,JVM上的程序运行时需要进行维护抽象出来的虚拟层,换句话说就是除了执行程序的正常逻辑消耗之外,要有部分消耗用来进行虚拟层和函数库层的交互,而docker几乎没有性能上的损失,直接就是调用函数库;

​ 2.虚拟层面,JVM在函数库层,docker在操作系统层;

​ 3.代码无关性,JVM只能支持特定代码的运行,而docker模拟的是操作系统支持任何相同平台的应用程序;

​ 4.隔离性,JVM不涉及隔离主机,只是封装不同操作系统的函数库层差异,对上提供统一的接口,而docker隔离主机,使得不同容器执行时所看到的内容互不可见;

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

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

相关文章

mongodb总概

一、mongodb概述 mongodb是最流行的nosql数据库&#xff0c;由C语言编写。其功能非常丰富&#xff0c;包括: 面向集合文档的存储:适合存储Bson(json的扩展)形式的数据;格式自由&#xff0c;数据格式不固定&#xff0c;生产环境下修改结构都可以不影响程序运行;强大的查询语句…

2 程序的灵魂—算法-2.2 简单算法举例-【例 2.3】

【例 2.3】判定 2000 — 2500 年中的每一年是否闰年&#xff0c;将结果输出。 润年的条件: 1. 能被 4 整除&#xff0c;但不能被 100 整除的年份&#xff1b; 2. 能被 100 整除&#xff0c;又能被 400 整除的年份&#xff1b; 设 y 为被检测的年份&#xff0c;则算法可表示如下…

C语言:定义和使用结构体变量

定义和使用结构体变量 介绍基础用法1.定义结构体2. 声明结构体变量3. 初始化和访问结构体成员4. 使用指针访问结构体成员5. 使用结构体数组 高级用法6. 嵌套结构体7. 匿名结构体8. 结构体和动态内存分配9. 结构体作为函数参数按值传递按引用传递 介绍 在C语言中&#xff0c;结…

Edge怎么关闭快捷键

Edge怎么关闭快捷键 在Edge浏览器中&#xff0c;你可以通过以下步骤关闭快捷键&#xff1a; 打开Edge浏览器&#xff0c;输入&#xff1a;edge://flags 并按下回车键。 在Flags页面中&#xff0c;搜索“快捷键”(Keyboard shortcuts)选项。 将“快捷键”选项的状态设置为“…

dos命令---根据端口查找进程

简介 在日常开发中&#xff0c;常常出现端口被占用的情况&#xff0c;导致程序运行报错&#xff0c;这时可以使用此命令查看哪个进程占用了端口 命令 netstat -ano | findstr 11434返回结果&#xff1a;

【简单介绍下DALL-E2,什么是DALL-E2?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

10.爬虫---XPath插件安装并解析爬取数据

10.XPath插件安装并解析爬取数据 1.XPath简介2.XPath helper安装3.XPath 常用规则4.实例引入4.1 //匹配所有节点4.2 / 或 // 匹配子节点或子孙节点4.3 ..或 parent::匹配父节点4.4 匹配属性4.5 text()文本获取4.6 属性获取4.7 属性多值匹配 1.XPath简介 XPath是一门在XML文档中…

Matlab|混合策略改进的蝴蝶优化算法

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序主要对蝴蝶算法&#xff08;BOA&#xff09;进行改进&#xff0c;参考文献《基于改进蝴蝶优化算法的冗余机器人逆运动学求解》&#xff0c;有如下改进策略&#xff1a; 改进1&#xff1a;采用反向学习策…

手把手带你做一个自己的网络调试助手(1) - TCP服务器准备

程序设计流程图 TCP 服务器 ui界面搭建 Tcp服务器建立连接 - listen() connect() 1.在构造函数中进行如下初始化: 通过 QNetworkInterface 类的 allAddresses 这一API 获得可用IP地址&#xff08;包括IPv4 和 IPv6&#xff09; 然后通过QHostAddress类的 protocol 这一AP…

使用vite从0开始搭建vue项目

使用Vite从0开始创建vue项目 第一步&#xff1a;创建项目目录 mkdir vue-demo -创建目录 cd vue-demo --进入项目 npm init -y --生成package.json文件 第二步&#xff1a;安装vite、typescript--ts、vue、vitejs/plugin-vue--对单文件组件、热重载、生产优化的支持 pnpm…

“三夏”农忙:EasyCVR/EasyDSS无人机技术助推现代农业走向智能化

随着科技的飞速发展&#xff0c;无人机技术已经逐渐渗透到我们生活的方方面面。其中&#xff0c;无人机在农业领域的应用尤为引人注目。它们不仅提高了农业生产的效率&#xff0c;还为农民带来了更便捷、更智能的种植方式。 无人机在农业应用场景中&#xff0c;通过搭载各种设备…

【数据结构】 -- 堆 (堆排序)(TOP-K问题)

引入 要学习堆&#xff0c;首先要先简单的了解一下二叉树&#xff0c;二叉树是一种常见的树形数据结构&#xff0c;每个节点最多有两个子节点&#xff0c;通常称为左子节点和右子节点。它具有以下特点&#xff1a; 根节点&#xff08;Root&#xff09;&#xff1a;树的顶部节…

电脑回收站清空了怎么恢复回来?分享四个好用数据恢复方法

电脑回收站清空了还能恢复回来吗&#xff1f;在使用电脑过程中&#xff0c;很多小伙伴都不重视电脑的回收站,&#xff0c;有用的没用的文件都往里堆积。等空间不够的时候就去一股脑清空回收站。可有时候会发现自己还需要的文件在回收站里&#xff0c;可回收站已经被清空了……那…

YoloV9改进策略:主干网络篇|MobileNetV4主干替换YoloV9的BackBone(独家原创)

摘要 今年&#xff0c;轻量级王者MobileNetV4闪亮登场&#xff01;在我们这篇文章里&#xff0c;我们把MobileNetV4加入到了YoloV9中&#xff0c;对MobileNetV4的层数和卷积层核做了适当的修改&#xff0c;然后替换原有的BackBone。哈哈&#xff0c;你猜怎么着&#xff1f;效果…

基于JSP的医院远程诊断系统

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; JSP Servlet JSPBean 工具&#xff1a; IDEA/Eclipse、Navica…

UltraScale+系列模块化仪器,可以同时用作控制器、算法加速器和高速数字信号处理器

基于 XCZU7EG / XCZU4EG / XCZU2EG • 灵活的模块组合 • 易于嵌入的紧凑型外观结构 • 高性能的 ARM Cortex 处理器 • 成熟的 FPGA 可编程逻辑 &#xff0c;基于 IP 核的软件库 基于 Xilinx Zynq UltraScaleMPSoC 的 FPGA 技术&#xff0c;采用 Xilinx Zynq UltraScale&a…

Mysql基础进阶速成2

看着篇文章之前先看我的前一章&#xff1a;MySQL基础进阶速成1 函数&#xff1a; 每个字段使用一个函数&#xff1a;select 函数(字段名)from 表名 upper&#xff1a;将字符串中的字母大写 lower&#xff1a;将字符串中的字符小写 max&#xff1a;得到最大值 min&#xf…

嵌入式仪器模块:音频综测仪和自动化测试软件

• 24 位分辨率 • 192 KHz 采样率 • 支持多种模拟/数字音频信号的输入/输出 应用场景 • 音频信号分析&#xff1a;幅值、频率、占空比、THD、THDN 等指标 • 模拟音频测试&#xff1a;耳机、麦克风、扬声器测试&#xff0c;串扰测试 • 数字音频测试&#xff1a;平板电…

高考志愿填报:大学学什么专业比较好呢?

准高三一枚&#xff0c;比较迷茫&#xff0c;求推荐一些专业以后比较好就业&#xff0c;发展前景较好的。听说互联网行业比较吃香&#xff0c;有想过以后做运营这一块&#xff0c;但是不知道应该在大学选什么专业&#xff0c;求推荐吧&#xff01; 学什么专业好&#xff1f; 这…

Vitis HLS 学习笔记--global_array_RAM初始化及复位

目录 1. 简介 2. 示例代分析 2.1 源代码 2.2 URAM 不可用 2.3 代码功能解释 2.4 综合报告 2.4.1 顶层控制接口 2.4.2 软件 IO 信息 2.4.3 存储绑定 3. 对比两种 solution 3.1 solution_A 3.2 solution_B 4. 总结 1. 简介 在C程序中&#xff0c;数组是一种基本的…