重要到不要不要的-docker底层知识

概念

Namespace(名称空间):

名字空间是Linux内核一个强大的特性。每个容器都有自己单独的名字空间,运行在其中的应用都像是在独立的操作系统中运行一样。名字空间保证了容器之间彼此互不影响。namespec六项隔离,实现了容器与宿主机、容器与容器之间的隔离。

IPC: 共享内存、消息列队
MNT: 挂载点、文件系统
NET: 网络栈
PID: 进程编号
USER: 用户、组
UTS: 主机名、域名

释义:
ipc 名字空间
容器中进程交互还是采用了 Linux 常见的进程间交互方法(interprocess communication – IPC), 包括信号量、消息队列和共享内存等。然而同 VM 不同的是,容器的进程间交互实际上还是 host 上具有相同

mnt 名字空间
类似 chroot,将一个进程放到一个特定的目录执行。mnt 名字空间允许不同名字空间的进程看到的文件结构不同,这样每个名字空间 中的进程所看到的文件目录就被隔离开了。同 chroot 不同,每个名字空间中的容器在 /proc/mounts 的信息只包含所在名字空间的 mount point。

net 名字空间
有了 pid 名字空间, 每个名字空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 名字空间实现的, 每个 net 名字空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。Docker 默认采用 veth 的方式,将容器中的虚拟网卡同 host 上的一 个Docker 网桥 docker0 连接在一起。

pid 名字空间
不同用户的进程就是通过 pid 名字空间隔离开的,且不同名字空间中可以有相同 pid。所有的 LXC 进程在 Docker 中的父进程为Docker进程,每个 LXC 进程具有不同的名字空间。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。

user 名字空间
每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。

uts 名字空间
UTS(“UNIX Time-sharing System”) 名字空间允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非 主机上的一个进程。


常用命令

提示:无非是增删改查
例如:
1、

查看镜像

docker images
在这里插入图片描述
查看所有容器
docker ps -a
在这里插入图片描述
保存镜像

docker save -o nginx.tar nginx:latest
在这里插入图片描述

2、

载入镜像
docker load -i nginx.tar
在这里插入图片描述

3、

删除容器
如果程序正在运行,则需要先停止
docker stop testweb
在这里插入图片描述
删除镜像
在这里插入图片描述


高级命令

Cgroup(控制组):

控制组(cgroups)是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争。

控制组技术最早是由 Google 的程序员 2006 年起提出,Linux 内核自 2.6.24 开始支持。

控制组可以提供对容器的内存、CPU、磁盘 IO 等资源的限制和审计管理。

四大功能:

​ 1)资源限制:cgroup可以对进程组使用的资源总额进行限制。

​ 2) 优先级分配:通过分配的cpu时间片数量以及硬盘IO带宽大小,实际上相当于控制了进程运行的优先级别。

​ 3)资源统计:cgroup可以统计系统资源使用量,比如cpu使用时间,内存使用量等,用于按量计费。同时,还支持挂起动能,也就是说通过cgroup把所有资源限制起来,对资源都不能使用,注意着并不是说我们的程序不能使用了,只是不能使用资源,处于等待状态。

​ 4)进程控制:可以对进程组执行挂起、恢复等操作。

1、限制使用内存大小

运行一个容器,并且限制该容器最多使用200M内存和100M的swap。

docker run -itd --name container1 -m 200MB --memory-swap 300MB centos:7
cd /sys/fs/cgroup/memory/docker/545dc2376efedb0d48e174fd8a9a614baf64f99fc09

验证:
cat memory.limit_in_bytes
209715200

cat memory.memsw.limit_in_bytes
314572800

如图:
在这里插入图片描述

2、 限制CPU大小

通过-c或者–cpu-shares设置容器使用cpu的权重。如果不设置默认为1024.

运行一个容器,限制使用512MB
docker run -itd --name container2 -c 512 centos:7

验证:
cd /sys/fs/cgroup/cpu/docker/5f0614e25a5414ded52905240fd7086bdf3db317aa21a84ed4e48f904ca794e3/

cat cpu.shares

3、 限制容器的Block IO(磁盘的读写速率等)

注释:
docker中可以通过设置权重,限制bps和iops的方式控制容器读写磁盘的IO。
bps: 每秒读写的数据量 byte per second
iops: 每秒IO的次数 io per second。

默认情况下,所有容器都能够平等的读写磁盘,也可以通过–blkio-weight参数改变容器的blockIO 的优先级。

–device-read-bps: 显示读取某个设备的bps。
–device-write-bps: 显示写入某个设备的bps。
–device-read-iops: 显示读取某个设备的iops。
–device-write-iops: 显示写入某个设备的iops。

1)运行一个容器,限制testa这个容器,写入/dev/sda这块磁盘的bps为30MB。

docker run -it --name testa --device-write-bps /dev/sda:30MB centos:7

2)验证:从/dev/zero输入,然后输出到test.out文件中,每次大小为1M,总共800次,oflag=direct 用来指定directIO方式写文件,这样才会使–device-write-bps生效。

从宿主机进入docker里面的centos7

docker exec -it testA /bin/bash

执行创建指定大小文件命令

time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct

由图可见,大小限制在30MB左右
在这里插入图片描述


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Friends of the wind

您的是我坚持原创免费作品的不懈

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值