我刚刚创建了我的第一个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。
但是我必须处理两项任务:数据库备份和日志备份。
如何将数据库暴露给主机(docker host)系统,例如定义将进行数据库转储并将其存储在S3上的cron作业?
我读过一些关于docker容器存储和docker卷的文章。据我所知,在我的设置中,所有数据库文件都将存储在“容器内存”中,如果从主机中删除容器,它将会丢失。所以我应该使用docker卷来保存“主机端”的数据库数据吗?我如何用postgres图像做到这一点?
在我的应用程序中,我将所有信息记录到stdout和stderr,以防出现错误。如果这些日志直接“流式传输”到主机系统上的某些文件,那么它就是coll(我认为),因此它们可以备份到S3(例如cron job?) - 我怎么能这样做?或者也许有更好的方法?
很抱歉这么多问题,但我是docker-world的新手,我很难理解它是如何运作的,或者它应该如何运作。
答案 0 :(得分:4)
您可以在正在运行的容器上执行命令来创建备份,例如docker exec -it --rm db <command> > sqlDump
。我对 postgres 了解不多,但在这种情况下, 会在stdout上创建转储,而> sqlDump
会将其重定向到文件sqlDump
在主机当前工作目录上创建。然后,您可以将创建的转储文件包含在备份中。这可以通过主机上定义的 cronjob 完美地完成。但是在下一段中有一个更好的解决方案。
如果按上述方法运行容器,则删除容器时将删除卷。你可以采用第二种方法来使用volume containers as described here。在这种情况下,您可以删除并重新创建,例如数据库容器没有丢失数据。通过临时容器实例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 ...