目录
Docker 基础入门
容器化衍生
虚拟化时代 KVM
虚拟化产品
- VMware
- 单机产品:VMware Workstation
- 集群产品:
- 服务端:VCenterServer
- 客户端:VspareClient
- Virtua18ox
- Xen
- ESXI
- KVM
- 磁盘:
- raw (分配多少就占用多少)
- qcow2(可变分配,用多少占多少)
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 公司
容器化和虚拟化对比
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
namespace 和 cgroup
namespace:命名空间(名称空间)
资源隔离
网络、PID进程、系统信号量、文件系统挂载、主机名与域名
[root@localhost ~]# ll /proc/854/ns
total 0
lrwxrwxrwx 1 root root 0 Sep 6 22:20 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0 Sep 6 22:20 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 Sep 6 22:20 net -> net:[4026531956]
lrwxrwxrwx 1 root root 0 Sep 6 22:20 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 Sep 6 22:20 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Sep 6 22:20 uts -> uts:[4026531838]
Linux Namespace 是 Linux系统提供的一种资源隔离机制,可实现系统资源隔离的列表如下:
Mount - 用于隔离文件系统的挂载点
UTS - 用于隔离 HostName 和 DomianName
IPC - 用于隔离进程间通信
PID - 用于隔离进程 ID
Network - 用于隔离网络
User - 用于隔离用户和用户组 UID/GID
cgoup: 资源限制
在操作系统解决了资源相互隔离的问题以后,还需要解决资源限制的问题,也就是避免在同一个操作系统中,防止有些资源消耗较大的容器,将整个物理机器 (宿主机) 的硬件资源 (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 可以对任务进行 运行,挂起,恢复等操作
内存使用
cpu使用
磁盘使用
# 作用
资源限制:例如设定任务指定内存
优先级分配:比如跟任务分配的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 (docker 文件存储)
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 是一个 C/S 结构的服务
docker-server
会暴露出docker-api供客户端连接使用
docker-client
- 图形化
- 命令行
docker 的 C/S 结构的特性
1) Docker客户端是Docker用户与Docker交互的主要方式
2) 当使用Docker命令行运行命令时,Docker客户端将这些命令发送给服务端,服务端执行这些命令
3) Docker命令使用Docker API
4) Docker客户端可以与多个服务端进行通讯
标签:容器,入门,基础,docker01,Docker,root,merged,隔离
From: https://www.cnblogs.com/xiutai/p/17749119.html