Docker 安装 MySQL 时,为什么配置数据挂载目录会导致启动失败?

上周,有客户问我,为什么安装 Docker MySQL 时配置数据预加载会导致启动失败。
我给大家介绍一下,首先当Docker启动一个MySQL容器时,它会默认创建一个匿名卷,然后将其挂载到容器中的/var/lib/mysql目录下。
该目录是MySQL数据存储的地方,比如数据库表、日志等。
这样做是为了数据持久化,即即使容器被删除,数据仍然存在。

那么问题来了。
用户有时使用 -v 或 --mount 选项手动指定要挂载的主机目录。
这次,Docker 也会将这个目录挂载到容器的 /var/lib/mysql 目录下。
这里有一个问题。
容器中的这个目录被两个东西覆盖,一个是匿名的 Docker 卷,另一个是用户指定的主机目录。
如果这两件事相互依赖,就会导致解决方案的权限或者路径出错,容器自然就无从下手了。

常见的几种错误,如目录权限不足、宿主目录没有正确的读写权限等;目录不为空,如果宿主目录中已经存在MySQL数据工具无法预料的文件,也会出现问题;还有 SELinux 或 AppArmor 限制和格式错误,例如 Windows 系统上的分隔符不正确。

更多解决方案如下。
首先是发现匿名卷的故障,使用--Montytype=conquered避免冲突;第二个使用 Docker 管理的命名卷来避免权限问题;三是检查并恢复权限,确保主机目录有正确的权限;第四,如果净化因前一次的停止而继续运行,那么净化应该分不同的卷。

最后,验证和调试也很重要。
您可以查看集装箱的后备箱,检查登机状态,并简化测试。
先不要挂载信息索引,确认容器是否应该正常启动,然后再移动问题。

有适合你的东西。
建议优先使用命名卷,方便管理,避免许可风险。
这个问题我还在想,如果还有其他问题可以问我。

你在 Docker 中跑 MySQL?恭喜你,可以滚了!

嘿,我们来谈谈 Docker 和 MySQL。
我之前在做数据库迁移的时候也经历过这个坑。

记得当年在一家初创公司,我们使用Docker部署MySQL,但是出现了数据安全问题。
一旦容器关闭,所有数据都将丢失。
这谁能受得了?当时我们使用了大量的数据。
虽然持久化问题得到了解决,但是UnionFS镜像层的存储机制并不是很安全。
如果有微小的干扰,数据就会被破坏。

那么性能瓶颈也是一个大问题。
我们公司的服务器上运行着几个容器。
从而导致MySQL的IO性能受到影响,读写延迟严重,慢如蜗牛。
我当时确实很头疼。
与银行架构师讨论了很长时间后,发现Docker的共享存储模型与银行的数据库架构不匹配。

我们来谈谈政府管理。
Docker 是无状态的,MySQL 是有状态的。
两者放在一起就有点矛盾了。
此时,当容器重新启动时,数据库连接池必须重新初始化,从而导致服务中断,用户体验非常糟糕。

资源隔离还不够。
容器之间的资源是共享的。
主机上的其他应用程序可能会占用 MySQL 资源,从而导致性能下降。

但是,也有一些场景 Docker 也可以运行 MySQL。
比如那些对数据丢失不太敏感的业务,或者测试环境,或者自动化运维系统支持的场景。

所以我认为我们必须权衡利弊。
开发测试环境可以使用Docker搭建MySQL集群,也可以考虑边缘计算场景。
如果您对数据安全性和性能要求较高,请坚持物理机部署。

这件事我不敢乱说。
毕竟我在这方面的经验有限,但是基于我之前遇到的坑,我还是希望能帮到你。
呵呵,先不说这里了,有时间继续聊其他的坑。