虚拟化:是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机(对计算机物理资源的抽象,实现资源的模拟,隔离和共享)在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机课运行不同的操作系统,并且应用程序都可以在相互独立的空间运行而 互不影响,从而显著提高计算机的工作效率。
虚拟化使用软件的方法重新定义划分资源,可以实现资源的动态分配,灵活调度,跨域共享,提高资源利用率。
功能:在一个操作系统内,模拟多个操作系统
以软件的方式模拟物理设备的功能
分区:在整个物理服务器上运行多个虚拟机
隔离:在同一服务器上的虚拟机相互隔离
封装:整个虚拟机都保存在文件中,可以通过移动文件的方式迁移
相对硬件独立:无需修改任何服务上运行的虚拟机
基于平台的平台虚拟化
在同一个平台上,可以虚拟多个同一平台,每个平台可以运行自己独立完整的操作系统
基于操作系统 的操作系统虚拟化
把操作系统及其提供的系统调用资源,那虚拟化就表现为操作系统虚拟化。
例如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是一个用于开发、交付、和运行应用程序的开放平台。
在linux容器里运行的开源工具:容器引擎,让开发者可以打包大量的应用及依赖包到一个可移植的镜像中,然后发布到任何流行的linux或者window机器中
下面是一个蓝色的鲸鱼,上面拖着集装箱,鲸鱼可以作为宿主机,集装箱可理解为相互隔离的容器,每个集装i选哪个中都包含自己的应用程序,相互隔离且完整
设计宗旨:Bilid、Ship、and Run Any App,Anywhere
即通过对应用的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的一次封装,到处运行的目的,组件可以是应用、也可以是一套服务,甚至是一个完整的操作系统
docker引擎统一了基础设施环境–docker环境
docker引擎统一了程序打包(装箱)方式,docker镜像(把引擎放在镜像中,带着经i选哪个到处跑
docker引擎统一了程序部署(运行)方式–docker容器(利用引擎把这个镜像再去运行为之前的一摸一样的容器)
镜像:一个面向docker容器引擎的只读模板
容器:从镜像创建的运行实例
仓库:镜像保留的地方
公有仓库:docker官方仓库
私有仓库:个人化、私有化的仓库、
总结:docker时容器管理工具,容器有镜像创建而来,镜像从仓库中获取而来,仓库分为公有、私有。
1:打包应用程序部署简单
2:可脱离底层硬件任意移动(实现了应用的隔离,将应用拆分并进行解耦)例如:需要把服务器从腾讯云迁移到阿里云,如果采用的是 Docker 容器技术,整个迁移的过程只需要在新的服务器上启动我们需要的容器就可以了。
3:适合做为微服务的部署
4:适合持续集成和持续交付(CI/CD)开发到测试到发布
docker Engine是具有以下重要组件的(客户端-服务端)应用程序C-S架构
server:服务器是一种长期运行的程序,称为守护程序进程(docker命令)
client:REST API,他指定程序与可以用来与守护程序进行通信并指示其操作的接口
命令行界面(cLI)客户端((docker命令)。
docker run
docker start
docker rm
六大名称空间
mount | 文件系统,挂载点——>一个文件系统内,不能重复挂载一个指定目录 |
---|---|
user | 操作进程的用户和用户组 |
pid | 进程编号 |
uts | 主机名和主机域 (同一个环境里不能又叫node1又叫node2 |
ipc | 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) |
net (网络资源) | 网络设备、网络协议栈(在同一个网络名称空间中的网络规则)、端口等 |
资源控制------Cgroups
容器特性
docker是一种封装和运行的开源平台,他统一了封装方式,统一了运行方式,开源平台指的是docker引擎,统一的封装方式指的是镜像,统一的运行方式指的是容器。
cgroup资源控制与namespaces两者构成了docker底层原理
docker是一种容器技术,把linux中的cgroups(资源管理)和namespace(名称空间)等容器底层技术进行完美封装,并抽象为用户创建和管理容器的便捷界面(命令行cli、api等),这种C/S架构
Cgroups:资源控制,管理一些系统资源
Namespace:资源隔离(名称空间)
rootfs:文件系统隔离(使用内核提供的rootfs)
容器引擎(用户态工具) :生命周期控制
docker本质就是宿主机的一个进程, docker是通过namespace(命名空间)实现资源隔离,通过cgroup,实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘50og)
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**目录下。
docker把容器化技术做成了标准化平台,只要安装了docker引擎,就能使用docker。
使用docker有什么意义(实现了3个统一)
docker引擎统一了基础设施环境-docker环境——>image——>封装一一个简易的操作系统(3.0+G)
docker引擎统一了 程序打包(装箱/封装-类比于集装箱)方式-docker镜像——>images
docker引擎统—了程序部署(运行)方式-docker容器——>基于镜像——>运行为容器(可运行的环境)
实现了一次构建,多次、多处使用。
(存储引擎)overlay2(现在使用) 和 (存储引擎) aufs(早期使用)叠加式文件系统
es
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
2:安装所需的环境
yum install -y yum-utils device-mapper-persistent-data lvm2
3:设置阿里云的镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4:安装docker-CE社区版并设置开机自启动
yum install -y docker-ce
systemctl start docker.service
systemctl enable docker.service
5:查看docker的版本
docker version
6:验证
docker run hello-world
查看下载到本地的所有镜像
docker images
REPOSITORY:镜像属于的仓库;
TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像,经过md5方式加密过;
CREATED:镜像创建时间;
VIRTUAL SIZE:镜像大小
docker images -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层
查看容器
docker ps-a
CONTAINER ID:容器的ID号
IMAGE:加载的镜像
COMMAND :运行的程序
CREATED :创建时间
STATUS:当前的状态
PORTS:端口映射
NAMES:名称
从镜像仓库中查找镜像
docker search //从docker Hub中查找镜像
一般都选第一个
下载镜像
docker pull +镜像名
查看镜像信息
docker inspect +镜像名 //获取容器、镜像的元数据
以centos7为例,如果没有就拉取一下(docker pull centos:7)
添加镜像标签
docker tag //标记本地镜像,将其归入某一仓库
首先查看之前的镜像列表
查看改之后
删除镜像
docker rmi +镜像名
docker rmi +镜像标签
强制删除:docker rmi -f
删除所有:docker rmi `docker images -q`
若只想删除centos7
docker rmi `docker images |grep centos:7`
镜像导出
docker save -o 文件名 镜像名 //将指定镜像保存成tar归档文件 -o输出到的文件
镜像导入
docker load < centos_7
镜像上传
默认上传到docker Hub 官方公共仓库,需要注册使用公共仓库的账号https://hub.docker.com
可以使用docker login 命令米输入用户名、密码和邮箱米完成注册和登录
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用docker push命令进行上传
步骤:首先在上方的网站上创建账号
给想要上传的镜像添加新的标签
docker tag nginx:latest nginx:q
docker tag 2b7d6430f78d lyy111/nginx:q #指定要上传的镜像的id,要上传的账号名
登陆自己的账号
docker login
上传镜像
docker push lyy111/nginx:q
然后登陆到 docker hub上查看
-a : 显示所有的容器,包括未运行的。
-f : 根据条件过滤显示的内容。
--format : 指定返回值的模板文件。
-l : 显示最近创建的容器。
-n : 列出最近创建的n个容器。
--no-trunc : 不截断输出。
-q : 静默模式,只显示容器编号。
-s : 显示总的文件大小。
docker ps -a
docker ps -as
docker ps -aq
docker create -it cengos:7 /bin/bash //创建一个新的容器但不启动它 #/bin/bash 交互
#选项:
-i : 让容器的标准输入保持打开
-t : 分配一个伪终端
-d : 后台守护进程的方式运行
#去查询容器会发现状态为Created
启动容器
docker start 容器ID
一次性启动
docker run cengos:7 /usr/local/bash -c ls /
#一次性运行centos:7并查看根
再次查看状态,发现状态是关闭的
(退出状态是因为没有设置守护进程,加上-d,并给一个持续性的任务)
docker run -d centos:7 /bin/bash -c "while true;do echo hello;done"
-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 : 绑定一个卷
停止容器
docker stop 容器id
进入容器
1:使用run
docker run -it centos:7 /bin/bash
2:使用exec (容器必须为开启状态)
docker exec -it +id号
如果不开启容器就进入,就会报错
打开容器
进入容器
exec利和shell是两种运行模式
ps
①docker run -it会创建前台进程,但是会在输入exit后终止进程。
②docker attach会通过连接 stdin ,连接到容器内输入输出流,会在输入 exit 后终止容器进程.
③docker exec -it会连接到容器,可以像SSH一样进入容器内部,进行操作,可以通过 exit 退出容器,不影响容器运行。
容器导出(这一步要在容器外面导出,把文件导出到外面,需要退出镜像
docker export 容器id > 文件名
容器导入,生成镜像(
docker import 导出的文件名,(容器)指定镜像名称
docker import 111 centos:7
删除容器
docker rm +id
强制删除正在运行的容器
docker rm -f +id
用普通的方法删除会报错
强制删除
批量删除所容器
docker rm `docker ps -aq`
不做演示,有需要可以自己删库跑路
查询所有当前容器资源消耗信息
docker stats
###设置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