9.1 docker 容器命名和重命名
9.2 创建docker 容器实例时指定主机名
9.3 docker 容器资源配额控制之CPU
9.4 docker 容器资源配额控制之内存
9.5 docker 容器资源配额控制之IO
9.6 docker 数据映射
9.1.1 docker 容器命名和重命名
容器命名语法 docker run -d --name 容器实例名 容器镜像名 要执行的命令
[root@xuegod6 ~]# docker run -itd --name docker11 docker.io/centos:latest /bin/bash
ba782630b926ee0c62c5cc0b1dbdb916960763c524560d582fcf56e7b5349918
容器重命名法: docker rename rename 旧容器名 新容器名
9.2 创建docker 容器实例时指定主机名
92.1 创建docker 容器实例时,指定主机名
语法: docker run -it --name 容器名 -h 指定主机名 镜像 /bin/bash
[root@xuegod6 ~]# docker run -it --name docker3 -h docker63.cn docker.io/centos:latest /bin/bash
[root@docker63 /]#
9.3 docker 容器资源配额控制之CPU
9.3.1 docker 容器资源配额控制
启动docker 容器时,指定CPU,内存,硬盘性能等的硬件资源使用份额
Docker 通过cgroup 来控制容器使用的资源配额,包括,CPU,内存,磁盘三大方面
基本覆盖了常见资源配额和使用控制
例1 :给容器实例分配512 权重的CPU 使用份额
--CPU-shares 512
[root@xuegod6 ~]# docker run -it --cpu-shares 512 docker.io/centos:latest /bin/bash
[root@13604e0295c7 /]#
启动一下多个容器,测试一下是不是只能使用512 份额的CPU资源,单独一个容器,看不出来
9。3.2 了解CPU周期控制
docker 提供了 --CPU -period --cpu-quota 两个参数控制器可以分配的CPU 时钟周期
--cpu-period 是用来指定容器对CPU的使用要在多长时间内做一次重新分配,指定周期
--CPU-quota 是用来指定这个周期,最多可以有多少时间片段用来跑这个容器, 指定在这个周期中使用多少时间片
跟
例1 :如果容器进程需要每1秒使用单个CPU的0.2 秒时间,可以将CPU-period 设置为1000000 (即1秒)
CPU -quota 设置为200000(0.2秒)
docker run -it --cpu-period 1000000 --cpu-quota 200000 docker.io/centos /bin/bash
[root@2640b97115fe ~]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
1000000
[root@2640b97115fe ~]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
200000
9.3.3 CPU core 核心控制
参数: CPUset 可以绑定CPU
对多核CPU的服务器,docker 还可以控制容器运行使用哪些CPU内核和内存节点,即使用cpuset-cpus 和
-cpuset-mems 参数,对具有NUMA 扩普 具有多CPU,多内存节点,的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置,如果服务器只有一个内存节点,则CPUset-mems 的配置不会有明显效果
扩展
服务器架构一部分 SMP , NUMA,MPP 体系结构介绍
从系统架构来看,目前的商用服务器分为三大类
1, 即对称服务器结构 smp 例 x 86 服务器,双路服务器
主板上游两个五路cpu
2 非一致 存储访问结构NUMA 例 IBM 小型机 690 个CPU
3 大型机
9.3.4 taskset 命令
taskset 设置CPU亲和力 ,taskset 能够将一个或多个进程绑定到一个或者多个处理器上
参数
-c, --cpu-list 以列表形式显示和指定CPU
-p, --pid 在 已经存在的pid 上操作
例1 :设置在1 号和2号上运行
[root@xuegod6 ~]# taskset -cp 1,2 7568
pid 7568's current affinity list: 0-3
pid 7568's new affinity list: 1,2
例2 查看ID 为1的是哪个进程
[root@xuegod6 ~]# taskset -cp 1
pid 1's current affinity list: 0-3
[root@xuegod6 ~]#
centos7 中进程ID为1的进程是:systemd rhel6 中的进程是init
重启nginx 后,4个工作进程就可以各自用自己的CPU
例4 :物理机有16 个核心,创建的时候允许0.1.2
[root@xuegod6 ~]# docker run -it --name cpu1 --cpuset-cpus 0-2 docker.io/centos
[root@762985fa0ee9 /]#
[root@762985fa0ee9 /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-2
9.3.5 CPU 配额控制参数的混合使用
当上面这些参数中时,cpu-shares 控制发生在容器竞争同一个CPU的时间片,如果通过
cpuset-cpus 指定容器A使用cpu0 ,容器B 只是cpu1 ,在主机上只有这两个容器使用对内核的情况,他们各自占用全部的内核资源,cpu-shares 没有明显效果
把cpu 跑满,4个核心第一和第三个核心跑满
yum install -y epel-release
yum install -y stress
例1 :产生2个CPU 进程,2个io 进程,20 秒后停止运行
[root@xuegod6 ~]# stress -c 2 -i 2 --verbose --timeout 1m
可以看到非常耗CPU
例2 : 测试两个docker 是不是在CPU0,1 上运行
[root@xuegod6 ~]# docker run -itd --name docker10 --cpuset-cpus 0,1 --cpu-shares 512 docker.io/centos /bin/bash
aa33bb435e09b81b4adf68708700a7579c135d8c7458d90c33fa0f1b16f90049
[root@xuegod6 ~]# docker run -itd --name docker20 --cpuset-cpus 0,1 --cpu-shares 512 docker.io/centos /bin/bash
62a27e8dced1ed634e79ec1ff24b225bdd8c7bffc8d25e3c864936786402ac51
进入到docker 里面 两个容器都要 进入
[root@xuegod6 ~]# docker exec -it docker10 /bin/bash
[root@aa33bb435e09 /]#yum install -y epel-release
[root@aa33bb435e09 /]#yum install -y stress
5分钟以后删除
[root@xuegod6 ~]# docker run -it --rm --name mk centos sleep 5
[root@xuegod6 ~]#
[root@xuegod6 ~]# docker run -it -m 128m docker.io/centos:latest
[root@ed4235fe193e /]#
查看一下
[root@ed4235fe193e ~]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes
134217728
9.5 docker io
[root@xuegod6 ~]# docker run --help | grep write -b
1648: --device-write-bps value Limit write rate (bytes per second) to a device (default [])
1745: --device-write-iops value Limit write rate (IO per second) to a device (default [])
2130: --entrypoint string Overwrite the default ENTRYPOINT of the image
清空缓存
[root@xuegod6 ~]# echo 3 > /proc/sys/vm/drop_caches
[root@xuegod6 ~]# free -m
total used free shared buff/cache available
Mem: 1980 486 1228 10 265 1231
Swap: 2047
例1 :容器对硬盘的最高层设定为1Mb /s
[root@xuegod6 ~]# docker run -it --device /dev/sda:/dev/sda --device-write-bps /dev/sda:1mb docker.io/centos /bin/bash
查看读写速度
[root@f55dfaa5f79a /]# time dd if=/dev/sda of=test.out bs=1M count=50 oflag=direct
50+0 records in
50+0 records out
52428800 bytes (52 MB, 50 MiB) copied, 42.8647 s, 1.2 MB/s
real 0m42.878s
user 0m0.002s
sys 0m0.483s
dd 参数
direct :读写数据采用直接IO方式
nonblock
9.6 docker 数据映射
docker 用来做计算,存储外挂
语法 : docker run -itd -v /src:/dst docker.io/centos /bin/bash
-c 用来指定挂载目录, 冒号:前面的/src 作为物理机本地目录:后面的 /dst 为容器的目录
例1 把物理机上的/var/www/html 映射到docker 实例的/var/www/html
好处: 这样当docker 坏了,数据还在物理机上,在使用apache 镜像启动一个docker 就可以了