

docker run -itd --name test1 centos:7 /bin/bash
#--name选项可以给容器创建一个自定义名称
docker ps -a
docker inspect -f '{{.State.Pid}}' 3ed82355f811 #查看容器进程号
ls -l /proc/25495/ns #查看容器的进程、网络、文件系统等命名空间编号
docker run -itd --name test2 --net=containet:3ed82355f811 centos:7 /bin/bash
docker ps -a
docker inspect -f '{{.State.Pid}}' ff96bc43dd27
1s-1/proc/27123/ns
#查看可以发现两个容器的net namespace编号相同


overlay模式
叠加式网络模式,使用外部的服务组件作为网关或者代理,例如ingress ,一般和docker-swarm结合(所以建议以了解的角度来介绍)

#查看网络模式列表
docker network ls
#查看容器信息(包含配置、环境、网关、挂载、cmd等等信息)
docker inspect 容器ID

#指定分配容器IP地址
#直接使用bridge模式,是无法支持指定IP运行docker的
docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:7 /bin/bash

报错,因为用户使用的ip地址不被规则所允许,docker0定义的就是按照顺序来,所有需要创建一个
#创建自定义网络
#可以先自定义网络,再使用指定IP运行docker
docker network create --subnet=172.19.0.0/16 --opt "com.docker.network.bridge.name"="docker2" xjw

docker2为执行ifconfig命令时,显示的网卡名。如果不使用–opt参数指定此名称,那你在使用ifconfig命令查看网络信息时,看到的是类似br-110eb56a0b22这样的名字。
xjw为执行docker network list命令时,显示的网络模式名称。
#检查网络
docker network inspect xjw
#将容器添加到网络
docker run -itd --name test --net xjw --ip 172.19.0.10 centos:7 /bin/bash
docker network inspect xjw


cgroups,是一个非常强大的linux内核工具,他不仅可以限制被namespace隔离起来的资源,还可以为资源设置权重、计算使用量、操控进程启停等等。所cgroups(Control groups)实现了对资源的配额和度量。
cgroups有四大功能:
| 功能 | 说明 |
|---|---|
| 资源限制 | 对任务使用的资源总额进行限制 |
| 优先级分配 | 通过分配的CPU时间片数以及磁盘io带宽大小,相当于控制任务运行优先级 |
| 资源统计 | 统计系统的资源使用量,如cpu时长,内存用量等 |
| 任务控制 | cgroup可以对任务执行挂起、恢复等操作 |
Linux通过CFS(Completely Fair
Scheduler,完全公平调度器)来调度各个进程对CPU的使用。CFS默认的调度周期是100ms。
可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少CPU时间。
使用–cpu-period即可设置调度周期,
使用–cpu-quota即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。
CFS周期的有效范围是1ms1s,对应的–cpu-period的数值范围是10001000000。
而容器的CPU配额必须不小于1ms,即–cpu-quota的值必须>=1000.
#查看CPU使用率
docker run -itd --name test1 centos:7 /bin/bash
cd /sys/fs/cgroup/cpu/docker/05d8e984eab7c53d82b2b4fe889bed11963170c6774c2f8507fe0a7166c9f46b/
cat cpu.cfs_quota_us
cat cpu.cfs_period_us
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VV69tJEi-1663301322695)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220906183154931.png)]
cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用us表示),默认为100000。
cpu.cfs_quota_us:表示该cgroup限制占用的时间(微秒),默认为-1,表示不限制。
如果设为50000,表示占用50000/100000=50%的cpu。
#进行CPU压力测试
docker exec -it 05d8e984eab7 /bin/bash
#需要先yum install -y vim
vim /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
chmod +x /cpu.sh
./cpu.sh
top #可以看到这个脚本占了很多的cpu资源
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BzWBobOU-1663301322696)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220906184329261.png)]
#设置CPU使用率
#设置50%的比例分配CPU使用时间上限
docker run-itd--name test2--cpu-quota 50000 centos:7/bin/bash #可以重新创建一个容器并设置限额
或者
cd /sys/fs/cgroup/cpu/docker/05d8e984eab7c53d82b2b4fe889bed11963170c6774c2f8507fe0a7166c9f46b/
echo 50000 > cpu.cfs_quota_us
docker exec -it 05d8e984eab7 /bin/bash
./cpu.sh
top
#可以看到cpu占用率接近50%,cgroups对cpu的控制起了效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qNTUIs1Y-1663301322696)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220906185136180.png)]
Docker 通过–cpu-shares 指定 CPU 份额,默认值为1024,值为1024的倍数。
#创建两个容器为 c1 和 c2,若只有这两个容器,设置容器的权重,使得c1和c2的CPU资源占比为1/3和2/3。
docker run -itd --name c1 --cpu-shares 512 centos:7
docker run -itd --name c2 --cpu-shares 1024 centos:7
#分别进入容器,进行压力测试
docker exec -it a5f30bf4b164 /bin/bash
yum install -y epel-release
yum install stress -y
stress -c 4 #产生四个进程,每个进程都反复不停的计算随机数的平方根
#查看容器运行状态(动态更新)
docker stats
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ROEQz5m2-1663301322697)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220906191725337.png)]
#先分配虚拟机4个CPU核数
docker run -itd --name test3 --cpuset-cpus 1,3 centos:7 /bin/bash
#进入容器,进行压力测试
yum install -y epel-release
yum install stress -y
stress -c 4
#退出容器,执行 top 命令再按 1 查看CPU使用情况。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m4qNP8SY-1663301322697)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220906192345117.png)]
docker run -itd --name test4 -m 512m centos:7 /bin/bash
docker stats
限制可用的swap大小,–memory-swap
强调一下,–memory-swap是必须要与–memory一起使用的。
正常情况下,–memory-swap的值包含容器可用内存和可用swap.
所以-m 300m --memory-swap=1g的含义为:容器可以使用300M的物理内存并且可以使用700M(1G-300)的swap。
如果–memory-swap设置为0或者不设置,则容器可以使用的swap
大小为-m值的两倍。
如果–memory–swap的值和-m值相同,则容器不能使用swap。
如果-memory-swap值为-1,它表示容器程序使用的内存受限,而可以使用的swap空间使用不受限制(宿主机有多少swap容器就可以使用多少)。

#限制某个设备上的读速度bps(数据量),单位可以是kb、mb(M)或者gb。
--device-read-bps
例:docker run -itd --name test5 --device-read-bps /dev/sda:1M centos:7 /bin/bash
#限制某个设备上的写速度bps(数据量),单位可以是kb、mb(M)或者gb。
--device-write-bps
例:docker run -itd --name test5 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
#限制读某个设备的iops(次数)
--device-read-iops
#限制写入某个设备的iops(次数)
--device-write-iops
#创建容器,并限制写速度
docker run -it --name test5 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
#通过dd来验证写速度
dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct #添加oflag参数以规避掉文件系统cache(直接写入磁盘)
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 10.0025 s, 1.0 MB/s
#清理docker占用的磁盘空间
docker system prune -a
#可以用于清理滋盘,删除关闭的容器、无用的数据卷和网络
两个容器如果端口一致的情况下,暴露出去会产生地址冲突,所以需要在docker0上做一个端口映射,通过ens33暴露出去端口不同就可以了
端口映射机制将容器内的服务提供给外部网络访问,实际上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。
| 选项 | 参数 |
|---|---|
| -P | 随机端口 (从49153到65535,每次新建容器端口号自加一) |
| -p | 自定义端口 ( 宿主机端口:容器内端口 ) |
#自定义端口
docker run -itd --name test1 -p 8081:80 nginx
#需要在容器中开启nginx
docker exec -it 72e1adbbda21
#在网页测试
http://192.168.48.14:8081
#随机端口
docker run -d --name test -P nginx
docker run -itd -P nginx:latest /bin/bash
端口:容器内端口 ) |
#自定义端口
docker run -itd --name test1 -p 8081:80 nginx
#需要在容器中开启nginx
docker exec -it 72e1adbbda21
#在网页测试
http://192.168.48.14:8081
#随机端口
docker run -d --name test -P nginx
docker run -itd -P nginx:latest /bin/bash