如何在Windows 10(Docker Toolbox)上用docker-compose初始化MySQL数据库?
你提到执行docker-compose up只得到了"Recre..."的截断输出,大概率是容器启动过程中出现了错误但输出没完全展示出来,咱们一步步来排查和解决:
1. 先获取完整的启动日志
首先执行命令查看完整的启动流程和错误细节,这是定位问题的关键:
docker-compose up --force-recreate
如果想后台启动后再看日志,也可以用这组命令:
docker-compose up -d docker logs test
通过完整日志你能看到容器启动时的具体报错,比如权限问题、卷挂载失败(这是Docker Toolbox在Win10上的常见坑)。
2. 排查Docker Toolbox的卷挂载特殊性
Docker Toolbox是通过VirtualBox创建的Linux虚拟机来运行容器的,它默认只把C:\Users目录共享到虚拟机中。如果你的docker-compose.yml和./db目录不在C:\Users路径下,那./db:/var/lib/mysql的挂载会直接失败,导致MySQL无法初始化数据目录。
解决办法:
- 最简单的方式:把你的配置文件和
db目录移动到C:\Users\你的用户名下的任意文件夹里,比如C:\Users\XXX\docker-mysql,再重新执行启动命令 - 进阶方式:手动打开VirtualBox,找到default虚拟机的「设置-共享文件夹」,添加你当前的工作目录作为共享项,然后修改volumes配置为虚拟机内的共享路径(不过第一种方法更省心)
3. 解决数据目录的权限兼容问题
即使挂载成功,Windows文件系统的权限和Linux容器不兼容,可能导致MySQL进程没有/var/lib/mysql目录的读写权限,进而启动失败。
你可以先注释本地挂载配置,测试容器本身能否正常启动:
version: '2' services: db: container_name: test restart: unless-stopped image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: 'password' MYSQL_DATABASE: 'mydb' ports: - 6612:3306 # 暂时注释本地挂载,先测试容器基础功能 # volumes: # - ./db:/var/lib/mysql
如果这样能启动,说明是本地挂载的权限问题,这时候推荐用Docker的命名卷来替代本地目录挂载——命名卷由Docker自行管理,不会有跨系统的权限兼容问题,数据也能持久化:
version: '2' services: db: container_name: test restart: unless-stopped image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: 'password' MYSQL_DATABASE: 'mydb' ports: - 6612:3306 volumes: - mysql-data:/var/lib/mysql volumes: mysql-data:
4. 检查端口占用情况
确保Windows主机的6612端口没有被其他程序占用,执行以下命令检查:
netstat -ano | findstr :6612
如果输出结果里有其他进程占用,就修改docker-compose.yml里的端口映射,比如改成6613:3306。
5. 确认Docker Toolbox虚拟机状态
最后检查VirtualBox里的default虚拟机是否正常运行:
- 打开VirtualBox,查看default虚拟机是否处于「Running」状态
- 如果没运行,先执行
docker-machine start default启动虚拟机,再执行eval $(docker-machine env default)配置环境变量,之后重新执行docker-compose up
按照这些步骤排查,应该能快速定位并解决问题。
内容的提问来源于stack exchange,提问作者Christian Eriksson

