• 虚拟化+docker基本概念以及安装部署


    虚拟化+docker基本概念以及安装部署

    一:虚拟化介绍

    1:概念

    虚拟化:是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机(对计算机物理资源的抽象,实现资源的模拟,隔离和共享)在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机课运行不同的操作系统,并且应用程序都可以在相互独立的空间运行而 互不影响,从而显著提高计算机的工作效率。

    虚拟化使用软件的方法重新定义划分资源,可以实现资源的动态分配,灵活调度,跨域共享,提高资源利用率。

    功能:在一个操作系统内,模拟多个操作系统

    以软件的方式模拟物理设备的功能

    2:虚拟化的本质

    分区:在整个物理服务器上运行多个虚拟机

    隔离:在同一服务器上的虚拟机相互隔离

    封装:整个虚拟机都保存在文件中,可以通过移动文件的方式迁移

    相对硬件独立:无需修改任何服务上运行的虚拟机

    3:虚拟化分类

    基于平台的平台虚拟化

    在同一个平台上,可以虚拟多个同一平台,每个平台可以运行自己独立完整的操作系统

    基于操作系统 的操作系统虚拟化

    把操作系统及其提供的系统调用资源,那虚拟化就表现为操作系统虚拟化。

    例如linux容器虚拟化技术,就是在同一个linux操作系统上,虚拟出多个同样的操作系统,每个应用认为自己运行在一个独立的os

    虚拟化管理程序Hypervisor(VMM)

    一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件,也称VMM(Virtual Machine Monitor),即虚拟机监视器。
    hypervisor是一种在虚拟环境中的“元”操作系统。它们可以访问服务器上包括磁盘和内存在内的所有物理设备。hypervisor不但协调着这些硬件资源的访问,也同时在各个虚拟机之间施加防护。当服务器启动并执行hypervisor时,它会加载所有虚拟机客户端的操作系统,同时会分配给每一台虚拟机适量的内存、CPU、网络和磁盘

    虚拟机管理器功能:调用资源

    两大核心组件:QEMU、KVM

    QEMU:可以理解为队列,核心目的是调用资源内核中的资源,需要把KVM逻辑分割出来的资源运输给QEMU,再给虚拟机,并不能直接调用,而是用i/o方式调用,QEMU把资源调用来的过程借用ioctl,QEMU借助libvirt,再通过接口,给虚拟机应用程序。

    KVM:用来逻辑分割物理资源,抽象化为虚拟化资源,根据vmm里的配置,会逻辑分割出多少G,给应用程序,去进行虚拟化

    只接受来自QEMU的请求指令,对于 应用程序直接过来的铭感指令会拦截,然后通过接口发给QEMU,让QEMU判断是否需要执行,可以的话,再下来,不可以的话,打回去,不执行该敏感指令

    半虚拟化

    对客户端操作系统的内核进行修改,将运行在Ring0上指令转为调用Hypervisor

    硬件辅助全虚拟化:表现形式在处理器里面有一个虚拟化引擎,可以勾取硬件辅助虚拟化,看到虚拟接口、dev/kvm,可以机枪辅助调用,在应用程序需要频繁调用的时候,需要开启,比如openstack

    全虚拟化:将物理硬件资源全部通过软件的方式抽象化,最后进行调用

    kvm》》产品vmware

    半虚拟化:需要修改操作系统

    exsi》》workstation vsphere

    直通:直接使用物理硬件资源

    二:docker

    docker是一种轻量级的虚拟机,docker是一个用于开发、交付、和运行应用程序的开放平台。

    在linux容器里运行的开源工具:容器引擎,让开发者可以打包大量的应用及依赖包到一个可移植的镜像中,然后发布到任何流行的linux或者window机器中

    logo设计

    image-20220905171441500

    下面是一个蓝色的鲸鱼,上面拖着集装箱,鲸鱼可以作为宿主机,集装箱可理解为相互隔离的容器,每个集装i选哪个中都包含自己的应用程序,相互隔离且完整

    设计宗旨:Bilid、Ship、and Run Any App,Anywhere

    即通过对应用的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的一次封装,到处运行的目的,组件可以是应用、也可以是一套服务,甚至是一个完整的操作系统

    使用docker的意义

    docker引擎统一了基础设施环境–docker环境

    docker引擎统一了程序打包(装箱)方式,docker镜像(把引擎放在镜像中,带着经i选哪个到处跑

    docker引擎统一了程序部署(运行)方式–docker容器(利用引擎把这个镜像再去运行为之前的一摸一样的容器)

    docker三大核心

    镜像:一个面向docker容器引擎的只读模板

    容器:从镜像创建的运行实例

    仓库:镜像保留的地方

    公有仓库:docker官方仓库

    私有仓库:个人化、私有化的仓库、

    总结:docker时容器管理工具,容器有镜像创建而来,镜像从仓库中获取而来,仓库分为公有、私有。

    使用场景

    1:打包应用程序部署简单

    2:可脱离底层硬件任意移动(实现了应用的隔离,将应用拆分并进行解耦)例如:需要把服务器从腾讯云迁移到阿里云,如果采用的是 Docker 容器技术,整个迁移的过程只需要在新的服务器上启动我们需要的容器就可以了。

    3:适合做为微服务的部署

    4:适合持续集成和持续交付(CI/CD)开发到测试到发布

    image-20220905172724123

    docker引擎

    docker Engine是具有以下重要组件的(客户端-服务端)应用程序C-S架构

    server:服务器是一种长期运行的程序,称为守护程序进程(docker命令)

    client:REST API,他指定程序与可以用来与守护程序进行通信并指示其操作的接口

    命令行界面(cLI)客户端((docker命令)

    docker run

    docker start

    docker rm

    image-20220905173656319

    1. 客户端发起各种各样的命令,给与主机
    2. 主机会调用镜像,如果有镜像直接用,运行为容器
    3. 如果镜像里没有会到registry公共仓库去拉去镜像,拉到本地后再运行为容器

    image-20220905173752336

    六大名称空间

    Namespace:资源隔离(名称空间)

    mount文件系统,挂载点——>一个文件系统内,不能重复挂载一个指定目录
    user操作进程的用户和用户组
    pid进程编号
    uts主机名和主机域 (同一个环境里不能又叫node1又叫node2
    ipc信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间)
    net (网络资源)网络设备、网络协议栈(在同一个网络名称空间中的网络规则)、端口等

    资源控制------Cgroups

    • 六种名称空间是由cgroups管理的
    • 最后一种centos的cgroups管理版本是3.8版本,3.6和3.5用不了
    • cgroups 管理linux内核态中资源管理的模块
    • cgroups 管理一些系统资源
    • 不是docker原生的。

    容器特性

    • 灵活:即使是最复杂的应用也可以集装箱化。
    • 轻量级:容器利用并共享主机内核。
    • 可互换:可以即时部署更新和升级。
    • 便携式:可以在本地构建,部署到云,并在任何地方运行。
    • 可扩展:可以增加并自动分发容器副本。
    • 可堆叠:可以垂直和即时堆叠服务。

    Docker和虚拟化的区别

    image-20220905184104458

    • 容器是依赖于内核来隔离,彼此的关系像共享一样,所以安全性较之虚拟机差一些,毕竟不是完全隔离。所以若一个容器被黑客攻破,宿主机基本也就没了。
    • 这里也不是完全没有办法,那就是 cgroup 资源分配,其能提供一定的安全机制

    总结

    1、什么是docker?docker原理?

    docker是一种封装和运行的开源平台,他统一了封装方式,统一了运行方式,开源平台指的是docker引擎,统一的封装方式指的是镜像,统一的运行方式指的是容器。
    cgroup资源控制与namespaces两者构成了docker底层原理
    docker是一种容器技术,把linux中的cgroups(资源管理)和namespace(名称空间)等容器底层技术进行完美封装,并抽象为用户创建和管理容器的便捷界面(命令行cli、api等),这种C/S架构

    2、简述Docker主要使用的技术?

    Cgroups:资源控制,管理一些系统资源
    Namespace:资源隔离(名称空间)
    rootfs:文件系统隔离(使用内核提供的rootfs)
    容器引擎(用户态工具) :生命周期控制
    docker本质就是宿主机的一个进程, docker是通过namespace(命名空间)实现资源隔离,通过cgroup,实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘50og)

    3、简述Docker体系架构?

    Docker客户端 - Docker

    docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。

    Docker服务端-Docker Daemon资源限制

    docker服务端是一个服务进程,管理着所有的容器。

    Docker镜像一Imagefont>

    Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码。运行时间,库,环境变量,和配置文件

    Docker容器-Docker Container

    Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。

    Docker镜像仓库-- Registryfont>

    Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private、常用)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。

    Docker的镜像、容器、日志等内容全部都默认存储在**/var/lib/docker**目录下。

    4、Docker有哪些优势?和虚拟化比有什么优势?

    docker把容器化技术做成了标准化平台,只要安装了docker引擎,就能使用docker。

    使用docker有什么意义(实现了3个统一)
    docker引擎统一了基础设施环境-docker环境——>image——>封装一一个简易的操作系统(3.0+G)
    docker引擎统一了 程序打包(装箱/封装-类比于集装箱)方式-docker镜像——>images
    docker引擎统—了程序部署(运行)方式-docker容器——>基于镜像——>运行为容器(可运行的环境)

    实现了一次构建,多次、多处使用。

    5.如何把多个目录挂载到同一个目录下?

    (存储引擎)overlay2(现在使用) 和 (存储引擎) aufs(早期使用)叠加式文件系统
    image-20220905184343127

    es
    docker引擎统—了程序部署(运行)方式-docker容器——>基于镜像——>运行为容器(可运行的环境)

    • 实现了一次构建,多次、多处使用

    docker 的沙箱概念

    沙箱(Sandbox):在计算机安全领域,沙箱是一种程序的隔离运行机制

    1.沙箱是一个虚拟系统程序,沙箱提供的环境相对于每一个运行的程序都是独立的,而且不会对现有的系统产生影响

    2.搭建测试环境,沙箱的应用只能访问自己的应用访问目录,而不能应用之间的资源进行共享,这样就形成了一个相对安全的机制,由于沙箱具有非常良好的独立性、隔离性,所以能够搭建一些具有高风险的软件进行测试,使得应用组件经过Docker的封装,可以随意移植到服务上

    以linux而言,linux操作系统会有一个主进程pid=1,派生出其他进程来控制不同服务
    例如:pid=2—python
       pid=3—java
       pid=4—php
    三个服务可能会相互影响

    使用者期望将这三个不同的服务,跑在不同的运行时环境中实现相互不影响,同时不会增加服务器成本,一次延伸出能否将这三种服务分别封装起来,所以就有了kvm虚拟化技术,实现了一个操作系统模拟多个操作系统/不同的运行时环境,而随着技术发展,虚拟化技术开销较大(例如:只要运行一个py脚本,想要使用虚拟化方式实现,还需要安装一个操作系统,并不方便/合理)由此,延伸出了容器技术,也就是docker等

    三:安装部署

    1:关闭防火墙

    systemctl stop firewalld
    setenforce 0
    
    • 1
    • 2

    2:安装所需的环境

    yum install -y yum-utils device-mapper-persistent-data lvm2
    
    
    • 1
    • 2

    3:设置阿里云的镜像源

    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    • 1

    4:安装docker-CE社区版并设置开机自启动

    yum install -y docker-ce
    systemctl start docker.service
    systemctl enable docker.service
    
    
    • 1
    • 2
    • 3
    • 4

    5:查看docker的版本

    docker version
    
    • 1

    image-20220905184610550

    6:验证

    docker run hello-world
    
    • 1

    image-20220905184704198

    四:基础命令与常见操作

    查看下载到本地的所有镜像

    docker images
    
    • 1

    image-20220905185101432

    REPOSITORY:镜像属于的仓库;
    TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
    IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像,经过md5方式加密过;
    CREATED:镜像创建时间;
    VIRTUAL SIZE:镜像大小
    
    • 1
    • 2
    • 3
    • 4
    • 5

    docker images -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层

    image-20220905191847672

    查看容器

    docker ps-a
    
    • 1

    image-20220905185450005

    CONTAINER ID:容器的ID号
    IMAGE:加载的镜像
    COMMAND :运行的程序
    CREATED :创建时间
    STATUS:当前的状态
    PORTS:端口映射
    NAMES:名称
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    从镜像仓库中查找镜像

    docker search   //从docker Hub中查找镜像
    
    • 1

    image-20220905191409860

    一般都选第一个

    下载镜像

    docker pull +镜像名
    
    • 1

    image-20220905191734218

    查看镜像信息

    docker inspect +镜像名      //获取容器、镜像的元数据
    
    • 1

    以centos7为例,如果没有就拉取一下(docker pull centos:7)

    image-20220905192455507

    添加镜像标签

    docker tag    //标记本地镜像,将其归入某一仓库
    
    • 1

    首先查看之前的镜像列表

    image-20220905192715772

    查看改之后

    image-20220905192824246

    删除镜像

    docker rmi +镜像名
    docker rmi +镜像标签
    
    • 1
    • 2

    image-20220905193350566

    强制删除:docker rmi -f 
    删除所有:docker rmi `docker images -q`
    若只想删除centos7
    docker rmi `docker images |grep centos:7`
    
    • 1
    • 2
    • 3
    • 4

    镜像导出

    docker save -o 文件名 镜像名  //将指定镜像保存成tar归档文件  -o输出到的文件
    
    • 1

    image-20220905195032770

    镜像导入

    docker load < centos_7
    
    • 1

    image-20220905195535547

    镜像上传

    默认上传到docker Hub 官方公共仓库,需要注册使用公共仓库的账号https://hub.docker.com

    可以使用docker login 命令米输入用户名、密码和邮箱米完成注册和登录

    在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用docker push命令进行上传

    步骤:首先在上方的网站上创建账号

    给想要上传的镜像添加新的标签

    docker tag nginx:latest nginx:q
    
    • 1

    image-20220906201826923

    image-20220906202130372

    docker tag 2b7d6430f78d  lyy111/nginx:q		#指定要上传的镜像的id,要上传的账号名
    
    • 1

    登陆自己的账号

    docker login
    
    • 1

    image-20220906202534990

    上传镜像

    docker push lyy111/nginx:q
    
    • 1

    image-20220906202654838

    然后登陆到 docker hub上查看

    image-20220906202751346

    image-20220906202828774

    容器操作

    1:查询容器

    -a :			显示所有的容器,包括未运行的。
    -f :			根据条件过滤显示的内容。
    --format :		指定返回值的模板文件。
    -l :			显示最近创建的容器。
    -n :			列出最近创建的n个容器。
    --no-trunc :	不截断输出。
    -q :			静默模式,只显示容器编号。
    -s :			显示总的文件大小。
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    docker ps -a
    
    • 1

    image-20220905195808056

    查看容器大小

    docker ps -as
    
    • 1

    image-20220905200358233

    查看编号

    docker ps -aq
    
    • 1

    image-20220905200501666

    创建容器

    docker create  -it cengos:7 /bin/bash   //创建一个新的容器但不启动它  #/bin/bash 交互
    
    #选项:
    -i :	让容器的标准输入保持打开
    -t :	分配一个伪终端
    -d :	后台守护进程的方式运行
    
    
    #去查询容器会发现状态为Created
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    image-20220905201141523

    启动容器

    docker  start 容器ID
    
    
    • 1
    • 2

    image-20220905202135061

    一次性启动

    docker run cengos:7 /usr/local/bash -c ls /
    #一次性运行centos:7并查看根
    
    • 1
    • 2

    image-20220905202521819

    再次查看状态,发现状态是关闭的

    image-20220905202654489

    (退出状态是因为没有设置守护进程,加上-d,并给一个持续性的任务)

    docker run -d centos:7 /bin/bash -c "while true;do echo hello;done"
    
    • 1

    image-20220905203324731

    -a stdin : 	指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
    
    -d : 	后台运行容器,并返回容器ID;
    
    -i : 	以交互模式运行容器,通常与 -t 同时使用;
    
    -P : 	随机端口映射,容器内部端口随机映射到主机的端口
    
    -p :	 指定端口映射,格式为:主机(宿主)端口:容器端口
    
    -t : 	为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    
    --name="nginx-lb" :			 为容器指定一个名称;
    
    --dns 8.8.8.8 :	 			指定容器使用的DNS服务器,默认和宿主一致;
    
    --dns-search example.com :	 指定容器DNS搜索域名,默认和宿主一致;
    
    -h "mars" : 				指定容器的hostname;
    
    -e username="ritchie" : 	设置环境变量;
    
    --env-file=[] : 			从指定文件读入环境变量;
    
    --cpuset="0-2" or --cpuset="0,1,2" : 	绑定容器到指定CPU运行;
    
    -m :						设置容器使用内存最大值;
    
    --net="bridge" : 			指定容器的网络连接类型,支持 bridge/host/none/container : 四种类型;
    
    --link=[] : 				添加链接到另一个容器;
    
    --expose=[] : 				开放一个端口或一组端口;
    
    --volume , -v : 			绑定一个卷
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    停止容器

    docker stop 容器id
    
    • 1

    image-20220905203452268

    image-20220905203432073

    进入容器

    1:使用run
    docker run -it centos:7 /bin/bash
    
    • 1
    • 2

    image-20220905224001798

    image-20220905224019971

    2:使用exec (容器必须为开启状态)
    docker exec -it +id号
    
    
    • 1
    • 2
    • 3

    如果不开启容器就进入,就会报错

    image-20220905224307549

    打开容器

    image-20220905224600565

    进入容器

    image-20220905224703870

    exec利和shell是两种运行模式
    ps
    ①docker run -it会创建前台进程,但是会在输入exit后终止进程。
    ②docker attach会通过连接 stdin ,连接到容器内输入输出流,会在输入 exit 后终止容器进程.
    ③docker exec -it会连接到容器,可以像SSH一样进入容器内部,进行操作,可以通过 exit 退出容器,不影响容器运行。

    容器导出(这一步要在容器外面导出,把文件导出到外面,需要退出镜像

    docker export 容器id > 文件名
    
    
    • 1
    • 2

    image-20220905232133913

    容器导入,生成镜像(

    docker import 导出的文件名,(容器)指定镜像名称
    docker import 111 centos:7
    
    • 1
    • 2

    image-20220905231410087

    删除容器

    docker rm +id
    
    
    • 1
    • 2

    image-20220905232325202

    强制删除正在运行的容器

    docker rm -f +id
    
    • 1

    用普通的方法删除会报错

    image-20220905232501832

    强制删除

    image-20220905232638324

    批量删除所容器

    docker rm `docker ps -aq`
    不做演示,有需要可以自己删库跑路
    
    • 1
    • 2

    查询所有当前容器资源消耗信息

    docker stats
    
    • 1

    image-20220905232948469

    当日志占满之后如何处理


    ###设置docker日志文件数量及每个日志大小
    vim /etc/docker/daemon.json
    {
    “registry-mirrors”: [“http://f613ce8f.m.daocloud.io”],
    “log-driver”: “json-file”,
    “log-opts”: { “max-size” : “500m”, “max-file” : “3”}
    }

    修改完需要重新加载 systemctl daemon-reload systemctl restart docker

  • 相关阅读:
    寒亭5.8万亩盐碱稻 国稻种芯·中国水稻节:山东潍坊插秧期
    如何使用ArcGIS去除卫星影像上的云
    Elasticsearch:使用 Elasticsearch 进行语义搜索
    Mac连接U盘后怎么读取 Mac连接U盘后怎么取消只读模式
    docker常用操作命令
    云服务器部署Springboot项目
    2022下半年(软考中级)系统集成项目管理工程师备考开班啦!
    echarts图表 实现高度按照 内容撑起来或者超出部分滚动展示效果
    【3】c++设计模式——>UML表示类之间的关联关系
    ①常用API----Math
  • 原文地址:https://blog.csdn.net/H_YANG__/article/details/126924001