Docker数据卷容器。我似乎无法备份。

3

阅读以下链接:

  1. https://docs.docker.com/userguide/dockervolumes/#backup-restore-or-migrate-data-volumes
  2. Backing up data volume containers off machine

我的理解是我可以将数据卷容器进行归档备份。然而在阅读第一个链接后,我似乎无法使其正常工作。

docker create -v /sonatype-work --name sonatype-work sonatype/nexus /bin/true

我使用以下命令在容器中启动sonatype/nexus镜像:

--volumes-from sonatype-nexus

一切都很好,在运行Nexus之后,我检查了数据卷,可以看到内部已经创建,并停止并删除Nexus,再次启动时,所有更改都得到了保存。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
f84abb054d2e        sonatype/nexus      "/bin/sh -c 'java   -"   22 seconds ago      Up 21 seconds       0.0.0.0:8081->8081/tcp   nexus
1aea2674e482        sonatype/nexus      "/bin/true"              25 seconds ago      Created                                      sonatype-work

我想备份sonatype-work,但一直没有成功。

[root@ansible22 ~]# pwd
/root
[root@ansible22 ~]# docker run --volumes-from sonatype-work -v $(pwd):/backup ubuntu tar cvf /backup/sonatype-work-backup.tar /sonatype-work
tar: /backup/sonatype-work-backup.tar: Cannot open: Permission denied
tar: Error is not recoverable: exiting now

我尝试以 -u root 的身份运行,我还尝试了以下方式:

/root/sonatype-work-backup.tar

当我这样做时,我可以看到它正在撕裂东西,但我没有看到tar文件。根据示例和我的理解,我认为那不是正确的方法。有人能看出我哪里做错了吗?编辑:Linux版本信息。
Fedora release 22 (Twenty Two)
NAME=Fedora
VERSION="22 (Twenty Two)"
ID=fedora
VERSION_ID=22
PRETTY_NAME="Fedora 22 (Twenty Two)"
ANSI_COLOR="0;34"
CPE_NAME="cpe:/o:fedoraproject:fedora:22"
HOME_URL="https://fedoraproject.org/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Fedora"
REDHAT_BUGZILLA_PRODUCT_VERSION=22
REDHAT_SUPPORT_PRODUCT="Fedora"
REDHAT_SUPPORT_PRODUCT_VERSION=22
PRIVACY_POLICY_URL=https://fedoraproject.org/wiki/Legal:PrivacyPolicy
VARIANT="Server Edition"
VARIANT_ID=server
Fedora release 22 (Twenty Two)
Fedora release 22 (Twenty Two)

奇怪,这正是我处理数据卷的步骤。刚刚尝试了一下这些Nexus容器,也可以工作。你当前运行的目录权限有什么奇怪的问题吗?如果你使用/tmp代替,像这样 docker run --volumes-from sonatype-work -v /tmp:/backup ubuntu tar cvf /backup/sonatype-work-backup.tar /sonatype-work 会怎样? - Will Hogan
我刚刚在 /tmp 尝试了一下,还是出现了同样的错误。这是在 /root 下作为 root 用户进行的全新 fedora22 安装,我想知道是否是那个该死的 selinux 的问题? - Pompey Magnus
非常可能。尝试在--volumes-from后面添加:Z,即 docker run --volumes-from sonatype-work -v $(pwd):/backup:Z ubuntu tar cvf /backup/sonatype-work-backup.tar /sonatype-work。另一个选择是特权模式下运行容器,即使用--privileged=true参数。 - Will Hogan
特权用户和 -u root 是一样的吗? - Pompey Magnus
它在提供扩展设备访问和与AppArmor或SELinux交互方面更进一步。一些细节:https://docs.docker.com/compose/reference/run/。正如该页面所述,它还可以启用诸如“Docker in Docker”之类的功能 :) - http://blog.docker.com/2013/09/docker-can-now-run-within-docker/。 - Will Hogan
2个回答

3
这是与selinux标签有关的原因。关于此,有几个有用的Project Atomic页面: Docker和Linux

受限容器进程的默认类型为svirt_lxc_net_t。此类型被允许读取和执行/usr下的所有文件类型以及/etc下的大多数类型。svirt_lxc_net_t被允许使用网络,但不被允许读取/var、/home、/root、/mnt等目录下的内容。svirt_lxc_net_t只被允许写入标记为svirt_sandbox_file_t和docker_var_lib_t的文件。默认情况下,容器中的所有文件都标记为svirt_sandbox_file_t。

然后在 使用Docker卷可能会导致SELinux问题
这将使用精确的MCS标签对容器内的内容进行标记,基本上运行chcon -Rt svirt_sandbox_file_t -l s0:c1,c2 /var/db,其中s0:c1,c2对于每个容器都不同。(在本例中不是/var/db而是/root)。如果您使用-v /SOURCE:/DESTINATION:z挂载卷,Docker将自动重新标记内容为s0。如果您使用Z挂载卷,则标签将特定于该容器,并且无法在容器之间共享。因此,在这种情况下,z或Z都适用,但人们通常更喜欢Z以实现隔离。

1
非常感谢,信息很有用。还要注意的是,如果您想按照Docker的指导将tar文件恢复到容器中,同样适用于此处所述的方法:https://docs.docker.com/userguide/dockervolumes/#backup-restore-or-migrate-data-volumes - Pompey Magnus

0

我之所以遇到了权限被拒绝的问题,是因为selinux。目前我还不确定原因,但如果我找到了,会在回答中进行编辑。禁用selinux并重新启动后,我成功地完成了备份。


我认为你可以在-v行中尝试使用:Z。从1.7开始,当使用此选项时,Docker会动态添加标签,请参见https://github.com/docker/docker/pull/5910 - Will Hogan
我重新启动了SELinux并添加了Z,它能够正常工作。如果你能写一些回答的内容,我会标记你的回答为采纳。我想了解更多关于它的知识。谢谢。 - Pompey Magnus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接