生产环境中强烈不建议使用环回设备。

40

我想在我的CentOS 7.1系统中测试Docker,但是我遇到了这个警告:

[root@docker1 ~]# docker run busybox /bin/echo Hello Docker
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
Hello Docker

我想知道这个警告的原因和如何抑制它。

这个CentOS实例是在由vagrant创建的virtualbox中运行的。

3个回答

57

警告消息是因为您的Docker存储配置使用了“loopback device”——一种虚拟块设备,例如/dev/loop0,实际上由文件在您的文件系统上支持。这从未被视作更多的东西,只是一个快速的hack,以便证明Docker能够快速运行。

您不想抑制警告; 您希望修复您的存储配置,使不再发出警告。最简单的方法是为Docker的devicemapper存储驱动程序分配一些本地磁盘空间并使用它。

如果您正在使用LVM,并且卷组上有一些可用的空间,则相对容易。例如,要给docker 100G的空间,请首先创建数据和元数据卷:

# lvcreate -n docker-data -L 100G /dev/my-vg
# lvcreate -n docker-metadata -L1G /dev/my-vg

然后通过编辑/etc/sysconfig/docker-storage文件的方式配置Docker使用该空间,让其变成以下所示:

DOCKER_STORAGE_OPTIONS=-s devicemapper --storage-opt dm.datadev=/dev/my-vg/docker-data --storage-opt dm.metadatadev=/dev/my-vg/docker-metadata

如果您没有使用LVM或VG上没有可用的空闲空间,您可以以类似的方式向Docker公开其他块设备(例如,备用磁盘或分区)。

这个话题有一些有趣的记录,可以在此处找到


谢谢。我认为我应该学习更多关于Docker存储的知识,并进行测试。 - rocksun
1
您可能会发现这篇有关可用存储选项的调查很有趣。 - larsks
1
如果有足够的内存(在刀片上为100+ GB),并将docker主机视为短暂单位,用于完成特定工作并在工作完成后自动结束(通常是CI系统中的情况),那么我想环回是一个可行的选项。使用RAM作为快速磁盘非常具有吸引力。 - allprog
1
VG 代表什么? - Pierre Prinetti
2
@PierrePrinetti VG = 卷组
LVM 如何操作
- Dylan
显示剩余2条评论

4
感谢您。这让我疯狂起来。我以为是bash输出了这个消息。我正准备提交一个关于bash的错误报告。不幸的是,在笔记本电脑或类似设备上,磁盘已被充分利用,所提供的选项都不可行。以下是我针对该场景的答案。
以下是我在笔记本电脑的 /etc/sysconfig/docker-storage 中使用的内容:
DOCKER_STORAGE_OPTIONS="--storage-opt dm.no_warn_on_loop_devices=true"

注意:我必须重启docker服务才能生效。在Fedora上,命令如下:
systemctl stop docker
systemctl start docker

还有一个重启命令(systemctl restart docker),但在重新启动之前最好检查一下停止是否真的起作用了。

如果您不介意在容器中禁用SELinux,则可以使用overlay。以下是一个完整描述的链接:

http://www.projectatomic.io/blog/2015/06/notes-on-fedora-centos-and-docker-storage-drivers/

总之,在/etc/sysconfig/docker中:

OPTIONS='--selinux-enabled=false --log-driver=journald'

并且对于/etc/sysconfig/docker-storage:

DOCKER_STORAGE_OPTIONS=-s overlay

当您更改存储类型时,重新启动docker将销毁您的完整镜像和容器存储。在此过程中,您可能会将所有内容都放在/var/lib/docker文件夹中:

systemctl stop docker
rm -rf /var/lib/docker
dnf reinstall docker
systemctl start docker

在RHEL 6.6中,任何具有docker访问权限的用户都可以访问我的私钥,并通过卷以最简单的方式作为root运行应用程序。 SELinux是Fedora和RHEL 7中防止这种情况发生的唯一方法。 也就是说,目前不清楚RHEL 7安全性增强的多少来自容器外部的SELinux,以及内部的SELinux有多少起到了作用...
通常,环回设备适用于最大100GB限制和稍微降低一些性能不是问题的情况。 我能找到的唯一问题是,如果运行时出现磁盘已满错误,则docker存储可能会损坏... 可以通过配额或其他简单的解决方案避免这种情况。
但是,对于生产实例来说,确保正确设置非常值得花费时间和精力。
100G可能过多,容器和镜像相当小。 许多组织在VM中运行docker容器作为安全和隔离的额外措施。 如果是这样,您可能每个VM只运行很少数量的容器。 在这种情况下,甚至10G可能足够。
最后需要注意的是,即使使用直接lvm,您可能也需要为/var/lib/docker添加一个额外的文件系统。 原因是命令“docker load”将在将其添加到数据存储之前在此文件夹中创建正在加载的镜像的未压缩版本。 因此,如果您试图使其小而轻,则请探索除直接lvm之外的其他选项。

我机器上甚至没有 /etc/sysconfig/docker-storage。你是怎么得到它的? - IgorGanapolsky

0

@Igor Ganapolsky Feb和@Mincă Daniel Andrei

请看这个:

systemctl edit docker --full

如果在[Service]块中没有列出指令EnvironmentFile,那么就没戏了(我在Centos7上也遇到了这个问题),但是你可以像这样扩展标准的systemd unit:

systemctl edit docker EnvironmentFile=-/etc/sysconfig/docker ExecStart= ExecStart=/usr/bin/dockerd $OPTIONS

并创建一个文件/etc/sysconfig/docker,其中包含以下内容:

OPTIONS="-s overlay --storage-opt dm.no_warn_on_loop_devices=true"


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