如何处理具有许多链接容器的数据库 storage/backup 和应用程序日志?
How to handle database storage/backup and application logs with many linked containers?
我刚刚创建了我的第一个 docker 化应用程序,我正在使用 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) 提供给我的客户,每次他想从回购(假设他有权访问 user/repo
回购。
但是我必须处理两个任务:数据库备份和日志备份。
我如何将数据库暴露给主机(docker 主机)系统,例如定义将进行数据库转储并将其存储在 S3 上的 cron 作业?
我读过一些关于 docker 容器存储和 docker 卷的文章。据我了解,在我的设置中,所有数据库文件都将存储在 "container memory" 中,如果从主机中删除容器,这些文件将会丢失。所以我应该使用 docker 卷来保存 "host side" 上的数据库数据,对吗?我如何使用 postgres 图像做到这一点?
在我的应用程序中,我将所有信息记录到 stdout 和 stderr 以防出现错误。如果这些日志直接 "streamed" 到主机系统上的某些文件,那么它们将是 coll(我认为),例如它们可以备份到 S3(再次通过 cron 作业?) - 我该怎么做?或者有更好的方法吗?
抱歉问了这么多问题,但我是 docker-world 的新手,我真的很难理解它的实际工作原理或它应该如何工作。
您可以在 运行ning 容器上执行命令来创建备份,例如 docker exec -it --rm db <command> > sqlDump
。我不太了解 postgres 但在那种情况下 会在 stdout 上创建转储,而 > sqlDump
会将其重定向到文件 sqlDump
将在主机当前工作目录中创建。然后您可以将创建的转储文件包含到您的备份中。这可以通过在主机上定义的 cronjob 来完美完成。但是下一段中链接了一个更好的解决方案。
如果您 运行 您的容器如上所述,当您删除容器时,您的卷也会被删除。您可以采用第二种方法来使用 volume containers as described here. In that case you could remove and re-create e.g. the db container without loosing your data. A backup could be created very easy then via a temporary container instance following these instructions。假设 /dbdata
是您的卷的安装位置,其中包含要备份的数据库数据:
docker run --volumes-from dbdata -v $(pwd):/backup <imageId> tar cvf /backup/backup.tar /dbdata
从 1.6 版开始,您可以为您的容器实例定义一个 log driver。有了它,你可以互动,例如使用您的 syslog 在主机 /var/log/syslog
文件中包含日志条目。我不知道 S3,但也许这会给你一些想法:
docker run --log-driver=syslog ...
我刚刚创建了我的第一个 docker 化应用程序,我正在使用 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) 提供给我的客户,每次他想从回购(假设他有权访问 user/repo
回购。
但是我必须处理两个任务:数据库备份和日志备份。
我如何将数据库暴露给主机(docker 主机)系统,例如定义将进行数据库转储并将其存储在 S3 上的 cron 作业?
我读过一些关于 docker 容器存储和 docker 卷的文章。据我了解,在我的设置中,所有数据库文件都将存储在 "container memory" 中,如果从主机中删除容器,这些文件将会丢失。所以我应该使用 docker 卷来保存 "host side" 上的数据库数据,对吗?我如何使用 postgres 图像做到这一点?
在我的应用程序中,我将所有信息记录到 stdout 和 stderr 以防出现错误。如果这些日志直接 "streamed" 到主机系统上的某些文件,那么它们将是 coll(我认为),例如它们可以备份到 S3(再次通过 cron 作业?) - 我该怎么做?或者有更好的方法吗?
抱歉问了这么多问题,但我是 docker-world 的新手,我真的很难理解它的实际工作原理或它应该如何工作。
您可以在 运行ning 容器上执行命令来创建备份,例如
docker exec -it --rm db <command> > sqlDump
。我不太了解 postgres 但在那种情况下 会在 stdout 上创建转储,而> sqlDump
会将其重定向到文件sqlDump
将在主机当前工作目录中创建。然后您可以将创建的转储文件包含到您的备份中。这可以通过在主机上定义的 cronjob 来完美完成。但是下一段中链接了一个更好的解决方案。如果您 运行 您的容器如上所述,当您删除容器时,您的卷也会被删除。您可以采用第二种方法来使用 volume containers as described here. In that case you could remove and re-create e.g. the db container without loosing your data. A backup could be created very easy then via a temporary container instance following these instructions。假设
/dbdata
是您的卷的安装位置,其中包含要备份的数据库数据:docker run --volumes-from dbdata -v $(pwd):/backup <imageId> tar cvf /backup/backup.tar /dbdata
从 1.6 版开始,您可以为您的容器实例定义一个 log driver。有了它,你可以互动,例如使用您的 syslog 在主机
/var/log/syslog
文件中包含日志条目。我不知道 S3,但也许这会给你一些想法:docker run --log-driver=syslog ...