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

Docker 如何使用多个链接容器处理数据库存储/备份和应用程序日志?,docker,docker-compose,Docker,Docker Compose,我刚刚创建了我的第一个docker应用程序,我正在使用docker compose在我的客户端服务器上启动它: web: image: user/repo:latest ports: - "8080:8080" links: - db db: image: postgres:9.4.4 它通过8080端口公开RESTAPI(node.js)。RESTAPI使用Postgres数据库。它很好用。我的想法是,我将把这个文件(docker compose.yml)交

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

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

db:
  image: postgres:9.4.4
它通过8080端口公开RESTAPI(node.js)。RESTAPI使用Postgres数据库。它很好用。我的想法是,我将把这个文件(docker compose.yml)交给我的客户,每次他想从repo中提取新的应用程序代码时(假设他有权访问
user/repo
repo),他都会运行
docker compose pull&&docker compose up-d

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

  • 如何向主机(docker主机)系统公开数据库,例如定义cron作业,使数据库转储并存储在S3上

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

  • 在我的应用程序中,我会将所有信息记录到stdout和stderr,以防出错。如果这些日志直接“流式传输”到主机系统上的某些文件,那么它们可能会被备份到S3,例如(再次通过cron作业?)-我如何做到这一点?或者可能有更好的方法

  • 很抱歉问了这么多问题,但我是docker world的新手,我真的很难理解它到底是如何工作的,或者它应该是如何工作的

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

  • 如果按照上述方式运行容器,则删除容器时会删除卷。您可以使用第二种方法。在这种情况下,您可以在不丢失数据的情况下删除并重新创建数据库容器。然后可以通过临时容器实例轻松创建备份。假设
    /dbdata
    是装载卷的位置,其中包含要备份的数据库数据:

    docker run --volumes-from dbdata -v $(pwd):/backup <imageId> tar cvf /backup/backup.tar /dbdata
    
  • docker run --log-driver=syslog ...