LXC 容器内外的用户权限?

Naf*_*Kay 27 users permissions lxc docker

我在我的服务器上的 Docker LXC 容器内运行一些服务,我开始真正用它们做一些严肃的事情。

我不清楚的一件事是用户权限在容器内部和外部如何工作。例如,如果我在容器中运行 MySQL 并将其数据目录设置为/dataDocker 卷,那么容器内外的权限如何影响访问策略?

显然,这个想法是在容器中以自己的用户身份运行 MySQL(即mysql:mysql),并赋予它对该目录的读写权限。我认为这将是相当简单的,只是chmoding 目录等。但这如何在容器之外工作?现在我有了这个名为“数据”的 Docker 共享卷,我该如何管理对它的访问控制?

我特别希望能够在 Docker 容器之外运行一个非特权用户,该用户将定期访问 MySQL 共享卷并备份数据。

如何设置权限、用户和组,以便主机上的特定用户可以读/写 Docker 共享卷中的文件和文件夹?

beg*_*ner 22

由于 0.9 Docker 的发布已经放弃LXC并使用自己的执行环境,libcontainer. 您的问题有点老了,但我想我的回答仍然适用于您正在使用的版本。

快速解答:要了解卷的权限,可以拿mount --bind Host-Dir Container-Dir. 因此,为了满足您的要求,您可以使用任何传统方法来管理权限。我想 ACL 正是您所需要的

长答案:所以在你的例子中,我们有一个名为dock的容器,带有一个 volume /data

docker run -tid --name dock -v /usr/container/Databases/:/data \
    centos:latest /bin/bash
Run Code Online (Sandbox Code Playgroud)

在容器内,我们的 MySQL 服务器已配置为使用/data用作其数据目录。所以我们/data在容器内部有我们的数据库。在主机操作系统上的容器之外,我们已经挂载了这个/data卷,/usr/container/Databases/并分配了一个普通用户bob来备份数据库。在主机上,我们将为用户bob配置 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/
Run Code Online (Sandbox Code Playgroud)

为了测试它,让我们使用用户bob进行备份。

su - bob
tar -cvf container-data.tar /usr/container/Databases/
Run Code Online (Sandbox Code Playgroud)

tar 将列出来,您可以看到我们的用户能够访问所有文件。

现在从容器内部,如果你检查getfacl你会注意到它显示 3000而不是bob。这是因为 bob 的 UID 是 3000 并且容器中没有这样的用户,所以它只是显示它从元数据接收的 UID . 现在,如果您在容器中创建一个用户,您useradd -u 3000 bob会注意到现在getfacl显示名称 bob 而不是 3000。

摘要:因此,您从容器内部或外部分配的用户权限会反映到这两种环境中。所以要管理卷的权限,宿主机中的 UID 必须与容器中的 UID 不同