Docker安全之cgroups、搭建Docker私有仓库

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41927237/article/details/81916657

一、设置特权级运行的容器:–privileged=true

有的时候我们需要容器具备更多的权限,比如操作内核模块,控制 swap 交换分区,挂载
USB 磁盘,修改 MAC 地址等。

[root@foundation10 test]# docker run -it --name vm3 --privileged=true ubuntu
root@233a3ed7c3df:/# ip addr
root@233a3ed7c3df:/# ip link set down eth0
root@233a3ed7c3df:/# ip addr
root@233a3ed7c3df:/# id
uid=0(root) gid=0(root) groups=0(root)
root@233a3ed7c3df:/# exit

这里写图片描述

二、资源配额cgroups

Cgroups是control groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。最初由google的工程师提出,后来被整合进Linux内核。Cgroups也是LXC为实现虚拟化所使用的资源管理手段,可以说没有cgroups就没有LXC。
1、限制进程组可以使用的资源数量(Resource limiting )

[root@foundation10 test]# docker run --rm -it --name vm1 -m 100M --memory-swap 100M stress --vm 1 --vm-bytes 90M
无限运行,此时可以打开另一个shell使用top命令实时统计数据
[root@foundation10 test]# docker run --rm -it --name vm1 -m 100M --memory-swap 100M stress --vm 1 --vm-bytes 110M
超过交换分区大小则自己结束

这里写图片描述
把交换分区去了 默认为内存的2倍

[root@foundation10 test]# docker run --rm -it --name vm1 -m 100M  stress --vm 1 --vm-bytes 110M
[root@foundation10 test]# docker run --rm -it --name vm1 -m 100M  stress --vm 1 --vm-bytes 200M

2、记录进程组使用的资源数量(Accounting )
在 cgroup 中,并不能像硬件虚拟化方案一样能够定义 CPU 能力,但是能够定
义 CPU 轮转的优先级,因此具有较高 CPU 优先级的进程会更可能得到 CPU 运算。 通
过将参数写入 cpu.shares ,即可定义改 cgroup 的 CPU 优先级 - 这里是一个相对权重,而
非绝对值
打开3个shell,2个shell执行命令,1个shell top查看进程
查看CPU

[root@foundation10 ~]# lscpu

这里写图片描述
shell1和2分别执行下列命令
就算优先级不同但因为操作系统各使用1个,所以top命令监控占用的CPU比例相同

[root@foundation10 ~]# docker run --rm -it --cpu-shares 512 stress -c 1
[root@foundation10 ~]$ docker run --rm -it --cpu-shares 1024 stress -c 1

这里写图片描述
再次用shell1和2分别执行下列命令
改为使用4个CPU,优先级不同top命令监控占用的CPU比例不同

[root@foundation10 ~]# docker run --rm -it --cpu-shares 1024 stress -c 4
[root@foundation10 ~]# docker run --rm -it --cpu-shares 512 stress -c 4

这里写图片描述
3、IO资源限制
限制参数oflag=direct

[root@foundation10 test]# docker run --rm -it --device-write-bps /dev/sda:20M ubuntu
root@c4ff59b19d66:/# dd if=/dev/zero of=testfile bs=1M count=100 oflag=direct

这里写图片描述

三、搭建Docker私有仓库

从网上拉取registry:2镜像

拉取镜像到本地,冒号后面的是版本号
[root@foundation10 Desktop]# docker pull registry:2
Docker 官方已经把仓库封装为镜像,直接通过启动容器就可以部署完成仓库:
[root@foundation10 ~]# docker run -d -p 5000:5000 -v /opt/registry:/var/lib/registry registry:2  #目录 /var/lib/registry 是仓库存放镜像的位置。
查看容器
[root@foundation10 ~]# docker ps

这里写图片描述
添加解析

[root@foundation10 ~]# vim /etc/hosts
172.25.254.10 haha.com

镜像命名
将本地nginx镜像改为haha.com/nginx

镜像命名
[root@foundation10 ~]# docker tag nginx haha.com/nginx  # haha.com 表示 Registry 的地
址和端口。
查看镜像
[root@foundation10 ~]# docker images
haha.com/nginx         latest              c82521676580        4 weeks ago         109 MB

仓库认证机制

将-v挂载产生的数据删除
[root@foundation10 registry]# cd /opt/registry/
[root@foundation10 registry]# ls
docker
[root@foundation10 registry]# rm -fr *
建立钥匙目录
[root@foundation10 registry]# cd /opt/registry/tmp/docker/
[root@foundation10 docker]# ls
Dockerfile  dvd.repo  ssh  supervisord.conf  test  web
[root@foundation10 docker]# mkdir certs
[root@foundation10 docker]# cd certs/
[root@foundation10 certs]# cd ..
生成domain.crt
[root@foundation10 docker]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt

这里写图片描述

[root@foundation10 docker]# docker run -d   --restart=always   --name registry   -v `pwd`/certs:/certs   -e REGISTRY_HTTP_ADDR=0.0.0.0:443   -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt   -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key   -p 443:443   registry:2

查看容器,生成了443端口的镜像

[root@foundation10 docker]# docker ps

这里写图片描述
删除5000端口的容器

[root@foundation10 docker]# docker rm -f bd
[root@foundation10 docker]# docker ps
查看镜像
[root@foundation10 docker]# docker images
haha.com/nginx    latest              c82521676580        3 weeks ago         109 MB

iptables查看端口转换

[root@foundation10 registry]# iptables -t nat -nL
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443 to:172.17.0.3:443
查看端口
[root@foundation10 registry]# netstat -antlp |grep :443
tcp6       0      0 :::443                  :::*                    LISTEN      26120/docker-proxy  

这里写图片描述
将之前在/tmp/docker/certs/里因执行命令产生的钥匙传到系统docker目录

新建目录
[root@foundation10 registry]# cd /etc/docker/
[root@foundation10 docker]# mkdir certs.d
[root@foundation10 docker]# cd certs.d/
[root@foundation10 certs.d]# mkdir haha.com
[root@foundation10 certs.d]# cd haha.com/
复制生成的domain.crt到此目录
[root@foundation10 westos.org]# cp /tmp/docker/certs/domain.crt ca.crt
[root@foundation10 westos.org]# ls
ca.crt

测试:

推送镜像到 haha.com 仓库
docker push haha.com/nginx
删除本地 nginx 镜像的 TAG
docker rmi haha.com/nginx
拉取镜像到本地
docker pull haha.com/nginx

这里写图片描述
这里写图片描述
仓库的用户认证

[root@foundation10 html]# cd /tmp/docker
[root@foundation10 docker]# mkdir auth
[root@foundation10 docker]# cd auth/

添加用户认证

添加用户
[root@foundation10 docker]# docker run --entrypoint htpasswd registry:2 -Bbn wxj westos > auth/htpasswd
追加添加用户 (注:使用>>)
[root@foundation10 docker]# docker run --entrypoint htpasswd registry:2 -Bbn admin admin >> auth/htpasswd
查看密码
[root@foundation10 docker]# cat auth/htpasswd 
wxj:$2y$05$NZzakHbZshHUSxU7//ckf.o1vIU6LI4cfSZR44BCNv6sEeupFDjnK

admin:$2y$05$OKR6f0i1XVkZ7SzBZHiTYeB7QDSNnNwIJaj0hTvTQ29fo.JTyP4NW
修改密码
[root@foundation10 docker]# htpasswd -cm htpaswd wxj
[root@foundation10 docker]# htpasswd -m htpaswd admin
[root@foundation10 docker]# docker ps -a
[root@foundation10 docker]# docker container prune

这里写图片描述
这里写图片描述
添加认证

[root@foundation10 docker]# docker run -d   --restart=always   --name registry   -v `pwd`/certs:/certs   -e REGISTRY_HTTP_ADDR=0.0.0.0:443   -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt   -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key   -v `pwd`/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -p 443:443   registry:2
查看容器
[root@foundation10 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                            NAMES
ddefcec04fd9        registry:2          "/entrypoint.sh /e..."   23 seconds ago      Up 21 seconds       0.0.0.0:443->443/tcp, 5000/tcp   registry
查看端口
[root@foundation10 docker]# netstat -antlp |grep :443
tcp6       0      0 :::443                  :::*                    LISTEN      7529/docker-proxy   

测试

登陆
[root@foundation10 docker]# docker login -u wxj -p westos westos.org:443
Login Succeeded
成功登陆后会在这个隐藏目录中有显示
[root@foundation10 ~]# cd .docker/
[root@foundation10 .docker]# ls
config.json
[root@foundation10 .docker]# cat config.json 
{
    "auths": {
        "westos.org:443": {
            "auth": "d3hqOndlc3Rvcw=="
        }
    }
}
[root@foundation10 ~]# docker push westos.org:443/rhel7

这里写图片描述
这里写图片描述

展开阅读全文

没有更多推荐了,返回首页