Docker数据卷、Docker安全
Docker数据卷
- 主要解决存储问题、容器数据滞留
Docker数据卷管理
bind mount
- “-v”+宿主机路径+容器内nginx发布目录
- 新建一个首页
- 现在容器内目录和发布目录内容同步
- 访问的是容器IP的服务,是同步的
- 进入容器内,数据可以随意修改,这是有风险的
- “-ro”默认可读,“-rw”默认可读写
- 可挂接文件,可以写多个
- 不可以覆盖或者追加
- data1不能写但data2可写
- 该方式一致性会差一些
- 所有数据信息都在该位置下
- 整个docker的数据目录都在这个位置
- docker管理卷
- 创建一个卷,卷就在该目录下
- 镜像里需要有一个挂载卷的定义
- 观察docker是否会为我们自动创建卷
- 随机创建,挂接到该位置
- 检测volume定义,自动挂接该目录
- 若没有,只能通过-v手动指定
- 当不知道这么多卷有没有都在用
- 使用参数
- 这样会删除所有的卷
- "-y"用的不删,没用的就会直接回收掉
- 删除容器时,卷是保留的,目的是用来做数据持久化的
docker数据卷
- “-v”方式指定挂接
- 不是绝对路径而是卷的名字
- 已经成功挂接
- 在该位置创建数据就会放到容器内
- 该种方式挂接,里面直接有数据
- 挂接管理卷与随机指定路径挂接不一样
- bind mount挂接会直接覆盖数据,但是docker管理卷挂进去会把容器内的原有的数据拷贝进来
- 但是docker管理卷默认挂接的权限不好控制
- 联合在一起用会更好
两种方式不同和相同
卷插件简介
- 以上这两种方式都不能实现跨主机同步,都是单机的。
- 实际中是一个集群,容器原先是在server2中运行,后来被迁移到server1,那如何才能访问到原先的数据
- 官方提供驱动和API(可以定制),类似于web服务器,并不属于docker本身,但它们之间可以通信。
- 逻辑
- 需要卷插件时,会自动扫描看有没有可以利用的卷插件,扫描到直接交给Plugin去连接
- 建立NFS服务器
- 位置,都可以读写
- 如果root去写的话不用转换身份
- showmount -e 只是查看nfs的输出
- 把权限全都交给他
- nfs的服务端已经准备好,现在要启动卷插件
- 下载插件
- 解压,拷贝二进制文件
- 使其在系统环境里可以直接调用到
- 该目录卷插件在里面创建
- 软链接
- 创建plugins目录
- 创建文件,名字是卷插件的名字后缀是固定的
- 内容是程序默认sock的路径
- docker就是在这里自动扫描他的缺省路径,来去发现可用的卷插件
- 创建一个卷
- 默认创建目录
- 把卷挂接到容器内
- 如果容器被调度到server2上,如何实现数据一致
- server2本地创建目录然后把server1挂接上去
- 已成功同步
- 从server1拷贝插件到server2
- 在server2也得部署插件
- 解压并移走
- 启动
- 创建卷插件spec文件,缺省扫描路径
- “&”
- 执行启动命令后屏幕输出以上内容,终端出现“假死”情况,直接回车即可继续使用该终端。
- 容器删掉了但卷在
- 迁移的时候用同样地命令挂上去
- 本地有一个卷的名字跟他冲突了,默认挂载的是local的类型
- 要保证volume的驱动一样
- 再次创建,数据才能同步
convoy卷插件实践
- docker服务端引擎访问的是convoy的卷插件,再访问到nfs的存储,由底层的nfs存储再去同步底层文件系统。
- 往server2该目录写东西,其实就通过网络写到了server1服务端
- 在server2创建卷vol2
- server1同步
- 加了卷插件之后,docker重启的速度会变慢
- 回收vol1和vol2
- 重启docker,只会多了debug调试信息
- 错误修改
- 现在删除卷插件,否则会影响server1 docker重启速度
- 删除convoy后台服务
- 删除插件目录
- 删除留有的卷插件信息
- 删除根目录
- 在server1停掉服务
- 删除plugins目录
- 这时就无法扫描到
- 进入/var/lib/docker/
- 所有数据和卷都在这个位置
- 这个数据文件重启docker会再次生效
- server1同样
- 指定卷插件创建
Docker安全
理解Docker安全
命名空间隔离的安全
控制组资源控制的安全
内核能力机制
- down接口无权限
Docker服务端防护
其他安全特性
容器资源控制
容器资源控制
- 激活
- 被挂载到了 /sys/fs/cgroup/
- 过滤cpu、内存
控制内核
- 当前cpu为4核
- 若为4核观察优先级
- “–it”交互式,退出回收
- 20%
- 对比观察
- 消耗cpu资源:无限零设备,取值不定不定,传入到空设备
- 使用top查看
- 占用了100%,dd命令占了4个核
- 退出即回收
- 对比输出
- 被限制在20%
- 限制在40%
- 创建web1,复制其ID:953f8b5afbec
- 配额多少,100000
- -1,无限制
- 是自动创建的
- 删除容器
- 再次创建,设定百分比
- 已经无缝对接了
- 删除之后,目录就没了
控制内存大小写入量
- 本来是无限制的
- 安装辅助工具包,内含cgexec
- 在memory里面创建一个x1控制器
- docker目录里的参数都是从memory复制的
- 单位为字节,大约为200兆
- 10241024200
- 209715200覆盖原先的值
- 但是该参数修改后并不针对任何进程
- tasks里面放了控制的进程
- 控制直接使用物理内存
- 操作系统启动时会在该目录下挂载tmpfs
- 为物理内存的一半
- 消耗可用内存,100兆
- 消耗可用内存,200兆
- 删除后又恢复了
- 是独占还是共享?
- 写入300兆,使用超级用户的身份直接执行的,没有任何的限制
- 交换分区:当物理内存不够了,使用交换分区100兆
- 如果想阻止swap
- 限制内存加交换分区总共可以多少
- 直接killed掉
- 容器内的进程出现这种问题,也会被killed掉
- 同步存在限制
- tasks资源:nginx进程
磁盘限制
- 控制读和写的
- 输出到根,写到设备上,就相当于写在硬盘上,容器共享的。总共写100兆,每秒30兆,直连的
- 取消直连,oflag=direct,会走文件缓存
- 之前学过的其他磁盘控制,但其实不精准,限制的是虚拟内存,而控制组控制的非常精准
- cat /etc/security/limits.conf
Docker安全加固
lxcfs强隔离
- 进入容器查看,把不要的容器进行回收
- 给busybox加内存限制
- 容器内和宿主机内看到的数据一样
- 因为/proc/没有被隔离
- free -m 读的是/proc/meminfo(内存文件,总共可用的)
- 没有做隔离
- 安装lxcfs-2.0.5-3.el7.centos.x86_64,有依赖性,用yum install安装
- 专门用来作隔离的
- 运行,打入后台,敲下回车退出
- 六个关键系统资源
- 把想看到的信息(/cfs/六个信息)挂接覆盖到容器内
docker run -it -m 256m \
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
-v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
-v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
-v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
ubuntu
- 此时容器内存变为256兆,跟核完全同步
- 本身隔离是由/sys/fs/cgroup来完成,lxcfs只是提供了一层隔离
特权
- 正常情况下进入容器内,是不让做操作的
- 例如想对网卡做set down,无权限
- 给网卡添加一个IP,被拒绝
- 该选项加上去就是超级用户了
- 此时可以看到磁盘
- 此时,down掉网卡有权限
- Linux内核提供了能力机制
- 权限列表
- 添加权限
- 只有管理网络有权限,操作磁盘没权限
- 只给必要的权限,尽量少给或者不给
- 加固思路
- 新版本都是用的是Clair,扫描镜像漏洞
- TLS验证——加密连接
- 将其切换锁定到普通用户目录里面,整个容户都和超级用户无关。docker引擎实际上用的是超级用户
- 限制cpu核心资源
- docker镜像仍然是是容器镜像的标准,是容器技术之一
- docker daemon(服务于集群调度) ->调用 containerd -> runc
- 1.24版本的k8s不支持docker,所以写了个插件支持docker