docker - 如何处理具有多个链接容器的数据库存储/备份和应用程序日志?

标签 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来自 repo 的代码(假设他有权访问 user/repo repo.

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

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

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

  3. 在我的应用程序中,我将所有信息记录到 stdout 和 stderr 以防出现错误。如果将这些日志直接“流式传输”到主机系统上的某些文件以便将它们备份到 S3(再次通过 cron 作业?),那将是 coll(我认为)——我该怎么做?或者有更好的方法吗?

很抱歉问了这么多问题,但我是 docker-world 的新手,我真的很难理解它的实际工作方式或它应该如何工作。

最佳答案

  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 ...
    

关于docker - 如何处理具有多个链接容器的数据库存储/备份和应用程序日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31966522/

相关文章:

Windows 10 主页上的 Docker - 在 docker 容器内连接到 docker 引擎

docker & MySQL : No secrets are created with docker-compose file

docker - 如何在docker compose版本: >= 3?中启用IPv6

java - Docker:在/opt/my-service/db 文件夹中Dockerize一个需要mmdb文件的服务

docker - 健康检查 : Dockerfile vs docker-compose. yml

python - requirements.txt 中的 Dask 数据框?

mysql-docker-container - 错误 1045 (28000) : Access denied for user 'root' @'localhost' (using password: NO)

mongodb - MongoDb中的偶发(身份验证?)失败和到期

docker - 将主机指向具有静态域名的Docker容器

ruby-on-rails - 在 Dockerfile 中从 Github bundle