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

时间:2015-08-12 13:22:55

标签: docker docker-compose

我刚刚创建了我的第一个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}} repo。

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

  1. 如何将数据库暴露给主机(docker host)系统,例如定义将进行数据库转储并将其存储在S3上的cron作业?

  2. 我读过一些关于docker容器存储和docker卷的文章。据我所知,在我的设置中,所有数据库文件都将存储在“容器内存”中,如果从主机中删除容器,它将会丢失。所以我应该使用docker卷来保存“主机端”的数据库数据吗?我如何用postgres图像做到这一点?

  3. 在我的应用程序中,我将所有信息记录到stdout和stderr,以防出现错误。如果这些日志直接“流式传输”到主机系统上的某些文件,那么它就是coll(我认为),因此它们可以备份到S3(例如cron job?) - 我怎么能这样做?或者也许有更好的方法?

  4. 很抱歉这么多问题,但我是docker-world的新手,我很难理解它是如何运作的,或者它应该如何运作。

1 个答案:

答案 0 :(得分:4)

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

  2. 如果按上述方法运行容器,则删除容器时将删除卷。你可以采用第二种方法来使用volume containers as described here。在这种情况下,您可以删除并重新创建,例如数据库容器没有丢失数据。通过临时容器实例following these instructions可以非常轻松地创建备份。假设/dbdata是装载卷的位置,其中包含要备份的数据库数据:

    docker run --volumes-from dbdata -v $(pwd):/backup <imageId> tar cvf /backup/backup.tar /dbdata
    
  3. 从版本1.6开始,您可以为容器实例定义log driver。有了它,你可以互动,例如使用 syslog 在主机/var/log/syslog文件中包含日志条目。我不知道S3,但也许这会给你一些想法:

    docker run --log-driver=syslog ...
    
相关问题