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

image-20230907153350594

只要能运行容器的都叫容器运行时

编排工具

Docker-swarm:原生公司

K8S:Google 公司

容器化和虚拟化对比

传统虚拟化和docker分层对比

image-20230907172802660

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 三个重要的概念

image-20230907151226472

理论上来说,镜像是不可写的,只读,不可以修改

实际上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 是一个 C/S 结构的服务

docker-server

会暴露出docker-api供客户端连接使用

docker-client

  • 图形化
  • 命令行

docker 的 C/S 结构的特性

1) Docker客户端是Docker用户与Docker交互的主要方式
2) 当使用Docker命令行运行命令时,Docker客户端将这些命令发送给服务端,服务端执行这些命令
3) Docker命令使用Docker API
4) Docker客户端可以与多个服务端进行通讯

image-20230907172506626