Docker实践(20) – 数据容器

如果你在主机上使用很多volumes,管理容器的启动可能会变得棘手。你可能希望数据只由容器管理,不管在主机上能直接访问数据。一种简单的方法是使用data-only容器。

问题

你想在容器内部访问外部volume,不过你希望这些volume只能由docker访问。

解决方法

设置一个数据容器并在其它容器运行时使用–volumes-from参数连接此数据容器。

讨论

下图展示了数据容器模式的结构,并解释了它的工作原理。

最主要是注意第二个主机,容器不需要知道数据在硬盘的哪个位置。它们所要知道的是数据容器的名称。这使得容器的操作更便捷。
这种方法比直接映射主机目录的另一个好处是,只能由docker访问这些文件,其它进程无法访问。

数据容器不需要运行! 一个常见的困惑是是否需要运行数据容器。不需要!仅仅需要数据容器在主机运行过并不被删除,之后就不需要运行了,但要保存它一直存在。

我们看一个示例看看数据容器怎么使用。
首先运行一个数据容器:

  1. $ docker run -v /shared-data --name dc busybox touch /shared-data/somefile

-v参数不映射主机上的目录,它只在容器责任范围内创建一个目录。此目录使用touch创建了一个文件,这样数据容器马上生效了 – 数据容器不需要运行使用。我们使用busybox镜像来减小容器大小。
然后运行另一个容器来连接数据容器:

  1. docker run -t -i --volumes-from dc busybox /bin/sh
  2. / # ls /shared-data
  3. somefile

–volumes-from参数允许你关联数据容器的volume到当前容器的目录 – 你只需要指定数据容器的ID。

volumes永久存在!当最后一个容器取消关联数据容器时,数据容器的数据不会被删除。 这是为了防止不必要的数据丢失。

使用数据容器可能比直接挂载目录管理起来要难,因为数据只能由docker访问,而不能像直接挂载的能在主机上直接访问。不过你如果希望把volumes给一个容器来管理,希望以后变动时不那么麻烦,那么数据容器可能适合你。

如果你的多个容器的应用程序正在往数据容器里写日志,那么确保它们在数据容器里日志的路径不一样很重要。因为如果日志路径一样的话,那么不同的容器可能会覆盖或截断文件,导致数据丢失。

标签:Docker容器 发布于:2019-11-20 15:50:21