Docker volume 调研

资料

docker 官网:use volumes

关注问题

  • 容器重启之后,用户信息、授权信息不丢失
  • 新容器可以从 volume 读入用户信息、授权信息

操作

  • 创建:docker volume create my-vol
  • 查看列表:docker volume ls
  • 查看详情:docker volume inspect my-vol
  • 删除:docker volume rm my-vol
  • 使用: docker run --mount source=my-vol,destination=/my-vol

共享

示意图

k8s pvc调研

资料

k8s官网:persistent volumes

基于 docker volume 和 k8s pvc 的文件共享方案

目标

  • 用户可以做基础的文件管理:增删改查
  • 用户可以共享文件到组,或者取消共享
  • 容器重建之后用户信息、权限信息不丢失
  • 支持docker volume
  • 支持k8s pvc

当前方案

  • 使用docker volume或k8s pvc存储用户文件
  • 将用户信息、权限信息持久化
    • /etc/passwd:用户名
    • /etc/group:组名
    • /etc/shadow:密码
    • ACL授权信息默认存放在文件系统元数据区

主要操作

创建用户

adduser -D username

授权

  • 用户:setfacl -m u:username:rwx filename
  • 组:setfacl -m g:groupname:rwx filename

取消授权

  • 用户:setfacl -x u:username filename
  • 组:setfacl -x g:groupname filename

依赖

  • OS用户管理命令:adduser/deluser
  • OS组管理命令:addgroup/delgroup
  • OS成员与组的关系管理命令:addgroup/delgroup
  • ACL相关命令:setfacl/getfacl

验证

基于alpine-3.8镜像,安装acl工具,以docker volume为例(k8s pvc步骤基本一致)挂载docker volume: alpine-acl-vol到容器目录:/alpine-acl-vol

启动容器

  1. docker run -d --name alpine-acl --mount source=alpine-acl-vol,destination=/alpine-acl-vol alpine-acl:1.0.0

创建用户

  1. docker exec -ti alpine-acl sh
  2. adduser -D jonny
  3. adduser -D jack

创建文件

  1. cd /alpine-acl-vol # 进入 docker volume 所在路径
  2. touch f-root f-jonny f-jack

授权

  1. chown jonny:jonny f-jonny
  2. chown jack:jack f-jack
  3. chmod 640 f-root r-jonny f-jack
  4. setfacl -m u:jonny:r f-jack

权限检查

  1. su jonny
  2. cat f-jonny # 正常
  3. cat f-jack # 正常,因为之前setfacl设置过
  4. exit
  5. su jack
  6. cat f-jack # 正常
  7. cat f-jonny # 无权限
  8. exit

备份用户、组信息

  1. # 目录:/alpine-acl-vol
  2. mkdir user-info
  3. cd user-info
  4. cp /etc/passwd . # 用户信息
  5. cp /etc/group . # 组信息
  6. cp /etc/shadow . # 密码信息

重建容器

  1. docker rm -f alpine-acl
  2. docker run -d --name alpine-acl --mount source=alpine-acl-vol,destination=/alpine-acl-vol alpine-acl:1.0.0

同步用户、组

  1. cp /alpine-acl-vol/* /etc

重新做权限检查

结果和之前一致

参考