一、设置特权级运行的容器:–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