docker基础学习之四:容器底层实现技术

一、先了解一下docker的几个基本概念
镜像:可以理解为一个预配置的系统光盘,光盘插入电脑后就可以启动一个操作系统(容器),
由于是光盘,你是无法修改它或保存数据

容器:同样一个镜像,我们可以同时启动多个,运行期间产生的这个实例就是容器。把容器内的操作和
启动它的镜像进行合并,就可以产生一个新的镜像

镜像仓库:是存放容器镜像的仓库,用户可以进行镜像下载和访问,分为公有镜像仓库和私有镜像仓库
公有镜像仓库如docker hub
私有镜像仓库, 企业可以自行搭建,如阿里云用docker registry构建

docker内核:
所有容器共享底层宿主机的linux内核,docker相对于VM虚拟机,少了虚拟机操作系统这一层,所以docker效率比虚拟机更高。
docker内核是没有发行版本的,不管是Ubuntu,还是Centos, 都是同样的linux kernel。这也是容器可移植迁移的原因。
在哪个层级区分操作系统呢?在bins/Libs
在这里插入图片描述

二、容器和虚拟机的区别
在这里插入图片描述

三、docker架构及工作流程
在这里插入图片描述

工作流程:
1、服务器运行docker engine服务,在docker engine上启动很多容器container
2、从外网docker hub上把image操作系统镜像下载下来,放到container容器运行
3、启动docker容器实例,通过docker client对docker容器虚拟化平台进行控制

四、docker容器实现原理
既然所有容器共享一个linux kernel, 势必要进行资源的划分。
docker容器在实现上通过namespace技术实现进程隔离,通过cgroup技术实现容器进程可用资源的限制
docker启动一个容器时,实际是创建了带多个namespace参数的进程
在这里插入图片描述

1、namespace介绍

root@herrychen:~# docker run -h xjsthost -it centos
Unable to find image ‘centos:latest’ locally
latest: Pulling from library/centos
8a29a15cefae: Pull complete
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:latest
[root@xjsthost /]# useradd xjstsera
[root@xjsthost /]# su xjstsera
[xjstsera@xjsthost /]$
这是主机名的隔离

在CRT克隆一个会话
root@herrychen:~# su xjstsera
su: user xjstsera does not exist
宿主机的用户和容器的用户是完全隔离的,这是用户ID的隔离。

[xjstsera@xjsthost /]$ ps axf
PID TTY STAT TIME COMMAND
1 pts/0 Ss 0:00 /bin/bash
21 pts/0 S 0:00 su xjstsera
22 pts/0 S 0:00 _ bash
37 pts/0 R+ 0:00 _ ps axf

root@herrychen:~# ps axf
在宿主机能看到上面3个进程,容器的一个进程也是宿主机上的一个进程。但是进程ID是不同的。这是进程ID的隔离
24106 pts/0 Ss 0:00 _ /bin/bash
24159 pts/0 S 0:00 _ su xjstsera
24161 pts/0 S+ 0:00 _ bash

2、Cgroup介绍
作用:限制一个进程组对系统资源的使用上限,包括:CPU、内存、Block I/O等
原理:将一组进程放到一个Cgroup中,通过给这个Cgroup分配指定的可用资源,达到控制这一组进程可用资源的目的
实现:在linux中,Cgroup以文件和目录的方式组织在操作系统的sys/fs/cgroup路径下,该路径中所有的资源种类均可
被Cgroup限制

root@herrychen:~# mount -t cgroup
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)

2.1 cpu资源限制
cpu-shares:权重值,表示该进程能使用的CPU资源的权重值,CPU打满后才会启用
root@herrychen:~# docker run --name xjst1 -it --cpu-shares 128 progrium/stress --cpu 1
创建容器名xjst1, 分配CPU 权重值为128, 不指定的话默认为1024, progrium/stress是压测软件,cpu 1表示1核

Unable to find image ‘progrium/stress:latest’ locally
latest: Pulling from progrium/stress
Image docker.io/progrium/stress:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
a3ed95caeb02: Pull complete
871c32dbbb53: Pull complete
dbe7819a64dd: Pull complete
d14088925c6e: Pull complete
58026d51efe4: Pull complete
7d04a4fe1405: Pull complete
1775fca35fb6: Pull complete
5c319e267908: Pull complete
Digest: sha256:e34d56d60f5caae79333cee395aae93b74791d50e3841986420d23c2ee4697bf
Status: Downloaded newer image for progrium/stress:latest
stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogcpu worker 1 [6] forked
^Cstress: FAIL: [1] (416) <-- worker 6 got signal 2
stress: WARN: [1] (418) now reaping child worker processes
stress: FAIL: [1] (422) kill error: No such process
stress: FAIL: [1] (452) failed run completed in 25s

root@herrychen:~# docker run --name xjst2 -it --cpu-shares 512 progrium/stress --cpu 1

使用top命令能清晰的看到这两个容器(一个权重值128,一个权重值为512)吃CPU的数值的变化。
在这里插入图片描述

root@herrychen:~# cd /sys/fs/cgroup/
#ls
root@herrychen:/sys/fs/cgroup# cd cpu
#ls
root@herrychen:/sys/fs/cgroup/cpu# cd docker
#ls
#cat cpu.shares
1024
我申请的这台虚机的cpu默认权重值确实是1024。
同时能看到两台容器的ID,进入后cat cpu.shares分别能看到当时分配的CPU权重值。

2.2 内存资源限制
root@herrychen:~# docker run -m 400M --memory-swap=500M -dit centos /bin/bash
Unable to find image ‘centos:latest’ locally
latest: Pulling from library/centos
8a29a15cefae: Pull complete
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:latest
WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
32f86cf4ea6c6a9626004534c82532171aee8c1f27d8f25a51df661cacfdcef2

同样进行cd /sys/fs/cgroup/查看容器的内存资源
root@herrychen:/sys/fs/cgroup/memory/docker/32f86cf4ea6c6a9626004534c82532171aee8c1f27d8f25a51df661cacfdcef2# cat memory.limit_in_bytes
419430400
这是kb的单位,换算后就是400M

3.3 Block I/O限制
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值