私有仓库
1、下载registry
[root@localhost ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
6a428f9f83b0: Pull complete
90cad49de35d: Pull complete
b215d0b40846: Pull complete
429305b6c15c: Pull complete
6f7e10a4e907: Pull complete
Digest: sha256:265d4a5ed8bf0df27d1107edb00b70e658ee9aa5acb3f37336c5a17db634481e
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
2、修改私有仓库地址
vim /etc/docker/daemon.json
{
"insecure-registries":["192.168.218.214:5000"], ##添加,本地地址端口:5000
}
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
3、创建私有仓库容器
[root@localhost ~]# docker create -it registry /bin/bash
faa27a53a8688d383fa26c59f33415e859dc9b873c25fa76cb6f1e5e58daeb50
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
faa27a53a868 registry "/entrypoint.sh /bin…" 10 seconds ago Created stoic_murdock
4、启动容器
[root@localhost ~]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
2e6103e52d9e7c879dcfcd20f495f74d026078768b93e31644b3a36817e13fff
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e6103e52d9e registry "/entrypoint.sh /etc…" 8 seconds ago Up 7 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp confident_brown
faa27a53a868 registry "/entrypoint.sh /bin…" 2 minutes ago Created stoic_murdock
5、打上标签并上传容器
[root@localhost ~]# docker push 192.168.218.214:5000/nginx
Using default tag: latest
The push refers to repository [192.168.218.214:5000/nginx]
fac15b2caa0c: Pushed
f8bf5746ac5a: Pushed
d11eedadbd34: Pushed
797e583d8c50: Pushed
bf9ce92e8516: Pushed
d000633a5681: Pushed
latest: digest: sha256:6fe11397c34b973f3c957f0da22b09b7f11a4802e1db47aef54c29e2813cc125 size: 1570
6、查看私有仓库,如果显示有nginx则表明上传成功
[root@localhost ~]# curl -XGET http://192.168.218.214:5000/v2/_catalog
{"repositories":["nginx"]}
cgroup概述
Cgroup是 Control Groups的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如CPU、内存、磁盘:io等等)的机制。
Docker通过cgroup来控制容器使用的资源配额,包括 CPO、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。
cgroup是一种资源控制手段,也是容器隔离的6个名称空间的一种实现手段。
cpu使用率
CPU周期:1s为一个周期的定律,参数值一般为100000 (CPU衡量单位是秒,参数值单位为微秒)
假如需要给此容器分配CPU使用率的20%,则参数需要设置为20000,相当于每个周期分配给这个容器0.2sCPU。
在一个时刻,只能给一个进程占用。
使用stress工具测试cpu和内存使用情况
安装stress工具
[root@localhost stress]# mkdir /opt/stress
[root@localhost stress]# vim /opt/stress/dockerfile
FROM centos:7
RUN yum -y install wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum -y install stress
[root@localhost stress]# docker build -t centos:stress .
使用如下命令创建容器,给这个容器的时间分片为100。默认情况下,每个Docker容器的CPU份额都是1024。单独一个容器的份额是没有意义的。只有在同时运行多个容器时,容器的CPU加权的效果才能体现出来。
[root@localhost stress]# docker run -itd --cpu-shares 100 centos:stress
1b763f6f652ef67854174187cadc8db5268652ec813ad776e24c24ad77da55c6
Cgroups只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的CPU份额来确定有多少CPU资源分配给它,资源分配结果取决于同时运行的其他容器的CPU分配和容器中进程运行情况。可以通过cpu share可以设置容器便用CPU的优先级/权重,比如启动了两个容器及运行查看CPU使用百分比。
[root@localhost stress]# docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10
e214dec40628bf4bf0815bc2452290942955b7a9d3de53602bec8952844460aa
[root@localhost stress]# docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10
52805f808027a7540c19da19fb8da1c0008a9ffeb3d1e81d3026a8bd36b2a0e1
[root@localhost stress]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52805f808027 centos:stress "stress -c 10" 9 seconds ago Up 8 seconds cpu1024
e214dec40628 centos:stress "stress -c 10" 18 seconds ago Up 17 seconds cpu512
1b763f6f652e centos:stress "/bin/bash" 4 minutes ago Up 4 minutes peaceful_shockley
通过docker stats持续查看cpu使用率,可以看到512的使用率为1024的一半
CPU周期限制
Docker提供了–cpu-period、–cpu-quota两个参数控制容器可以分配到的CPU时钟周期。
cpu-period 是用来指定容器对CPU的使用要在多长时间内做一次重新分配。
cpu-guota是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。与–cpu-shares不同的是,这种配置是指定一个绝对值,容器对CPU资源的使用绝对不会超过配置的值。
cpu-period和cpu-quota的单位为微秒(us)。cpu-period 的最小值为 1000微秒,最大值为1秒(10*6us) ,默认值为0.1秒(10000o us ) 。
cpu-quota的值默认为-1,表示不做控制。cpu-period 和 cpu-gquota参数一般联合使用。
/sys/fs/cgroup/cpu/docker/存放的是容器中cpu的各种限制文件
[root@localhost docker]# cat cpu.cfs_quota_us
-1
[root@localhost docker]# cat cpu.cfs_period_us
100000
每个容器有自己的cpu限制文件,可以进入容器id的目录下,通过cat查看cpu限制
CPU Core控制
对多核CPU的服务器,Docker还可以控制容器运行使用哪些CPU内核,即使用–cpuset-cpus参数。这对具有多CPU的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。
执行以下命令需要宿主机为双核,表示创建的容器只能用0、1两个内核。
[root@localhost docker]# docker run -itd --name cpu --cpuset-cpus 0-1 centos:stress
bdac5857305412058fce37d593631140d43f3b4a5d2fb0a07d056c56304eb403
[root@localhost docker]# cd /sys/fs/cgroup/cpuset/docker/
[root@localhost docker]# ls
1b763f6f652ef67854174187cadc8db5268652ec813ad776e24c24ad77da55c6
52805f808027a7540c19da19fb8da1c0008a9ffeb3d1e81d3026a8bd36b2a0e1
bdac5857305412058fce37d593631140d43f3b4a5d2fb0a07d056c56304eb403
cgroup.clone_children
cgroup.event_control
cgroup.procs
cpuset.cpu_exclusive
cpuset.cpus
cpuset.effective_cpus
cpuset.effective_mems
cpuset.mem_exclusive
cpuset.mem_hardwall
cpuset.memory_migrate
cpuset.memory_pressure
cpuset.memory_spread_page
cpuset.memory_spread_slab
cpuset.mems
cpuset.sched_load_balance
cpuset.sched_relax_domain_level
e214dec40628bf4bf0815bc2452290942955b7a9d3de53602bec8952844460aa
notify_on_release
tasks
[root@localhost docker]# cd /sys/fs/cgroup/cpuset/docker/bdac5857305412058fce37d593631140d43f3b4a5d2fb0a07d056c56304eb403/
[root@localhost bdac5857305412058fce37d593631140d43f3b4a5d2fb0a07d056c56304eb403]# cat cpuset.cpus
0-1
设置容器使用cpu1运行,达到绑定cpu的目的
[root@localhost bdac5857305412058fce37d593631140d43f3b4a5d2fb0a07d056c56304eb403]# docker exec bdac58573054 taskset -c -p 1
pid 1's current affinity list: 0,1
CPU配额控制参数的混合使用
通过cpuset-cpus 参数指定容器A使用CPU内核0,容器B只是用cPU内核1。
在主机上只有这两个容器使用对应CPU内核的情况,它们各自占用全部的内核资源,cpu-shares 没有明显效果。
[root@localhost ~]# docker run -tid --name cpu1 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1
9ddca77d9727eea5bad3d73e1c797d6e3d3bb68a3011ff48f1ddf4c8891899a8
docker run -tid --name cpu2 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1
11a55411b60d137a75ad8a688d1821819ba2231bd48d4b7da527ae16559f3442
通过top命令查看cpu核心占用
内存限额
与操作系统类似,容器可使用的内存包括两部分:物理内存和 Swap
Docker 通过下面两组参数来控制容器内存的使用量。
-m或–memory:设置内存的使用限额,例如100M、1024M。
–memory-swap:设置内存+swap的使用限额。
[root@localhost ~]# docker run -itd -m 200M --memory-swap=300M centos:stress
6e376a3d59db35328f310f9a7a62d2b8556794f62a128657725835ed6f91d89f
[root@localhost ~]# docker run -itd centos:stress
9892597020fd0f6e76efbf780c610db8eca69d8862ff1dc3db8d4c9b397625a8
Block IO限制
默认情况下,所有容器能平等地读写磁盘,可以通过设置–blkio-weight参数来改变容器block 1o的优先级。
–blkio-weight 与–cpu-shares类似,设置的是相对权重值,默认为500。
[root@localhost ~]# docker run -itd --blkio-weight 600 centos:stress
04a5b67c0821e2b56394b0125f8424e93e5533fdbfddfca4844c08fff29203ab
[root@localhost ~]# docker run -itd --blkio-weight 300 centos:stress
6cd7632159ad18ac97e64d38ee99359d9b68be6cc098b6b5e13f06eb88aa7100
查看两个容器的磁盘读写限制