我对停止数据库容器有疑问。
- 我有一个docker 镜像运行 postgresql。当我用这个镜像创建一个容器时:
sudo docker run --name db -d asg1612/postgresql
- 它运行命令:
/usr/lib/postgresql/9.3/bin/postgres -D /var/lib/postgresql/9.3/main -c config_file=/etc/postgresql/9.3/main/postgresql.conf
和目录/var/lib/pgdata是创建为容器容积
我使用以下命令停止容器:
sudo docker 停止数据库
数据库是否会正常停止?
我的数据是否会被损坏?
答案1
无论数据库是否“正常”停止,您都不会损坏数据。除非您另行配置,否则只要底层文件系统和磁盘存储遵守磁盘刷新请求 (fsync),PostgreSQL 就是崩溃安全的。您会丢失正在进行的事务,但不会损坏任何事务或留下半途而废的事务。即使您SIGKILL
( kill -9
) 服务器,情况也是如此,但这并不是一个好主意。
您遇到的主要问题是,如果 PostgreSQL 服务器突然关闭,下次启动可能需要更长时间,因为它必须做更多的工作来恢复已提交但尚未完全应用的工作。(过于简单)。
init
如果容器中没有正在运行的进程(sysvinit/systemd/upstart),那么很可能不会执行正常关闭,除非您明确为 docker 提供了某种关闭脚本。(我还没有使用过 docker)。一些快速搜索表明它只是SIGTERM
向容器中的进程发送一个。这对于 PostgreSQL 和事实上pg_ctl -m smart
。可能需要一段时间才能停止,因此您可以选择使用SIGINT
强制中止事务并更快地关闭。