如何阻止Docker中MySQL容器自动退出并保持持续运行?
解决Docker中MySQL容器自行退出(Exited 137)的问题
Exited (137) 状态码明确指向容器被系统的OOM(内存不足)杀手强制终止——当主机内存资源耗尽时,系统会优先杀掉占用内存较高的进程(比如MySQL)来释放资源。以下是具体的解决办法:
给容器分配合理的内存资源
启动容器时通过--memory(硬内存上限)和--memory-reservation(软内存限制)参数,确保MySQL有足够的运行内存,同时避免过度占用主机资源。示例命令:docker container run --name mysqldb --network app \ -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=root \ --memory=2g --memory-reservation=1g \ -d mysql:8其中
--memory=2g是容器能使用的最大内存,--memory-reservation=1g是内存软限制,系统内存紧张时会优先回收这部分资源,但不会直接杀死容器。挂载本地目录存储数据(推荐)
将MySQL的数据目录挂载到主机本地,既避免容器重启时数据丢失,也能减少容器内部磁盘IO压力,间接降低内存占用:docker container run --name mysqldb --network app \ -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=root \ --memory=2g --memory-reservation=1g \ -v /your/local/path/mysql-data:/var/lib/mysql \ -d mysql:8替换
/your/local/path/mysql-data为主机上实际的目录路径,确保该目录具备读写权限。调整MySQL配置降低内存消耗
如果主机内存有限,可通过自定义配置减少MySQL的内存占用。创建my.cnf文件:[mysqld] performance_schema = OFF table_definition_cache = 400 table_open_cache = 256启动容器时挂载这个配置文件:
docker container run --name mysqldb --network app \ -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=root \ --memory=2g --memory-reservation=1g \ -v /your/local/path/my.cnf:/etc/mysql/conf.d/my.cnf \ -v /your/local/path/mysql-data:/var/lib/mysql \ -d mysql:8上述配置会关闭性能监控schema,降低表缓存大小,有效减少MySQL的内存开销。
排查主机内存占用情况
定期检查主机内存状态,确认是否有其他进程占用过多资源:free -h top若主机长期内存不足,建议升级内存或关闭不必要的后台进程。
内容的提问来源于stack exchange,提问作者jilnash
相关产品推荐
相关产品推荐

