首页 > 其他分享 >Docker基础入门

Docker基础入门

时间:2023-10-08 15:12:18浏览次数:44  
标签:容器 入门 基础 docker01 Docker root merged 隔离

目录

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

标签:容器,入门,基础,docker01,Docker,root,merged,隔离
From: https://www.cnblogs.com/xiutai/p/17749119.html

相关文章

  • Docker 容器使用与打包镜像
    目录Docker容器使用与打包镜像docker创建容器的流程:docker远程连接方式(不安全)docker为何会启动就退出容器容器名词解析docker常用命令docker使用相关命令-容器容器端口映射使用docker运行nginx做小游戏数据卷映射手动制作镜像手动卡前台方法Docker容器使用与打包镜......
  • etcd基础
    etcd是一个分布式、高可用的键值对存储数据库,通过分布式锁、leader选举和写屏障等机制提供安全可靠、高效快速的持久性数据存储和检索。1.etcd集群采用raft协议复制到所有节点保证各节点数据一致性需要半数以上节点正常运行集群才可正常运行只要有一个节点正常运行就可正常读......
  • 2023-2024-1 20231327 司宏林 《计算机基础与程序设计》第2周学习总结
    学期(如2023-2024-1)学号(如:20231300)《计算机基础与程序设计》第X周学习总结作业信息这个作业属于哪个课程<班级的链接>(2022-2023-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/12998......
  • Python入门示例系列20 函数
     函数function函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数built-in,比如print()。也可以自己创建函数,叫做用户自定义函数。 函数的定义(define)和调用(call)掌握函数的定义和调用。定义一个函......
  • Python入门示例系列18 条件控制 Conditional Statements
    Python提供了bool类型来表示真(对)或假(错),比如常见的5>3比较算式,这个是正确的,在程序世界里称之为真(对),Python使用True来代表;再比如4>20比较算式,这个是错误的,在程序世界里称之为假(错),Python使用False来代表。True和False是Python中的关键字,当作为Python代码输入时,一......
  • Python入门示例系列19 循环语句
    Python中的循环语句有for和while。 while语句Python中while语句的一般形式:while判断条件condition:执行语句statements同样需要注意冒号和缩进。另外,在Python中没有do..while循环。以下实例使用了while来计算1到100的总和:sum=0counter=1whilecounte......
  • Python入门示例系列17 输入与输出( 格式化输出 )
    Python入门示例系列17输入与输出 读取键盘输入(input)Python提供了input()内置函数从标准输入(键盘)读入一行文本,默认的标准输入是键盘。返回结果是字符串。>>>astr=input("请输入:");##input('提示的内容')请输入:123>>>print(astr)123 如果从键盘输入两个数字,并求这......
  • Python入门示例系列16 集合
    Python入门示例系列16集合 集合 集合(set)是一个无序的不重复元素序列。可以使用大括号{}或者set()函数创建集合,注意:创建一个空集合必须用set()而不是{},因为{}是用来创建一个空字典。集合是由不同元素组成,所以即便里面的值重复了,也会自动去重。示例:>>>s=set()#创......
  • Python入门示例系列14 元组
    Python入门示例系列14元组 Python的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号(),列表使用方括号[]。元组创建只需要在括号中添加元素,并使用逗号隔开即可。示例:>>>t4=(1,2,3,4)#四个整数的元组>>>t4(1,2,3,4)>>>t1=()#空元祖>>>t1()>>......
  • Python入门示例系列15 字典
    Python入门示例系列15字典 字典的每个键值对用冒号:分隔,每个键值对之间用逗号(,)分隔,整个字典包括在花括号{}d={key1:value1,key2:value2,key3:value3}键必须是唯一的,但值则不必唯一。值可以取任何数据类型,但键必须是不可变的(immutable)数据类型,如字符串,数字。......