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隔离主机,使得不同容器执行时所看到的内容互不可见;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024050501-重学 Java 设计模式《实战命令模式》

重学 Java 设计模式&#xff1a;实战命令模式「模拟高档餐厅八大菜系&#xff0c;小二点单厨师烹饪场景」 一、前言 持之以恒的重要性 初学编程往往都很懵&#xff0c;几乎在学习的过程中会遇到各种各样的问题&#xff0c;哪怕别人那运行好好的代码&#xff0c;但你照着写完…

C++ ─── STL 以及string

前言&#xff1a;什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架 STL的六大组件 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符…

12.打渔还是晒网

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/17 题目描述 有句俗话叫“三天打渔,两天…

定个小目标之刷LeetCode热题(14)

了解股票的都知道&#xff0c;只需要选择股票最低价格那天购入&#xff0c;在股票价格与最低价差值最大时卖出即可获取最大收益&#xff0c;总之本题只需要维护两个变量即可&#xff0c;minPrice和maxProfit&#xff0c;收益 prices[i] - minPrice,直接用代码描述如下 class …

电阻十大品牌供应商

选型时选择热门的电阻品牌&#xff0c;主要是产品丰富&#xff0c;需求基本都能满足。 所所有的电路中&#xff0c;基本没有不用电阻的&#xff0c;电阻的选型需要参考阻值、精度、封装、温度范围&#xff0c;贴片/插件等参数&#xff0c;优秀的供应商如下&#xff1a; 十大电…

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

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

Diffusers代码学习: 多个Adapter

T2I Adapter也是可组合的&#xff0c;允许您使用多个适配器对图像施加多个控制条件。例如&#xff0c;可以使用姿势贴图提供结构控制&#xff0c;使用深度贴图进行深度控制。这是由[MultiAdapter]类启用的。 让我们用姿势和深度适配器来调节文本到图像的模型。创建深度和姿势图…

区间预测 | Matlab实现LSTM-ABKDE长短期记忆神经网络自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现LSTM-ABKDE长短期记忆神经网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现LSTM-ABKDE长短期记忆神经网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现LSTM-ABKDE长…

面试官:前端实现图片懒加载怎么做?这不是撞我怀里了嘛!

前端懒加载&#xff08;也称为延迟加载或按需加载&#xff09;是一种网页性能优化的技术&#xff0c;主要用于在网页中延迟加载某些资源&#xff0c;如图片、视频或其他媒体文件&#xff0c;直到它们实际需要被用户查看或交互时才进行加载。这种技术特别适用于长页面或包含大量…

【UML用户指南】-12-对高级结构建模-接口、类型和角色

目录 1、名称 2、操作 3、关系 4、理解接口 5、常用建模技术 5.1、对系统中的接缝建模 5.2、对静态类型和动态类型建模 5.2.1、对静态类型建模 5.2.2、对动态类型建模 使接口易于理解和易于访问 接口在关于一个抽象做什么的描述与关于这个抽象如何做的实现之间定义了…

硬盘坏了数据能恢复吗 硬盘数据恢复一般多少钱

在数字化时代&#xff0c;我们的生活和工作离不开电脑和硬盘。然而&#xff0c;硬盘故障是一个常见的问题&#xff0c;可能会导致我们的数据丢失。当我们的硬盘坏了&#xff0c;还能恢复丢失的数据吗&#xff1f;今天我们就一起来探讨关于硬盘坏了数据能恢复吗&#xff0c;硬盘…

ENSP校园网设计实验

前言 哈喽&#xff0c;我是ICT大龙。本次更新了使用ENSP仿真软件设计校园网实验。时间比较着急&#xff0c;可能会有错误&#xff0c;欢迎大家指出。 获取本次工程文件方式在文章结束部分。 拓扑设计 拓扑介绍---A校区 如图&#xff0c;XYZ大学校园网设计分为3部分&#xff0…

ssm629基于SSM的二手交易平台设计与开发+jsp【已测试】

前言&#xff1a;&#x1f469;‍&#x1f4bb; 计算机行业的同仁们&#xff0c;大家好&#xff01;作为专注于Java领域多年的开发者&#xff0c;我非常理解实践案例的重要性。以下是一些我认为有助于提升你们技能的资源&#xff1a; &#x1f469;‍&#x1f4bb; SpringBoot…

【nerf】nvidia-smi

当cmd下nvidia -smi不能使用时候 沿着以下路径打开cmd&#xff0c;再输入&#xff0c;可以查看cuda版本 然后查看电脑安装的

【Redis】什么是Redis缓存 雪崩、穿透、击穿?(一篇文章就够了)

目录 什么是Redis? Redis的正常存储流程&#xff1f; 什么是Redis缓存雪崩&#xff1f; 缓存雪崩 缓存预热 缓存失效时间的随机性 什么是Redis缓存穿透&#xff1f; 缓存穿透 缓存空对象 BloomFilter&#xff08;布隆过滤器&#xff09; 什么是Redis缓存击穿&#…

Segment Anything CSharp| 在 C# 中通过 OpenVINO™ 部署 SAM 模型实现万物分割

​ OpenVINO™ C# API 是一个 OpenVINO™ 的 .Net wrapper&#xff0c;应用最新的 OpenVINO™ 库开发&#xff0c;通过 OpenVINO™ C API 实现 .Net 对 OpenVINO™ Runtime 调用.Segment Anything Model&#xff08;SAM&#xff09;是一个基于Transformer的深度学习模型&#x…

poi4.1导出excel支持xlx,xlsx格式,解决导出execl提示‘文件已经被损坏,无法打开‘

目录 一.maven jar包引入 二.xls格式 三.xlsx格式 一.maven jar包引入 注意&#xff0c;如果要用到xlsx格式&#xff0c;需要导入poi-ooxml <!-- https://mvnrepository.com/artifact/org.apache.poi/poi fx--><!-- 使用xls格式时,只要导入poi-version-yyyymmdd.ja…

Llama模型家族之Stanford NLP ReFT源代码探索 (四)Pyvene论文学习

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

通过双模式对抗提示越狱视觉语言模型

最近&#xff0c;将视觉整合到大型语言模型&#xff08;LLMs&#xff09;中的兴趣显著增加&#xff0c;催生了大型视觉语言模型&#xff08;LVLMs&#xff09;。这些模型结合了视觉和文本信息&#xff0c;如LLaVA和Gemini&#xff0c;已经在包括图像字幕、视觉问题回答和图像检…

「动态规划」打家劫舍的变形题,你会做吗?

213. 打家劫舍 IIhttps://leetcode.cn/problems/house-robber-ii/description/ 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈&#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#x…