Docker与虚拟化
引言:美国环境保护EPA报告曾经统计过一组数据:EPA研究服务器和数据中心的能源效率时发现,实际上服务器只有5%的时间在工作,其他时间一直处于休眠状态。
为了提高服务器的利用率,研发出一种虚拟化技术。
一.虚拟化
1.1虚拟化概述
通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,同时每个逻辑计算机可运行不同的操作系统。应用程序都可以在相互独立的空间内运行而互相不影响,从而提高计算机的工作效率。
①在一个操作系统中(win10)模拟多个操作系统(centos、win10、suse),同时每个操作系统可以跑不同的服务(ngint tomcat),从而实现一台宿主机搭建一个集群(从整体)
②通过软件/应用程序的方式,来实现物理硬件的功能(ensp)
以软件形式实现物理设备的功能(二层交换机、路由器、三层交换机等)
虚拟化将应用程序和系统内核资源进行解耦,以操作系统级别进行隔离,目的是提高资源利用率
1.2cpu时间分片
正常每个任务以轮询的方式去处理,这个时候一个CPU一个整体。
以下是针对的CPU单位时间内的一个资源。按时间划分,1秒划分成10个0.1秒,每个0.1秒可以全力处理10单位的任务。在1秒内,都在全力工作。
cpu 1s全力运转的性能——》逻辑分割成分成了10份,可以理解为在单位时间内可以处理10个任务,每一个0.1s cpu是满的。原先分片前100M以下的任务一次只可以处理1个,现在100M的任务一次可以处理10个。这就是时间分片的一个概念。
虚拟化作用——》缓解/解决了资源利用率的问题
1.3 CPU虚拟化瓶颈
cpu分片后每个任务处理性能会打对折。
如果是50m及50m以下的任务的话,虚拟化后的,1s模拟10个cpu,可以处理10个。虚拟化后的性能更高。
如果是50+m的任务的话,物理硬件的性能就会比虚拟化的性能高了。虚拟化的cpu会卡顿。所以在极度吃资源的情况下,例如mysql高并发这种,就不适合用虚拟化。
1.4 虚拟化工作原理
虚拟机管理器功能:调用资源
两大核心组件:QEMU、KVM
QEMU:
①可以理解为队列,核心目的是调用资源内核中的资源,需要把KVM逻辑分割出来的资源运输给QEMU,再给虚拟机。
②QEMU它并不是直接调用,而是用I/O方式调用,QEMU把资源调用来的过程借用ioctl,QEMU借助libvirt这个工具调用ioctl,再通过接口,给虚拟机应用程序。
KVM:
①用来逻辑分割物理资源,抽象化为虚拟化资源,根据VMM里的配置,会逻辑分割出多少G,给应用程序,去进行虚拟化。
②只接受来自QEMU的请求指令。对于应用程序直接过来的敏感指令会拦截,然后通过接口发给QEMU,让QEMU判断是否需要执行,可以的话,再下来,不可以的话,打回去,不执行该敏感指令。
对于workstation而言——》硬件辅助虚拟化,表现形式在处理器里面有一个虚拟化引擎,可以勾取硬件辅助虚拟化,看到虚拟接口/dev/kvm,可以加强辅助调用,在应用程序需要频繁调用的时候,需要开启。比如openstack。
1.5 虚拟化类型
**全虚拟化:**将物理硬件资源全部通过软件的方式抽象化,最后进行调用
**半虚拟化:**需要修改操作系统
**直通:**直接使用物理硬件资源
全虚拟化:KVM——>>产品vmware—ce
半虚拟化:EXSI——>>workststion vsphere
虚拟化功能
①在一个操作系统内,模拟多个操作系统
② 以软件的方式模拟物理设备的功能
1.6 虚拟化优缺点
优势
①集中化管理(远程管理、维护)
②提高硬件利用率(物理资源利用率低-例如峰值,虚拟化解决了"空闲"容量)
③动态调整机器/资源配置(虚拟化把系统的应用程序和服务硬件分离、提高了灵活性)
④高可靠(可部署额外的功能和方案,可提高透明负载均衡、迁移、恢复复制等应用环境)
劣势
①前期高额费用(初期的硬件支持)
②降低硬件利用率(特定场景-例如极度吃资源的应用不一定适合虚拟化)
③更大的错误影响面(本地物理机down机会导致虚拟机均不可用,同时可能虚拟机中文件全部损坏)
④实施配置复杂、管理复杂((管理人员运维、排障困难)
⑤一定的限制性(虚拟化技术涉及各种限制,必须与支持/兼容虚拟化的服务器、应用程序及供应商结合使用)
⑥安全性(虚拟化技术自身的安全隐患)
一、Docker 概述
- Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源
- Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”
- Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器
Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱
鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序
1、Docker的设计宗旨:
Build,Ship and Run Any App,Anywhere,
即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统
2、容器化越来越受欢迎,因为容器是:
- 灵活:即使是最复杂的应用也可以集装箱化。
- 轻量级:容器利用并共享主机内核。
- 可互换:可以即时部署更新和升级。
- 便携式:可以在本地构建,部署到云,并在任何地方运行。
- 可扩展:可以增加并自动分发容器副本。
- 可堆叠:可以垂直和即时堆叠服务。
• 容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量
• 虚拟机运行的是一个完成的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多
3、Docker与虚拟机的区别:
特性 | Docker容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 几乎无 | 损耗 50%左右 |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 资源隔离/限制 | 完全隔离 |
4、容器在内核中支持2种重要技术:
docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)
二、Docker核心概念
● 镜像
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板
通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件
● 容器
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性
可以把容器看做是要给简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
● 仓库
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取
Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker 目录下。
三、安装 Docker
1.安装
目前 Docker 只能支持 64 位系统。
systemctl stop firewalld.service
setenforce 0
#安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-utils:提供了 yum-config-manager 工具。
device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
#设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装 Docker-CE并设置为开机自动启动
yum makecache fast
yum install -y docker-ce
systemctl start docker.service
systemctl enable docker.service
#查看 docker 版本信息
docker version
2.Docker网络优化
vim /etc/sysctl.conf
net.ipv4.ip_forward=1 #开启路由转发
sysctl -p
systemctl restart network
systemctl restart docker
- 为什么开启路由转发
开启路由转发 是让docker0能根据虚拟机ip为自己所有的docker容器分配虚拟ip
3 docker-server端配置文件
/etc/docker/daemon.json
#在daemon. json文件中配置
{
"graph":"/data/docker", #数据目录,数据存储位置
"storage-driver":"overlay2", #存储引擎,docker1.18以上版本默认使用overlay2存储引擎。早期的适合存储引擎使用的aufs
"insecure-registries":["registry.access.redhat.com","quary.io"], #私有仓库
#registry-mirrors 以下添加
"bip":"172.17.0.1/24", #docker0ip地址,可用ifconfig查看
"exec-opts":["native.cgroupdriver-systemd"], #启动时的额外参数,(是一种挂在驱动,k8s使用)
"live-restore":true #当docker容器引擎挂掉的时候,使用docker跑起来的容器还能继续运行
}
#重启守护进程和docker
systemctl daemon-reload
systemctl restart docker
{
“graph”:“/data/docker”,
“storage-driver”:“overlay2”,
“insecure-registries”:[“registry.access.redhat.com”,“quary.io”],
“registry-mirrors”: [“https://up7x1ecd.mirror.aliyuncs.com”]
“bip”:“172.17.0.1/24”,
“exec-opts”:[“native.cgroupdriver-systemd”],
“live-restore”:true
}
四、Docker 镜像操作
1.#搜索镜像docker search
格式:docker search 关键字