虚拟化+docker基础

目录

引言:

一、虚拟化简介

1.1.虚拟化概述

1.2.cpu的时间分片(cpu虚拟化)

1.3.cpu虚拟化性性能瓶颈

1.4.虚拟化工作原理

1.5 虚拟化类型

二、认识容器

2.1 容器的优点

2.2 容器的缺点

三、Docker概述

3.1 Docker是什么

3.2 Docker的设计宗旨

3.3 Docker的优点

3.4  Docker容器和虚拟机的区别

3.5 namespace的6项隔离

3.6 控制组(Control groups)

3.7  Docker的三个核心概念

3.7.1   镜像

3.7.2 容器

3.7.3 仓库

3.8 Docker Engine(引擎)

四、安装Docker

4.1 安装

4.2 配置镜像加速(阿里云) 

4.3  网络优化

4.4 一键安装Docker(脚本) 

五、Dkcoer镜像与容器命令管理 

5.1 镜像命令管理

5.2 容器命令管理 

六、总结

6.1 什么是docker?docker原理?

6.2 简述Docker主要使用的技术?

6.3  简述Docker体系架构?

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

6.5 Docker和VM解决了虚拟机的什么问题?

引言:

  • 以linux而言,linux操作系统会有一个主进程pid=1派生出其他进程来控制不同服务
  • 例如: pid=2 ——> python pid=3——>java pid4——>php,三个服务可能会相互影响
  • 使用者期望将这三个不同的服务,跑在不同的运行时环境中实现相互不影响,同时不会增加服务器成本 延伸出能否将这三种服务分别封装起来也就是KVM虚拟化技术,实现了一个操作系统模拟多个操作系统/不同的运行时环境
  • 随着技术发展,虚拟化技术开销较大(例如:只 要运行一个py脚本,想要使用虚拟化方式实现,还需要安装一个操作系统,并不方便/合理),所以延伸出容器技术

虚拟化层的抽象层(用户层)剥离,使用docker engine来替代(来宾操作系统去除),只要通过引擎就可以直接连接到宿主机操作系统中,极大减小了开销

一、虚拟化简介

1.1.虚拟化概述

虚拟化:将应用程序和系统内核资源进行解耦,以操作系统级别进行隔离,目的是提高资源利用率

1.2.cpu的时间分片(cpu虚拟化)

正常每个任务一轮询的方式去处理,一般是一个CPU为一个整个体

以下是针对的CPU单位时间内的一个资源。按时间划分,1秒划分成10个0.1秒,每个0.1秒可以全力处理10单位的任务。在1秒内,都在全力工作。

cpu 1s全力运转的性能——>逻辑分割成分成了10份,可以理解为在单位时间内可以处理10个任务,每一个0.1s cpu是满的。原先分片前100M以下的任务一次只可以处理1个,现在100M的任务一次可以处理10个。这就是时间分片的一个概念。

虚拟化作用——>缓解/解决了资源利用率的问题

Docker底层原理:namespace + cgroups 

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 虚拟化类型

  1. 全虚拟化:将物理硬件资源全部通过软件的方式抽象化,最后进行调用
  2. 半虚拟化:需要修改操作系统
  3. 直通:直接使用物理硬件资源(需要支持,还不完善)

全虚拟化:KVM——》产品vmware—ce(社区版)

半虚拟化:EXSI——》workststion vsphere

虚拟化功能

①在一个操作系统内,模拟多个操作系统

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

二、认识容器

容器是一种技术,开发人员打包开发完成的一个应用(系统)以及所需的开发环境,然后通过容器可以运行在不同的计算机上面,也不需要重新配置相关环境,不同的是每一台计算机都需要配置运行容器的容器引擎,目前市场上主流就是Docker容器引擎,不过Docker容器引擎的配置很简单,比配置应用(系统)运行的环境简单,方便太多。每台要运行应用(系统)的计算机上面配置了Docker容器引擎之后,都单独独立可以运行之前打包完成的应用(系统)。

2.1 容器的优点

  • 极其轻量:只打包了必要的Bin/Lib;
  • 秒级部署:根据镜像(应用打包文件)的不同,容器的部署大概在毫秒与秒之间(比虚拟机强很多);
  • 易于移植:一次构建,随处部署;
  • 弹性伸缩:Kubernetes、Swam、Mesos这类开源、方便、好使的容器管理平台有着非常强大的弹性管理能力。

2.2 容器的缺点

  • 复杂性增加:随着容器及应用数量的增加,同时也伴随着复杂性的增加。在生产环境中管理如此之多的容器是一个极具挑战性的任务,可以使用 Kubernetes 和 Mesos 等工具管理具有一定规模数量的容器。
  • 原生 Linux 支持:大多数容器技术,比如 Docker,基于 Linux 容器(LXC),相比于在原生 Linux 中运行容器,在 Microsoft 环境中运行容器略显笨拙,并且日常使用也会带来复杂性。
  • 不成熟:容器技术在市场上是相对新的技术,需要时间来适应市场。开发者中的可用资源是有限的,如果某个开发者陷入某个问题,可能需要花些时间才能解决问题。

三、Docker概述

3.1 Docker是什么

  • Docker 是一个开源的应用容器引擎,基于 go 语言开发并遵循了 apache2.0 协议开源。
  • Docker 是在 Linux 容器里运行的开源工具,是一种轻量级的虚拟机。
  • Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。
  • 目前 Docker 只能支持 64 位系统。

3.2 Docker的设计宗旨

  • Docker 的 Logo 设计为蓝色鲸鱼,拖着许多集装箱。鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
  • Docker 的设计宗旨:Build,Ship and Run Any APP,Anywhere

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

3.3 Docker的优点

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

3.4  Docker容器和虚拟机的区别

传统部署——>虚拟机部署——>容器化部署的演变如下图所示:

特性 Docker容器 OpenStack虚拟机
部署难度 非常简单 组件多,部署复杂
启动速度         秒级 分钟级
执行性能 和物理系统一致 VM会占用部分资源
镜像体积 MB级别 GB级别
管理效率 简单 各组件相互依赖,管理复杂
可管理性 单进程 完整的系统管理
网络连接 借助neutron可以灵活组件各类网络管理
性能 接近原生(直接在内核中运行) 50%左右的所示
系统支持量(单机) 上千个 几十个
隔离性 进程级别 操作系统级别
封装程度 直达包项目代码和依赖关系,共享宿主机内核

完整的操作系统,与宿主机隔离

3.5 namespace的6项隔离

docker 本质就是宿主机的一个进程,docker 是通过 namespace 实现资源隔离,通过 cgroup 实现资源限制,通过写时复制技术 copy-on-write 实现了高效的文件操作(类似虚拟机的磁盘比如分配 500G 并不是实际占用物理磁盘 500G)。

namespace 系统调用参数 隔离内容
UTS CLONE_NEWUTS 主机名与域名
IPC CLONE_NEWWIPC 信号量、消息队列和共享内存
PID CLONE_NEWPID 进程编号
NETWORK CLONE_NEWNET 网络设备、网络栈、端口等
MOUNT CLONE_NEWNS 挂载点(文件系统)
UDER CLONE_NEWUSER 用户和组(3.8以后的内核才支持)

3.6 控制组(Control groups)

Linux上的Do侧看人引擎还依赖于另一种称为控制组(Cgroups)的技术,Cgroup将应用和程序限制为一组特定的资源,控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束。Cgroups主要是用作资源控制——可以用来划分时间片

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

3.7  Docker的三个核心概念

3.7.1   镜像

  • Docker 的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。
  • 通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间、库、环境变量和配置文件。
  • Docker 镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远程一样的环境,这也是 Docker 镜像的精髓。

3.7.2 容器

  • Docker 的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
  • 可以把容器看做是一个简易版的 Linux 环境(包括 root 用户权限、镜像空间、用户空间和网络空间等)和运行在其他的应用程序。

3.7.3 仓库

  • Docker 仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用 push 命令将它上传到公有仓库或者私有仓库。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
  • Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker 目录下。

3.8 Docker Engine(引擎)

Docker Engine是具有一下主要组件的C/S客户端——服务器应用程序

Server端:服务器是一种长期运行额程序,称为守护程序进程(dockerd命令)

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

命令行界面(CLI)客户端(Docker命令)

四、安装Docker

4.1 安装


#环境配置
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
 
#安装依赖包
yum -y install yum-utils device-mapper-persistemt-data lvm2
 
#设置阿里云镜像源
cd /etc/yum.repos.d/
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 
#安装 docker-ce 社区版(企业版叫 docker-ee,收费)
yum -y install docker-ce
 
#启动
systemctl enable docker && systemctl start docker

4.2 配置镜像加速(阿里云) 

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://e2jmea9e.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

4.3  网络优化


cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward=1
EOF
 
sysctl -p
systemctl restart network
systemctl restart docker

4.4 一键安装Docker(脚本) 


docker—install.sh 
#!/bin/bash
 
#环境配置
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
 
#安装依赖包
yum -y install yum-utils device-mapper-persistemt-data lvm2
 
#设置阿里云镜像源
cd /etc/yum.repos.d/
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 
#安装 docker-ce 社区版(企业版叫 docker-ee,收费)
yum -y install docker-ce
 
#配置阿里云镜像加速(尽量使用自己的)
#地址 https://help.aliyun.com/document_detail/60750.html
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://e2jmea9e.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
 
#网络优化
cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward=1
EOF
 
sysctl -p
systemctl restart network
systemctl enable docker && systemctl restart docker

注意:docker-server 端配置文件 daemon.json说明 


#生产配置示例,在 daemon.json 中定义
{
        "graph": "/data/docker",
        "storage-driver": "overlay2",
        "insecure-registries": ["registry.access.redhat.com","quary.io"],
        "registry-mirrors": ["https://q"],
        "bip": "172.7.5.1/24",
        "exec-opts": ["native.cgroupdriver=systemd"],
        "live-restore": true
}
 
#参数说明
"graph": "/data/docker",		#指定数据目录
"storage-driver": "overlay2",	#指定存储引擎
"insecure-registries": ["registry.access.redhat.com","quary.io"]	#私有仓库
"registry-mirrors": ["https://q"]	#配置镜像加速
"bip": "172.7.5.1/24",				#docker 网络,中间两位建议和宿主机一样,容器有问题好定位在哪个宿主机	
"exec-opts": ["native.cgroupdriver=systemd"],	#启动时候的额外参数(驱动,k8s使用)
"live-restore": true			#当docker容器引擎挂掉的时候,使用docker跑起来的容器还能运行(分离)
daemon.json————控制守护进程的
*.json(接口之间的通用格式)
        1、不接受注释
        2、键值对的存储方式

五、Dkcoer镜像与容器命令管理 

5.1 镜像命令管理

指令 描述
ls 列出镜像
build 构建镜像来自Dockerfile
history 查看历史镜像
inspect 显示一个或多个镜像的详细信息
pull 从镜像仓库拉取镜像
push 推送一个镜像到仓库
rm 移除一个或多个镜像
prune 一处未使用的的镜像,没有被标记或被任何容器引用的
tag 创建一个引用源镜像标记目标镜像
export 到处容器文件系统到tar归档文件
import 导入容器文件系统tar归档文件创建镜像
save 保存一个或多个镜像到一个tar归档文件
load 加载镜像来自tar归档或标准输入

注意 

  • docker client 客户端连接到了服务端(服务端是以一个守护进程的形式跑在操作系统里面的)restful api 典型的 C/S 架构
  • 由 docker 服务端的守护进程从 docker hub 上下载了镜像(PS:服务端会先检查本地系统是否有这个镜像)
  • 服务端创建了一个新的容器,然后从拉去的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用
  • docker 服务端把这些信息流(传递)返回到客户端并展示出来(展示在终端上)
#查询 docker 版本和信息
docker version
docker info
 
#搜索镜像(可以自己制作镜像上传本地或官网仓库 dockerfile)
docker search <镜像名>
 
#下载镜像
docker pull <镜像名>
 
#查看镜像列表
docker images
 
#查看镜像详细信息
docker inspect <镜像 ID>
 
#给镜像打标签
docker tag <镜像名>:<原标签> <镜像名>:<新标签>
#docker tag nginx:latest nginx:lnmp
 
#删除镜像
docker rmi <镜像名>
docker rmi <镜像标签>
docker rmi <镜像 ID>
docker rmi `docker images -aq`		#删除所有镜像
docker images | awk 'NR>=2{print "docker rmi -f "$3}' | bash
 
#镜像导出
docker save -o <导出的文件名> <镜像名>
#docker save -o nginx_v1 nginx:latest
 
#镜像导入
docker load < [镜像文件]
#docker load < nginx_v1

5.2 容器命令管理 

指令 描述
ls 列出容器
inspect 显示一个或多个容器详细信息
attach 附加本地标准输入,输出和错误到一个运行的容器
attach 在运行容器中执行命令
commit 构建一个新镜像来自一个容器
cp 拷贝文件(夹)到一个容器
logs 获取一个容器日志
port 列出或指定容器端口映射
stats 显示一容器资源使用统计
top 显示一个或多个容器运行的进程
update 更新一个或多个容器配置
stop/start 停止/启动一个或多个容器
rm 删除一个或多个容器
#查询容器
docker ps -a
 
#查看容器占用系统资源信息
docker stats
 
#创建容器
docker create -it nginx:latest /bin/bash
#常用参数说明
> -i 让容器的标准输入保持打开
> -t 分配一个伪终端
> -d 以后台守护进程的方式运行
 
#开启/停止/重启 容器
docker start <容器 ID>
docker stop <容器 ID>
docker restart <容器 ID>
 
#后台运行,指定容器名称为 test
docker run -itd --name test nginx:latest /bin/bash
 
#进入容器
docker exec -it <容器 ID> /bin/bash		#exit 退出
 
#容器 导出/导入
docker export [容器 ID] > [文件名]
docker import [容器文件名] [指定镜像名称]		#导入的是镜像
 
#批量停止容器
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash
docker ps -a | awk 'NR>=2{print $1}' | xargs docker stop
 
#批量删除容器
docker rm -f `docker ps -aq`
docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
docker ps -a | awk 'NR>=2{print $1}' | xargs docker rm -f
 
#批量删除 "exit" 状态(指定状态)的容器
for i in `docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i;done
 
#查看容器进程号
docker inspect -f '{
   
   {.State.Pid}}' <容器名>
docker inspect -f '{
   
   {.State.Pid}}' <容器 ID>
 
##进入容器没有 systemctl 命令解决
添加 --privileged=true(指定此容器是否为特权容器),使用此参数,则不能用 attach。
> 示例:
docker run -itd --name test3 --privileged=true centos /sbin/init
 
`/sbin/init 内核启动时主动呼叫的第一个进程`
 
可以使用 docker inspect <容器ID>
docker ps -a
docker exec -it <容器ID> /bin/bash
yum install httpd -y
systemctl status httpd

docker 在后台的标准运行过程: 

  1. 检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
  2. 利用镜像创建并启动一个容器;
  3. 分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
  4. 从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
  5. 分配一个地址池中的IP地址给容器;
  6. 执行用户指定的应用程序,执行完毕后容器被终止运行。

六、总结

6.1 什么是docker?docker原理?

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

6.2 简述Docker主要使用的技术?

  • Cgroups:资源控制,管理一些系统资源
  • Namespace:资源隔离(名称空间)
  • rootfs:文件系统隔离(使用内核提供的rootfs)
  • 容器引擎(用户态工具) :生命周期控制

docker本质就是宿主机的一个进程, docker是通过namespace(命名空间)实现资源隔离,通过cgroup,实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘50og)

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

6.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**目录下。

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

  • docker把容器化技术做成了标准化平台,只要安装了docker引擎,就能使用docker。
  • 使用docker有什么意义(实现了3个统一)

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

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

6.5 Docker和VM解决了虚拟机的什么问题?

  • docker解决了VM的一个环境孤岛问题
  • docker可以自定义传参(创建——创建镜像/容器、启动(基于镜像启动之前)) 

猜你喜欢

转载自blog.csdn.net/weixin_67470255/article/details/125753047
今日推荐