人们如何处理Docker容器的持久存储?

我目前正在使用这种方法:构建映像,例如PostgreSQL,然后启动容器

docker run --volumes-from c0dbc34fd631 -d app_name/postgres

恕我直言,这有缺点,我不能(意外地)删除容器“c0dbc34fd631”。

另一个想法是将主机卷“-v”挂载到容器中,然而,容器中的用户id不一定与来自主机的用户id匹配,然后权限可能会被打乱。

注意:除了——volumes-from 'cryptic_id',你还可以使用——volumes-from my-data-container,其中my-data-container是你分配给仅数据容器的名称,例如docker run——name my-data-container…(见公认答案)


当前回答

使用Kubernetes的Persistent Volume Claim (PVC),这是一个Docker容器管理和调度工具:

持久的卷

为此目的使用Kubernetes的优点是:

您可以使用任何存储,如NFS或其他存储,即使节点宕机,存储也不需要。 此外,这些卷中的数据可以配置为即使在容器本身被销毁后也可以保留,以便在必要时由另一个容器回收。

其他回答

使用Docker Compose时,只需附加一个命名卷,例如:

version: '2'
services:
  db:
    image: mysql:5.6
    volumes:
      - db_data:/var/lib/mysql:rw
    environment:
      MYSQL_ROOT_PASSWORD: root
volumes:
  db_data:

这取决于你的场景(这并不适合生产环境),但这里有一种方法:

创建MySQL Docker容器

它的要点是使用主机上的目录进行数据持久性。

在Docker v1.0版本中,可以通过以下命令绑定主机上的文件或目录的挂载:

$ docker run -v /host:/container ...

上面的卷可以用作运行Docker的主机上的持久存储。

我最近写了一篇关于潜在解决方案和演示该技术的应用程序的文章。我发现它在开发和生产过程中非常有效。希望它能帮助或激发一些想法。

回购:https://github.com/LevInteractive/docker-nodejs-example 文章:http://lev-interactive.com/2015/03/30/docker-load-balanced-mongodb-persistence/

我的解决方案是使用新的docker cp,它现在能够从容器中复制数据,无论它是否运行,并将一个主机卷共享到数据库应用程序在容器中创建其数据库文件的同一位置。这种双重解决方案在不使用纯数据容器的情况下工作,直接使用原始数据库容器。

因此,我的systemd init脚本负责将数据库备份到主机上的存档中。我在文件名中放置了时间戳,以便永远不会重写文件。

它在ExecStartPre上执行:

ExecStartPre=-/usr/bin/docker cp lanti-debian-mariadb:/var/lib/mysql /home/core/sql
ExecStartPre=-/bin/bash -c '/usr/bin/tar -zcvf /home/core/sql/sqlbackup_$$(date +%%Y-%%m-%%d_%%H-%%M-%%S)_ExecStartPre.tar.gz /home/core/sql/mysql --remove-files'

它也在ExecStopPost上做同样的事情:

ExecStopPost=-/usr/bin/docker cp lanti-debian-mariadb:/var/lib/mysql /home/core/sql
ExecStopPost=-/bin/bash -c 'tar -zcvf /home/core/sql/sqlbackup_$$(date +%%Y-%%m-%%d_%%H-%%M-%%S)_ExecStopPost.tar.gz /home/core/sql/mysql --remove-files'

另外,我将主机上的一个文件夹作为卷暴露到数据库存储的相同位置:

mariadb:
  build: ./mariadb
  volumes:
    - $HOME/server/mysql/:/var/lib/mysql/:rw

它在我的VM上工作得很好(我为自己构建了一个LEMP堆栈):https://github.com/DJviolin/LEMP

但我只是不知道当你的生活实际上依赖于它时,它是否是一个“防弹”的解决方案(例如,在任何可能的毫秒内进行交易的网上商店)?

在官方Docker主题演讲视频的20分20秒中,演示者对数据库做了同样的事情:

Docker入门

“对于数据库,我们有一个卷,所以我们可以确保,当数据库容器停止时,随着数据库的上升和下降,我们不会丢失数据。”