当使用 Docker-Compose 部署 MySQL 遇到问题时,可以按照以下步骤进行排查:
docker-compose logs mysql
或查看特定容器的日志:
docker logs <container_name_or_id>
错误表现:
- Bind for 0.0.0.0:3306 failed: port is already allocated
解决方案:
- 更改 compose 文件中的端口映射,如 "3307:3306"
- 或停止占用端口的服务
错误表现:
- Can't create/write to file '/var/lib/mysql/is_writable' (Errcode: 13 - Permission denied)
解决方案:
- 确保挂载目录的权限正确
- 在 compose 文件中添加用户配置:
yaml
user: "1000:50" # 使用适当的用户ID和组ID
错误表现:
- The data directory needs to be empty
解决方案: - 删除或清空挂载的数据目录 - 或使用初始化脚本处理已有数据
错误表现:
- InnoDB: Cannot allocate memory for the buffer pool
解决方案:
- 增加容器内存限制
- 在 compose 文件中添加资源限制:
yaml
deploy:
resources:
limits:
memory: 2G
docker-compose exec mysql bash
然后可以运行 MySQL 客户端:
mysql -u root -p
确保 compose 文件中 MySQL 的环境变量正确:
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: password
确保卷挂载配置正确:
volumes:
- ./mysql-data:/var/lib/mysql
- ./config:/etc/mysql/conf.d
在 compose 文件中添加健康检查:
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: userpassword
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./mysql-config:/etc/mysql/conf.d
restart: unless-stopped
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
volumes:
mysql_data:
如果问题仍然存在,请提供具体的错误信息以便更精确地诊断问题。