一 Docker数据卷管理
Docker数据卷管理
为什么要用数据卷
docker数据卷
- mount到主机中,绕开分层文件系统
- 和主机磁盘性能相同,容器删除后依然保留
- 仅限本地磁盘,不能随容器迁移
docker提供了两种卷:
- bind mount
- docker managed volume
1.bind mount
是将主机上的目录或文件mount到容器里。 使用 -v 选项指定路径,格式 <host path>:<container path> 在容器里查看是否和/dockerdata下面的文件一致
删除容器demo和之前的数据卷 挂载su主机server1的dvd.repo到容器内,可以在容器中cat到此文件 bind mount 默认权限是读写rw ,可以在挂载时指定只读ro。 -v选项指定的路径,如果不存在,挂载时会自动创建。
权限为ro,所有不能w
2.docker managed volume
bind mount必须指定host本机的文件系统路径,限制了移植性。 docker managed volume 不需要指定mount源,docker自动为容器创建数据卷目录。 默认创建的数据卷目录都在 /var/lib/docker/volumes 中。 如果挂载时指向容器内已有的目录,原有数据会被复制到volume中。
创建数据卷webdata,创建的卷会自动生成在 /var/lib/docker/volumes 目录下 未修改时为nginx的默认登陆页面 不需要指定mount源,直接默认为容器创建卷目录 某些镜像在构建过程中设定了数据卷,nginx无,registry有
二 Docker卷插件
1.简介
docker 卷默认使用的是local类型的驱动,只能存在宿主机,跨主机的volume就需要使用第三方的驱动,可以查看以下链接: https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins docker官方只提供了卷插件的api,开发者可以根据实际需求定制卷插件驱动。 https://docs.docker.com/engine/extend/plugins_volume/#volume-plugin-protocol
(1)Docker Plugin 是以Web Service的服务运行在每一台DockerHost上的,通过HTTP协议传输RPC风格的JSON数据完成通信。 (2)Plugin的启动和停止,并不归Docker管理,DockerDaemon依靠在缺省路径下查找Unix Socket文件,自动发现可用的插件。 (3)当客户端与Daemon交互,使用插件创建数据卷时,Daemon会在后端找到插件对应的 socket文件,建立连接并发起相应的API请求,最终结合Daemon自身的处理完成客户端的请求。
2.convoy卷插件实现
支持三种运行方式:devicemapper、NFS、EBS 以下实验使用nfs 方式。 下载软件: https://github.com/rancher/convoy/releases/download/v0.5.0/ convoy.tar.gz 在所有节点提前挂载NFS存储。
在服务端server1和server2客户端上安装NFS 服务端server1创建/mnt/nfs(准备挂载目录),修改并编写/etc/exports,启动nfs服务并查看 部署convoy插件,解压安装包 将convey的二进制文件移动到/usr/local/bin下便于直接调用 启动convoy插件,打入后台 查看进程 /etc/docker/plugins/ 存放sock的路径 为docker引擎指定convoy的sock的文件到/etc/docker/plugins/convoy.spec 创建卷vol1 convoy list 可以看到vol1,convoy inspect查看详细信息
server2的操作同server1
tar zxf convoy.tar.gz
cd convoy/
mv convoy* /usr/local/bin/
convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &
ls /mnt/nfs/
mkdir -p /etc/docker/plugins/
echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
docker volume ls
测试: 使用vol1挂载测试
删除:
docker rm -f demo
convoy delete vol1
kill -9 5446
rm -f /etc/docker/plugins/*
删除元数据,重启服务
cd /var/lib/docker/volumes/
rm metadata.db
systemctl restart docker
docker volume ls
3.convoy卷插件子命令
convoy list 列出卷
convoy delete 删除卷
convoy snapshot create 创建快照
convoy snapshot delete 删除快照
convoy backup create 创建备份
convoy create res1 --backup <url> 还原备份
三 理解Docker安全
(1)Docker容器的安全性,很大程度上依赖于Linux系统自身,评估Docker的安全性时,主要考虑以下几个方面:
- Linux内核的命名空间机制提供的容器隔离安全
- Linux控制组机制对容器资源的控制能力安全。
- Linux内核的能力机制所带来的操作权限安全
- Docker程序(特别是服务端)本身的抗攻击性。
- 其他安全增强机制对容器安全性的影响。
(2)命名空间隔离的安全
- 当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命名空间。命名空间提供了最基础也最直接的隔离。
- 与虚拟机方式相比,通过Linux namespace来实现的隔离不是那么彻底。
- 容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。
- 在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:时间。
(3)控制组资源控制的安全
- 当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。
- Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分享主机的内存、CPU、磁盘IO等资源。
- 确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器,它在防止拒绝服务攻击(DDoS)方面必不可少。
(4)内核能力机制
- 能力机制(Capability)是Linux内核一个强大的特性,可以提供细粒度的权限访问控制。
- 大部分情况下,容器并不需要“真正的”root权限,容器只需要少数的能力即可。
- 默认情况下,Docker采用“白名单”机制,禁用“必需功能”之外的其他权限。
(5)Docker服务端防护
- 使用Docker容器的核心是Docker服务端,确保只有可信的用户才能访问到Docker服务。
- 将容器的root用户映射到本地主机上的非root用户,减轻容器和主机之间因权限提升而引起的安全问题。
- 允许Docker 服务端在非root权限下运行,利用安全可靠的子进程来代理执行需要特权权限的操作。这些子进程只允许在特定范围内进行操作。
(6)其他安全特性
- 在内核中启用GRSEC和PAX,这将增加更多的编译和运行时的安全检查;并且通过地址随机化机制来避免恶意探测等。启用该特性不需要Docker进行任何配置。
- 使用一些有增强安全特性的容器模板。
- 用户可以自定义更加严格的访问控制机制来定制安全策略。
- 在文件系统挂载到容器内部时,可以通过配置只读模式来避免容器内的应用通过文件系统破坏外部环境,特别是一些系统运行状态相关的目录。
四 容器资源控制
Linux Cgroups 的全称是 Linux Control Group。
- 是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
- 对进程进行优先级设置、审计,以及将进程挂起和恢复等操作。
Linux Cgroups 给用户暴露出来的操作接口是文件系统。
- 它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。
- 执行此命令查看:mount -t cgroup
在 /sys/fs/cgroup 下面有很多诸如 cpuset、cpu、 memory 这样的子目录,也叫子系统。 在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录)。 控制组下面的资源文件里填上什么值,就靠用户执行 docker run 时的参数指定。
查看docker run用于pid的用法 查看docker run用于内存限制的用法 查看docker run用于io的用法
1.内存限制
容器可用内存包括两个部分:物理内存和swap交换分区。 进入容器限制目录,查看内存限制,与本机一致,是继承本机 的限制
容器限制目录 /sys/fs/cgroup/memory/docker/ 进入demo容器的子进程目录,查看内存最大限制 进入容器进程目录,查看限制文件,发现修改后内存为200M 进入容器内部查看
安装cgroup操作命令模块:libcgroup-tools.x86_64
创建新的项目x1的限制目录,会自动继承主机的限制文件 限制x1内存最大为200M
/dev/shm/ 内存中的目录,在此目录/dev/shm/中创建文件会占用内存
temfs临时文件系统会自动挂载:是物理内存的一半 当内存超过限制的200M时,发现可用内存不变!!
发现超过的内存是启用了swap分区,关闭swap分区,无法使用大于200的内存,killed,限制成功 恢复swap分区,删除bigfile文件
限制内存和swap分区共同的大小:200M 进入/dev/shm目录中,截取300M数据,直接killed
2.CPU限额
cpu限制目录:/sys/fs/cgroup/cpu ,创建新的项目x2 修改优先级,将进程加入tasks才能管理
top查看进程占用cpu情况 创建第二个进程
top查看进程,发现还是100%使用cpu 虚拟机有两个cpu,没有发生资源争抢,关闭cpu1(注意cpu0是无法关闭的),单个cpu再次查看top
top查看,关闭一个cpu后,一个进程为另个进程cpu使用率的10%左右 恢复cpu1 恢复进程优先级
cpu_period 和 cpu_quota 这两个参数需要组合使用,用来限制进程在长度为 cpu_period 的一段时间内,只能被分配到总量为 cpu_quota 的 CPU 时间
以下设置表示20%的cpu时间 tasks追加第二个进程 发现2个进程共占用20% 删除x2
3.Block IO限制
–device-write-bps限制写设备的bps
拉起容器,限制IO速率为30M,direct IO 不使用文件缓存,不加oflag=direct速度更快,访问内存更强,家参数是先访问io,所以会慢
五 docker安全加固
xcfs增强容器隔离性和资源可见性
安装并开启服务,查看进程
查看cpu详细信息 查看mem详细信息
pull ubuntu镜像 利用lxcfs增强docker容器隔离性和资源可见性,容器内可以看到,内存被限制 不加特权无法操作 设置特权级运行的容器:–privileged=true 设置容器白名单:--cap-add
–privileged=true 的权限非常大,接近于宿主机的权限,为了防止用户的滥用,需要增加限制,只提供给容器必须的权限。此时Docker提供了权限白名单的机制,使用–cap-add添加必要的权限。 capabilities手册地址: http://man7.org/linux/man-pages/man7/capabilities.7.html
docker安全拓展
|