文章目录
下面记录一下我使用docker-compose同时装多个版本mysql时碰到的问题
docker-compose.yaml配置文件内容如下
version: "3"
services:
mysql-master:
image: mysql:8.0.17
container_name: mysql8.0.17
command: --server-id=1 --log-bin=mysql-bin --binlog-format=row
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: testdb
MYSQL_USER: test
MYSQL_PASSWORD: 123456
ports:
- "3308:3306"
执行命令:docker-compose -f docker-compose.yml up -d
,启动过程中控制台没有错误
结果通过docker ps查看不到启动的容器,也没有什么报错信息
通过docker-compose logs查看日志发现了原因
关键信息是这句
Cannot boot server version 80017 on data directory built by version 80018. Downgrade is not supported
网上搜了一大圈,最终在官方文档中找到原因:
https://dev.mysql.com/doc/refman/8.0/en/downgrading.html
我操作的机器上之前是使用docker-compose装过mysql8.0.18版本的,现在想装mysql8.0.17,版本不兼容,报了这个错误
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 680b8c60dce6 2 months ago 586MB
mysql 8.0 307199bdf3e2 2 months ago 573MB
mysql 8.0.20 be0dbf01a0f3 4 years ago 541MB
mysql 8.0.18 ed1ffcb5eff3 4 years ago 456MB
mysql 8.0.17 b8fd9553f1f0 5 years ago 445MB
此时不使用docker-compose运行,单独使用docker来运行mysql:8.0.17也是不行的
docker run -d --name=mysql-server8.0.17 -p 3309:3306 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.17
以下是该命令中每个参数的含义:
- -d 将以分离模式(attach mode)运行此容器,以便它在后台运行。
- –name 将名称分配mysql-server给您的容器实例。不指定则Docker会生成随机名称
- -p 将 MySQL 容器端口绑定3306到主机上的相同端口。您将能够 使用在您的主机上运行的MySQL 客户端连接到 127.0.0.1端口
- -v 选项将容器卷 ( /var/lib/mysql)内的数据文件夹绑定到mysql-data您在上一步中创建的本地 Docker 卷ss。
- -e 设置环境变量。在这种情况下,MySQL 根密码。
- mysql 是我们用来创建容器的图像的名称。
docker exec -it mysql-server8.0.17 mysql -u root -p123456
docker exec -it mysql-server mysql -u root -p123456
解决办法
因为新安装的低版本的mysql会占用默认的数据目录/var/lib/mysql
,可以将原来安装的高版本使用的数据目录换个位置存放,即不占用/var/lib/mysql目录,然后再安装低版本即可
- 使用本机的绝对路径来作为mysql-server8.0.17这个容器的数据目录
docker run -d --name=mysql-server8.0.17 -p 3309:3306 -v mysql-data:/root/test/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.17
- 使用数据卷,运行容器时指定该数据卷作为mysql的数据目录
注意事项
- 确保您有足够的权限在宿主机的指定目录上创建和写入文件。
- 如果您使用数据卷(如 mysql-data),则 Docker 会处理数据的存储和隔离,而不需要您担心宿主机的具体路径。
- 如果您使用的是 Docker Desktop(在 Windows 或 macOS 上),则宿主机路径可能与您预期的不同,特别是如果您使用的是 Docker Desktop 的虚拟机功能。