我正在我的服务器上的 Docker LXC 容器内运行一些服务,并且我开始真正用它们做一些严肃的事情。
我不清楚的一件事是用户权限在容器内部和外部如何工作。例如,如果我在容器中运行 MySQL 并将其数据目录设置为/data
Docker 卷,那么容器内部和外部的权限如何影响访问策略?
显然,这个想法是在容器中以自己的用户身份运行 MySQL(即mysql:mysql
),并赋予它对该目录的读写权限。我认为这相当简单,只需chmod
访问目录等。但这是如何工作的外部容器的?现在我有了这个名为“data”的 Docker 共享卷,如何管理对其的访问控制?
我特别希望能够运行非特权用户外部Docker容器会定期访问MySQL共享卷并备份数据。
如何设置权限、用户和组,以便主机上的特定用户可以读取/写入 Docker 共享卷中的文件和文件夹?
答案1
自 0.9 Docker 发布以来,Docker 已放弃LXC
并使用自己的执行环境,libcontainer
.您的问题有点旧,但我想我的答案仍然适用您正在使用的版本。
快速回答:要理解卷的权限,可以类比mount --bind Host-Dir Container-Dir
。因此,为了满足您的要求,您可以使用任何传统的方法来管理权限。我想 ACL 就是你需要的。
长答案:正如在您的示例中我们有一个名为的容器码头有卷/data
。
docker run -tid --name dock -v /usr/container/Databases/:/data \
centos:latest /bin/bash
在容器内,我们的 MySQL 服务器已配置为使用/data
作为其数据目录。所以我们的数据库位于/data
容器内部。在主机操作系统的容器外部,我们已挂载该/data
卷/usr/container/Databases/
并分配一个普通用户鲍勃备份数据库。我们将从主机上为用户配置 ACL鲍勃。
useradd -u 3000 bob
usermod -R o=--- /usr/container/Databases/
setfacl -R -m u:bob:rwx /usr/container/Databases/
setfacl -R -d -m u:bob:rwx /usr/container/Databases/
为了测试它,让我们与用户一起进行备份鲍勃。
su - bob
tar -cvf container-data.tar /usr/container/Databases/
tar 将列出,您可以看到我们的用户能够访问所有文件。
现在从容器内部检查,getfacl
你会发现鲍勃它显示 3000。这是因为 bob 的 UID 是 3000,并且容器中没有这样的用户,因此它只显示从元数据接收的 UID。现在,如果您在容器中创建用户,useradd -u 3000 bob
您会注意到现在getfacl
显示名称 bob 而不是 3000。
概括:因此,您从容器内部或外部分配的用户权限会反映到这两个环境。所以为了管理卷的权限,主机中的UID必须与容器中的UID不同。