文章目录
展开Docker基础入门
容器化衍生
KVM
虚拟化产品
- VMware
- 单机产品:VMware Workstation
- 集群产品:
- 服务端:VCenterServer
- 客户端:VspareClient
- Virtua18ox
- Xen
- ESXI
- KVM
- 磁盘:
- raw (分配多少就占用多少)
- qcow2(自动扩容的磁盘格式,分20G实际在不使用时不会占用20G,最大到20G,用多少占多少)
OpenStack(编排 KVM 的工具)
- Nova:资源调度、资源计算
- Keystone:各个组件之间的认证
- glance:镜像存储
- neutron:网络(flat 扁平网络模式)
- horizon:Dashboard 仪表盘,图形化界面
一张图理解 IAAS、PAAS、SAAS
iaas:基础硬件服务(机房)——所有云厂商和运营商的大头;(华为卖路由交换服务器、阿里卖服务——云服务器)
paas:平台即服务;可以看10个RDS的信息,运行状态,负载,DB连接数,进去修改table,DB,字段(Docker k8s)
saas:软件即服务,(RDS=saas软件,财务软件、CRM、自动化运维平台)
daas:数据即服务——大数据
*aas:as a service ..即服务
Docker 介绍
什么是docker?
Docker 是Docker.Inc公司开源的,一个基于LXC技术之上构建的Container容器引擎,源码托管在GitHub上,基于Go语言,并基于Apache2.0协议开源。
Docker是通过内核虚拟化技术(namespace及cgroup等)来提供容器的资源隔离与安全保障等。
由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
演变过程
LXC -> libcontainer
- runC
- Docker 是 Docker.Inc 公司开源 封装 Docker
- CRI-O
- Containerd
- runV
只要能运行容器的都叫容器运行时
编排工具
Docker-swarm:原生公司
K8S:Google 公司
容器化和虚拟化对比
传统虚拟化和docker分层对比
VM 虚拟化和 Docker 特性对比
特性 | Docker | KVM |
---|---|---|
启动速度 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于原生 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
隔离性 | 安全隔离 | 完全隔离 |
什么是容器
容器是隔离的环境中运行的一个进程,如果进程结束,容器就会停止,容器的隔离环境,拥有自己的ip地址,系统文件,主机名,进程管理
Docker基本实现原理
通过三个方面实现容器化技术的前置:
1) 操作系统的NameSpace 隔离系统资源技术,通过隔离网络、PID进程、系统信号量、文件系统挂载、主机名与域名, 来实现在同一宿主机系统中,运行不同的容器,而每个容器之间相互隔离,运行互不干扰。
2) 使用系统的Cgroups系统资源配额功能, 限制资源包括: CPU、Memory、Blkio(块设备)、Network。
3)通过OverlayFS数据存储技术, 实现容器镜像的物理存储与新建容器存储
NameSpace和Cgroup介绍(不是docker的也不是k8s的是内核的)
namespace :资源隔离
参考 https://man7.org/linux/man-pages/man7/namespaces.7.html
当一台物理主机(宿主机)运行容器的时候, 为了避免容器所需系统资源之间相互干扰。所以Docker利用操作系统的隔离技术-NameSpace, 来实现在同一个操作系统中,不同容器之间的资源独立隔离运行。
Linux Namespace 是 Linux系统提供的一种资源隔离机制,可实现系统资源隔离的列表如下:
Mount - 用于隔离文件系统的挂载点
UTS - 用于隔离 HostName 和 DomianName
IPC - 用于隔离进程间通信
PID - 用于隔离进程 ID
Network - 用于隔离网络
User - 用于隔离用户和用户组 UID/GID
查看系统资源隔离
## 查找进程
[root@docker01 ~]# ps -aux | grep sshd
root 837 0.0 0.4 112900 4332 ? Ss 15:36 0:00 /usr/sbin/sshd -D
## 查看NS
[root@docker01 ~]# ll /proc/837/ns/
total 0
lrwxrwxrwx 1 root root 0 Sep 7 16:45 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0 Sep 7 16:45 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 Sep 7 16:45 net -> net:[4026531956]
lrwxrwxrwx 1 root root 0 Sep 7 16:45 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 Sep 7 16:45 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Sep 7 16:45 uts -> uts:[4026531838]
Cgroup:资源限制
在操作系统解决了资源相互隔离的问题以后,还需要解决资源限制的问题,也就是避免在同一个操作系统中,防止有些资源消耗较大的容器,将整个物理机器(宿主机)的硬件资源(CPU, Memory) 占满。
在Linux 系统中能够控制的资源列表如下:
参数说明参考: https://man7.org/linux/man-pages/man7/cgroups.7.html
memory - 内存限制
hugetlb - huge pages 使用量
cpu - 限制CPU 使用率
cpuacct - 统计 cgroups 中的进程的CPU使用报告
cpuset - 绑定 cgroups 到指定 CPUs 和 NUMA 节点
innodb_lock_wait_timeout - block设备的 IO 速度
net_cls - 网络接口设置优先级
devices - mknode 访问设备权限
freezer - suspend 和 restore cgroups 进程
perf_event - 性能监控
pids - 限制子树 cgroups 总进程数
作用:
资源限制:例如设定任务指定内存
优先级分配:比如跟任务分配的CPU时间,片数,磁盘IO,带宽大小来控制任务的优先级
资源统计:统计CPU,内存,IO等资源使用时长,该功能比较适合用于计费
任务控制:cgroup可以对任务进行 运行,挂起,恢复等操作
查看系统实现的限制资源
[root@docker01 ~]# cat /proc/cgroups
#subsys_name hierarchy num_cgroups enabled
cpuset 4 1 1
cpu 3 1 1
cpuacct 3 1 1
memory 11 1 1
devices 5 17 1
freezer 7 1 1
net_cls 2 1 1
blkio 6 1 1
perf_event 8 1 1
hugetlb 10 1 1
pids 9 1 1
net_prio 2 1 1
docker 三个重要的概念
理论上来说,镜像是不可写的,只读,不可以修改
实际上lower层是可以修改的
# 例:
装某些容器后就可以互相进行通信
原理:是在安装容器的时候,在lower层创建了一个hosts文件
OverlayFS
OverlayFS是一种堆叠文件系统,它依赖并建立在其它的文件系统之上(例如ext4fs和xfs等),并不直接参与磁盘空间结构的划分,仅仅将原来系统文件中的文件或者目录进行"合并一起", 最后向用户展示"合并"的文件是在同一级的目录, 这就是联合挂载技术, 相对于AUFS(<1.12早期使用的存储技术), OverlayFS速度更快,实现更简单。
Linux内核为Docker提供的OverlayFS驱动有两种:Overlay和Overlay2。而Overlay2是相对于Overlay的一种改进,在Inode利用率方面比Overlay更有效。但是Overlay有环境需求:Docker版本17.06.02+,宿主机文件系统需要是EXT4或XFS格式。
OverlayFS 实现方式
OverlayFS通过三个目录:lower目录、upper目录、以及work目录实现,其中lower目录可以是多个, upper目录为可以进行读写操作的目录, work目录为工作基础目录,挂载后内容会被清空,且在使用过程中其内容用户不可见,最后联合挂载完成给用户呈现的统一视图称为merged目录。
lower层 不可写,只读
upper层 容器 可读写
merge层 容器目录 在容器中修改时是在upper层修改
如果没有upper层的话,merge层就是只读的
1.创建文件
[root@docker01 ~]# mkdir /lower{1..3}
[root@docker01 ~]# mkdir /upper /work /merged
2.挂载文件系统
[root@docker01 ~]# mount -t overlay overlay -o lowerdir=/lower1:/lower2:/lower3,upperdir=/upper,workdir=/work /merged
3.查看挂载
[root@docker01 ~]# mount | grep merged
overlay on /merged type overlay (rw,relatime,lowerdir=/lower1:/lower2:/lower3,upperdir=/upper,workdir=/work)
4.在/upper 目录中写入文件,在merged中可以显示
[root@docker01 ~]# touch /upper/1.txt
[root@docker01 ~]# ll /merged/
total 0
-rw-r--r-- 1 root root 0 Sep 7 17:02 1.txt
5. 在merged中写入文件, 实际存储到了/uppper
[root@docker01 ~]# touch /merged/2.txt
[root@docker01 ~]# ll /upper/
total 0
-rw-r--r-- 1 root root 0 Sep 7 17:02 1.txt
-rw-r--r-- 1 root root 0 Sep 7 17:03 2.txt
注:如果没有upperdir, merged是只读的
[root@docker01 ~]# umount /merged
[root@docker01 ~]# mount -t overlay overlay -o lowerdir=/lower1:/lower2 /merged
[root@docker01 ~]# touch /merged/3.txt
touch: cannot touch ‘/merged/3.txt’: Read-only file system
Image 镜像
Docker镜像可以看做是一个特殊的文件系统,除了提供容器运行时所需要的程序、库、资源、配置文件以外,还包含了一些为运行时,准备的配置参数(匿名卷,环境变量,用户等),镜像是不可更改的
为了复用存在的
Container 容器
容器的定义和镜像,几乎是一模一样,唯一区别在于容器的最上面那一层是可读可写的。
Repository 仓库
仓库是Docker用来存放镜像的地方,类似于我们之前常用的代码仓库
通常一个仓库会包含,同一个软件,不同版本的镜像
我们可以通过<仓库名>:<标签>格式来指定具体使用哪个版本的镜像,如果不给标签,那么默认以Latest作为默认标签
公有仓库
docker官方仓库
私有仓库
Docker 的组成
Docker镜像可以看做是一个特殊的文件系统,除了提供容器运行时所需要的程序、库、资源、配置文件以外,还包含了一些为运行时,准备的配置参数(匿名卷,环境变量,用户等),镜像是不可更改的
为了复用存在的
容器的定义和镜像,几乎是一模一样,唯一区别在于容器的最上面那一层是可读可写的。
Repository 仓库
仓库是Docker用来存放镜像的地方,类似于我们之前常用的代码仓库
通常一个仓库会包含,同一个软件,不同版本的镜像
我们可以通过<仓库名>:<标签>格式来指定具体使用哪个版本的镜像,如果不给标签,那么默认以Latest作为默认标签
公有仓库
docker官方仓库
私有仓库
Docker 的组成
仓库是Docker用来存放镜像的地方,类似于我们之前常用的代码仓库
通常一个仓库会包含,同一个软件,不同版本的镜像
我们可以通过<仓库名>:<标签>格式来指定具体使用哪个版本的镜像,如果不给标签,那么默认以Latest作为默认标签
公有仓库
docker官方仓库
私有仓库
Docker 是一个 C/S 结构的服务
docker-server
会暴露出docker-api供客户端连接使用
docker-client
- 图形化
- 命令行
docker 的 C/S 结构的特性
1) Docker客户端是Docker用户与Docker交互的主要方式
2) 当使用Docker命令行运行命令时,Docker客户端将这些命令发送给服务端,服务端执行这些命令
3) Docker命令使用Docker API
4) Docker客户端可以与多个服务端进行通讯
1) Docker客户端是Docker用户与Docker交互的主要方式
2) 当使用Docker命令行运行命令时,Docker客户端将这些命令发送给服务端,服务端执行这些命令
3) Docker命令使用Docker API
4) Docker客户端可以与多个服务端进行通讯
Comments | NOTHING