docker启动MySQL容器失败原因排查记录

背景

最近在尝试容器搭建MySQL集群时碰到一个错误,启动MySQL时碰到一个,经过排查解决,在此做一个记录

问题过程

1、启动MySQL容器

$ sudo docker run -d -p 3306:3306 \
> --name mysql \
> -v /opt/mysql/log:/var/log/mysql \
> -v /opt/mysql/data:/var/lib/mysql \
> -v /opt/mysql/conf:/etc/mysql \
> -e MYSQL_ROOT_PASSWORD=root \
> mysql
3cf4012772cc2e22732aa6d5eb716d7b290a95da25b750d4a1189e77ab985f33
# 运行后,查看运行中的容器发现没有刚启动MySQL
[bing@centosone nginx]$ sudo docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED        STATUS        PORTS                                                                        NAMES
5c7b103435d1   nginx:latest   "/docker-entrypoint.…"   8 hours ago    Up 8 hours    0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:85->80/tcp, [::]:85->80/tcp   my-nginx
28cda42916c3   nginx:latest   "/docker-entrypoint.…"   15 hours ago   Up 15 hours   0.0.0.0:82->80/tcp, [::]:82->80/tcp                       
  • mysql/log: 存储MySQL日志
  • mysql/data: 是数据库文件(库表数据存放处)存放的地方。必须要挂载到容器外,否则容器重启一切数据消失。
  • mysql/conf: mysql配置,mysql启动时读取配置

查看所有容器docker ps -a:

发现MySQL是已经exit了

$ sudo docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                      PORTS                                                                        NAMES
4e163949caa2   mysql          "docker-entrypoint.s…"   20 minutes ago   Exited (1) 17 minutes ago                                                                                mysql

然后尝试删除容器重启还是一样:

$ sudo docker rm 4e1
4e1
$ sudo docker run -p 3306:3306 
--name mysql 
-v /opt/mysql/log:/var/log/mysql 
-v /opt/mysql/data:/var/lib/mysql 
-v /opt/mysql/conf:/etc/mysql 
-e MYSQL_ROOT_PASSWORD=root 
-d mysql
b3153c7d9d33f28e9808fbd6f8feea44ac12e45f9aec637a789a29b9f7f5dcd2

# 仍然是exit状态
$ sudo docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS                     PORTS                                                                        NAMES
b3153c7d9d33   mysql          "docker-entrypoint.s…"   3 seconds ago   Exited (1) 2 seconds ago                                                                                mysql

查看容器日志:

$ sudo docker logs --tail 100 --follow --timestamps {容器名称}

在这里插入图片描述

问题原因:

如上图,查看日志发现是没有配置文件目录,我们的命令指定的配置文件路径是/etc/mysql/,而容器读取的配置文件路径是/etc/mysql/conf.d/。
在这一行-v /opt/mysql/conf:/etc/mysql,我们将主机路径/opt/mysql/conf挂载到容器路径/etc/mysql下,实际上容器配置在/etc/mysql/conf.d/目录下。

修改启动命令

修改启动命令中的配置文件路径,再次重新启动成功,如下:

sudo docker run -p 3306:3306 --name mysql \
-v /opt/mysql/log:/var/log/mysql \
-v /opt/mysql/data:/var/lib/mysql \
-v /opt/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql
ef8d15ff3c2828b718357ad7d41117ca46c3fec7bb6b3a365c886926b275fbb8

# 启动成功
sudo docker ps 
[sudo] bing 的密码:
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                                                                        NAMES
ef8d15ff3c28   mysql          "docker-entrypoint.s…"   11 minutes ago   Up 11 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp              

mysql容器终于是 Up 状态了

### DockerMySQL 容器不断重启的原因分析与解决方案 当遇到 DockerMySQL 容器不断重启的问题时,可能涉及多个方面的原因。以下是常见的原因及其对应的解决方法: #### 1. 数据目录权限问题 如果 `volumes` 配置中的数据卷路径权限不正确,可能会导致 MySQL 启动失败并触发容器自动重启。确保挂载的数据卷具有正确的读写权限。 ```yaml version: '3' services: db: image: mysql:latest restart: always environment: MYSQL_ROOT_PASSWORD: example volumes: - dbdata:/var/lib/mysql volumes: dbdata: ``` 上述配置中,定义了一个名为 `dbdata` 的卷来存储 MySQL 数据[^1]。确认该卷的权限设置无误,并且主机上的对应路径也允许容器访问。 #### 2. 存储空间不足 MySQL 可能因为磁盘空间不足而无法正常启动。可以通过以下命令检查宿主机和容器内的可用存储空间: ```bash df -h docker exec <container_id> df -h ``` 如果发现存储空间不足,则需要清理不必要的文件或扩展存储容量。 #### 3. 配置参数错误 某些情况下,MySQL 的配置参数可能导致其无法成功初始化。例如,内存分配过低或其他资源限制条件未满足。可以在 `environment` 或者通过挂载自定义的 `my.cnf` 文件调整这些参数。 ```yaml environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: testdb MYSQL_USER: user MYSQL_PASSWORD: password ``` 同时建议增加日志级别以便更好地排查问题所在。 #### 4. 不兼容的基础镜像版本 使用的 MySQL 版本可能与操作系统环境存在冲突或者依赖缺失的情况发生。尝试切换到更稳定的基础镜像版本测试效果如何变化。 #### 5. Kubernetes 调试辅助工具应用 对于复杂场景下的部署(如 K8s),可以利用 kubectl 命令进一步定位具体异常信息。执行如下操作获取更多细节: ```bash kubectl describe pod <pod_name> kubectl logs <pod_name> kubectl cluster-info dump | grep error ``` 其中最后一句能够提取整个集群状态报告里包含关键字 "error" 的部分记录下来用于后续深入研究[^2]。 #### 6. 使用高效的序列化库优化性能表现 虽然这并非直接针对当前状况提出的办法之一,但在实际项目开发过程中引入高性能序列化方案确实有助于减少 I/O 开销从而间接提升稳定性。比如采用 FST、Kryo 等替代传统方式处理大数据量传输需求场合下效率低下难题[^3]。 --- ### 总结 综上所述,要彻底解决 DockerMySQL 容器频繁重启现象需逐一验证以上提到的各种可能性因素直至找到根本诱因为止。通常来说优先从基础层面着手即核查卷映射关系准确性以及硬件资源配置合理性等方面入手较为有效果显著。 ```python import os def check_disk_space(path='/'): total, used, free = shutil.disk_usage(path) print(f'Total: {total // (2**30)} GiB') print(f'Used: {used // (2**30)} GiB') print(f'Free: {free // (2**30)} GiB') check_disk_space() ``` 此脚本可用于快速评估目标分区剩余空间情况作为初步判断依据之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值