Ubantu docker学习笔记(五)容器底层技术

简介: Ubantu docker学习笔记(五)容器底层技术

一、Docker基本架构

docker架构采用标准的c/s架构,服务端用于管理数据,客户端用于用户交互,服务端和客户端可以在同一台机器上面运行,也可以在不同的机器上运行。

1.1 服务端

一般运行于后台,接受客户端的请求,只允许本地的root和docker用户组成员访问,可以通过-H来修改参数监听方式。同时支持HTTPS的方式来验证。

1.2 客户端

用户不可以和服务器直连,需要通过Docker客户端执行命令,与Docker服务器进行交互。与docker服务端不同的是,等待服务器放回的消息,收到消息后会马上结束。再执行的时候,需要再次调用客户端程序。同时可以执行命令指定服务器地址。

可以通过

docker version

去查看链接情况

如果没有则需要指定其到正确通信位置,实例代码如下

docker -H tcp://127.0.0.1:1234 version

二、Namespace

Namespace其实就相当于修改了看待计算机的视图,对于用户看到的线程进行了限制,比如说,我在外面运行了一个进程号为100的centos,但是在centos的内部,其进程号是重新开始计算的

我们通过一个小例子来操作一下

docker run -it centos /bin/bash
ps

在镜像容器内部,我们的进程从1重新开始

ctrl+q+p(退出但不终止容器)
docker ps
ps aux | grep d7ebd94af48f
ps a 显示现行终端机下的所有程序,包括其他用户的程序
ps u 以用户为主的格式来显示程序状况
ps x 显示所有程序,不以终端机来区分

找到刚刚这个镜像的id后,再去去打印其所有进程,很清楚的可以看到,centos的进程号为2799,但是其内部的进程号为1

2.1 Namespace的类别

Linux使用了6种namespace,分别对应6种资源: Mount、 UTS、IPC、PID、Network和User。

1.Mount namespace

其可以将文件系统的目录和另外一个目录关联起来,让容器看上去拥有了一整个文件系统,我们操作只会在当前容器生效不会影响其他容器。

2.UTS namespace

简单的来说可以让容器拥有自己的名字

docker run -h xiaotang -it centos

3.IPC namespace

让容器有共享的内存和信号量,使其在同一Namespace下可以互相通信

4.PID namespace

主要用来隔离我们的进程ID,使其可以重复且相互之间不受影响,也就是我们之前上面的例子啦,如果比喻成父子关系的话也就是,所有的父亲可以看到自己的子进程,子看不到父,楚门的世界啊哈哈哈哈。

5.Network namespace

让我们的容器拥有独立的网卡、ip和路由

6.Usernamespace

主要用来隔离和User权限相关的Linux资源,包括User ID和Group ID,用来管理用户和划分权限。

2.2 Namespace的劣势

1.隔离不彻底

多个容器使用的依旧是宿主机的内核,在windows宿主机上用低版本的Linux运行较高版本的Linux,行不通

2.部分资源不可以被Namespace化

时间,宿主机和容器时间保持一致

3.安全问题

因为共享内核,容器中应用暴露,攻击面大。可以通过一些技术来调整,但通常情况下不知道应该禁用哪些系统调用。

三、Cgroups

虽然我们使用namespace所限制,但是在外部看来,容器里面的进程会是一个整体,和宿主机上其他的资源依旧是竞争关系,因此依据有可能会把所有资源耗尽。Cgroups的设置,可以限制单个进程或者多个进程使用资源分配管理的机制,如上一小节中,我们设置cpu时间以及I/O读取限制,都属于其中的一种。

举个例子吧

docker run -it --cpu-shares 521 progrium/stress -c 1

然后我们

ls  /sys/fs/cgroup/cpu/docker

可以看到会有一个容器进程ip的目录

进入,然后打开里面的

cat cpu.shares

然后就可以看到我们刚刚分配的内存资源

3.1 Cgroups的限制能力

子系统 功能
blkio 该子系统为块设备设定输入/输出限制,如物理设备(磁盘、固态硬盘、USB 等 )。
cpu 该子系统使用调度程序提供对 CPU的 Cgroups 任务访问
cpuacct 该子系统自动生成Cgroups 中任务所使用的 CPU 报告
cpuset 该子系统为 Cgroups 中的任务分配独立CPU(在多核系统)和内存节点。
devuces 该子系统可允许或者拒绝 Cgroups 中的任务访问设备
freezer 该子系统挂起或者恢复 Cgroups 中的任务
memory 该子系统设定 Cgroups 中任务的内存限制,并自动生成由那些任务使用的内存资源报告
net_cls 该子系统使用等级识别符标记网络数据包,可允许 Linux 流量控制程序识别从具体 Cgroups中生成数据包
ns 该子系统提供了一个将进程分组到不同命名空间的方法

Cgroups对用户暴露出来的操作接口是文件系统,会在/sys/fs/cgroups的路径下,可以进行查看

mount -t cgroupscd 
cd /sys/fs/cgroup/cpu
ls

3.2 实例验证

cd /sys/fs/cgroup/cpu
mkdir container
ls container/

然后去跑满cpu

while :; do :; done &
top

cat /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us
cat /sys/fs/cgroup/cpu/container/cpu.cfs_period_us

现在我们打开限制,使其只能使用20%的cpu带宽,然后注意把我们刚刚top里面的进程号写入tasks

echo 20000 > /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us
echo 21097 > /sys/fs/cgroup/cpu/container/tasks

即我们可以通过为每一个容器创建控制组,加入到task文件中,来进行限制

docker run -it -d --cpu-period=100000 --cpu-quota=20000 centos /bin/bash

启动后也可以在在我们的控制组里面看到对应文件啦

cd /sys/fs/cgroup/cpu/docker
ls
cd 你的进程号
cat cpu.cfs_quota_us
cat cpu.cfs_period_us

3.3 Cgroups的劣势

在proc文件中,用户可以直接访问这些文件,但是用户在容器中中,使用top查看的会是宿主机的数据

四、Docker文件系统

4.1可读可写层的工作原理

docker镜像采用的是层级结构,通过docker命令一层一层通过docker commit来形成只读层,我们容器所有的操作都是在可读可写层上进行操作,直接删除容器后,可读可写层也会随着删除,可以用docker commit,来形成只读层。

1.写时复制

cow技术相当于直接共用容器中的只读层来节约空间,我们要进行操作时只需要把要写的文件复制到自己的文件系统进行修改

2.分时复制

用时分配是先前没有分配空间,只有在写入一个新文件的时候才进行分配

4.2docker存储驱动

Docker 提供了多种存储驱动(Storage Driver)来存储镜像,常用的几种 Storage Driver 是 AUFS、OverlayFS、Device Mapper、Btrfs、ZFS。

Docker存储驱动 宿主机文件系统
Overlay, Overlay2 XFS(ftype=1), EXT4
AUFS XFS,EXT4
Device Mapper direct-lvm
Btrfs Btrfs
ZFS ZFS
docker info

存储驱动 特点 优点 缺点 适用场合
AUFS 联合文件系统,未并入内核主线,文件级存储 作为 Docker 的第一个存储系统,有较长历史,比较文档,且在大量的生产中实践过,有较强的社区支持 有多层,在做写时复制操作时,如果文件比较大且存在于比较低的层,可能会慢一些 大并发但少IO的场景
OverlayFS 联合文件系统,并入内核主线,文件级存储 只有两层 不管修改的内容多少都会复制整个文件,对大文件进行修改显示要比小文件消耗更多的时间 大并发但少 IO的场景
Device Mapper 并入内核主线,块级存储 无论是大文件还是小文件都只复制需要修改的块,并不复制整个文件 不支持共享存储,当有多个容器读同一个文件时,需要生成多个复本,在很多容器启停的情况下可能会导致磁盘溢出 IO 密集的场景


相关文章
|
16天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
12天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
142 77
|
21天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
5天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
20 3
实战~如何组织一个多容器项目docker-compose
|
14天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
55 3
|
21天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
49 3
|
21天前
|
存储 安全 数据安全/隐私保护
Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。
在数字化时代,Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。本文探讨了 Docker 应用的备份与恢复策略,涵盖备份的重要性、内容、方法及常见工具,制定备份策略,恢复流程及注意事项,并通过案例分析和未来趋势展望,强调备份与恢复在保障应用安全中的重要性。
26 2
|
18天前
|
人工智能 Kubernetes Cloud Native
荣获2024年AI Cloud Native典型案例,阿里云容器产品技术能力获认可
2024全球数字经济大会云·AI·计算创新发展大会,阿里云容器服务团队携手客户,荣获“2024年AI Cloud Native典型案例”。
|
21天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
54 7
|
21天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
30 5
下一篇
DataWorks