Docker基础入门

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

img

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 公司

容器化和虚拟化对比

image-20230907152726197

image-20230719201156490

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

image-20230907151226472

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

实际上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客户端可以与多个服务端进行通讯

image-20230907151838441

posted @ 2023-10-08 15:07  普里莫  阅读(56)  评论(0)    收藏  举报