如何处理与许多链接容器的数据库存储/备份和应用程序日志?

我刚刚创build了我的第一个dockerized应用程序,我正在使用docker-compose在我的客户端服务器上启动它:

web: image: user/repo:latest ports: - "8080:8080" links: - db db: image: postgres:9.4.4 

它通过8080端口公开REST API(node.js)。 REST API使用Postgres数据库。 它工作正常。 我的想法是,我将这个文件(docker-compose.yml)给我的客户端,他会运行docker-compose pull && docker-compose up -d每次他想从一个回购中提取新的应用代码(假设他有权访问user/repo回购。

但是,我必须处理两个任务: 数据库备份日志备份

  1. 我怎样才能暴露数据库的主机(docker主机)系统,例如定义cron作业,将使数据库转储和存储在S3?

  2. 我已经阅读了一些关于docker集装箱存储和docker的文章。 据我了解,在我的设置中,所有数据库文件都将存储在“容器内存”中,如果将容器从主机中移除,这些内容将会丢失。 所以我应该使用docker卷来保存“主机端”的数据库数据? 我怎样才能做到这一点与Postgres的形象?

  3. 在我的应用程序中,我将所有信息logging到stdout和stderr以防出错。 如果这些日志是直接“stream”到主机系统上的某些文件,那么它们就会是coll(我认为),所以它们可以备份到S3(例如通过cron job?) – 我该怎么做? 或者,也许有更好的方法?

对不起,有这么多的问题,但我是docker世界的新手,我真的很难理解它是如何工作的,或者它应该如何工作。

  1. 你可以在一个正在运行的容器上执行一个命令来创build一个备份,就像docker exec -it --rm db <command> > sqlDump 。 我不太了解postgres,但是在那种情况下 会在stdout上创build转储, > sqlDump会将其redirect到将在主机当前工作目录上创build的文件sqlDump 。 然后,您可以将创build的转储文件包含到备份中。 这可以通过在主机上定义的cronjob来完成。 但是在下一段中有一个更好的解决scheme。

  2. 如果您像上面所描述的那样运行容器,则在删除容器时会删除卷。 您可以使用第二种方法来使用容器,如下所述 。 在这种情况下,您可以删除并重新创build,例如db容器,而不会丢失数据。 按照这些说明,通过临时容器实例可以非常容易地创build备份。 假设/dbdata是安装卷的位置,其中包含要备份的数据库数据:

     docker run --volumes-from dbdata -v $(pwd):/backup <imageId> tar cvf /backup/backup.tar /dbdata 
  3. 从版本1.6开始,您可以为您的容器实例定义一个日志驱动程序 。 因此,您可以与系统日志进行交互,以在hosts /var/log/syslog文件中创build日志条目。 我不知道S3,但也许这给你一些想法:

     docker run --log-driver=syslog ...