亚马逊 EC2 上的 Docker

亚马逊 EC2 上的 Docker

我在 AWS(EC2、T2 介质)上运行多个 Docker 容器,并且经常耗尽磁盘空间。它与底层文件系统有关。我在 Ubuntu 上运行 Docker,它运行良好(AUFS)。默认 AWS Linux 版本基于 RHEL,应使用设备映射器。这看起来要复杂得多,但令我惊讶的是没有像样的手册如何使用它(或者我找不到它)。

我可以在 EC2 上使用 Ubuntu 映像,但我认为应该可以在 EC2 上运行 Docker,而不会出现太多问题?或者我需要做一些特殊的事情来防止它耗尽磁盘空间?

我只使用 NGINX 和 NodeJS 图像。

答案1

默认情况下,docker 将其数据存储在/var/lib/docker.该路径也在根分区上吗?

此外,默认情况下,当您创建 EC2 实例时,根卷通常很小(大约 4GB)。您的根分区很可能也是存储 docker 映像的位置,而您的根分区太小了。

因此,要么增大你的根分区。或者,附加一个新的 EBS 卷,将其安装在某个合理的位置/var/lib/docker,并告诉 docker 使用该新的 EBS 卷来存储映像。

如果您想更改 docker 存储图像的目录而不是默认目录,/var/lib/docker请在启动 docker 守护进程时使用 -g 选项。

看:如何更改docker镜像安装目录有关如何更改默认 docker 工作路径的更多详细信息。

答案2

Amazon Linux 版本使用设备映射器作为 Docker 存储驱动程序。设备映射器使用分层的写时复制块设备到容器。当没有写入数据时,它几乎不使用任何磁盘空间。当文件系统中的页面被写入时,它将从设备映射器分配数据并开始使用磁盘空间。

设备映射器的默认磁盘大小为 10GB,因此当运行 6 个映像时,如果所有页面都被写入,则可能需要 60GB。不可能所有页面都被写入,但默认的 EC2 实例只有 8GB,这还不够。

当写入文件时,它会被写入多个块。如果块尚未写入,则将从设备池中分配。当文件被删除时,该块在文件系统中被标记为未使用,但池不知道这一点。只有当弗斯特里姆运行后,文件系统从设备管理器中释放页面。

NGINX 在 /tmp/cache 上维护一个缓存,并且不断地写入。如果文件系统继续使用不同的块,那么它将继续分配块,直到所有 10GB 都映射到设备管理器。这个问题有几种解决方案:

  1. 使用足够大的设备映射器设备来容纳所有块。
  2. 使用较小的基本大小(搜索 dm.basesize)以确保图像不能达到 10GB。
  3. 切换到使用 AUFS 存储的发行版。

你也可以运行弗斯特里姆定期确保释放的块返回到池中。这可能很棘手,因为在峰值负载期间,它可能运行得不够频繁,并且池可能仍然会耗尽磁盘空间。

相关内容