之前用的mysql数据库版本都是5.6的,在写新项目的时候,发现最新版的flaway已经不支持mysql5.6了,自己的mysql也是用docker起的,既然要升级,不如顺便把docker的配置文件写了,省得之后别人遇到此问题。
配置文件
在dockerhub中搜索mysql便可以找到mysql的镜像,也是直接给出了docker-compose 的配置:
# Use root/example as user/password credentials
version: '3.1'
services:
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
adminer:
image: adminer
restart: always
ports:
- 8080:8080
在这里我只需要mysql5.7,把配置文件修改一下:
version: '3.1'
services:
db:
image: mysql:5.7
restart: always
command: --default-authentication-plugin=mysql_native_password
ports:
- "3310:3306"
environment:
MYSQL_DATABASE: baeldung
MYSQL_ROOT_PASSWORD: example
volumes:
- db:/var/lib/mysql
volumes:
db:
使用docker-compose up
命令成功启动,但是后来发现密码不太好,更改密码为MYSQL_ROOT_PASSWORD: 123456
,重新启动。
但此时问题出现了,怎么改密码重新启动都只能用之前的example
密码登陆。
原因
当docker容器运行时,会在镜像的基础层上创建一个当前容器的存储层,当容器亡时,容器存储层也随之消亡,任何保存于容器存储层的信息都会随容器删除而丢失。
为了保存数据库中的数据,在上述docker容器中使用volumes: db:/var/lib/mysql
将/var/lib/mysql
目录绑定到数据库db
上。这样一来容器停止也不会丢失数据库中的数据,也正是如此,在第一次启动容器时,已经把root的密码设为example并持久化到数据卷中了,因此再更改密码也不会生效了。
使用 docker volume ls
命令可以查看到所有数据卷:
着这里使用的为test_db数据卷,使用docker inspect test_db
详细查看数据卷信息:
可以看到数据卷test_db
实际上存储在了本机的/var/lib/docker/volumes/test_db/_data
上了。
解决
既然知道了是因为密码保存在了数据卷中导致不能更改,那解决就好办了。
解决方法一: 删除数据卷
- 第一步:删除容器
docker-compose rm -v
- 第二步:删除数据卷
docker volume rm test_db
- 第三步:重新启动容器
docker-compose up
解决方法二:进入容器修改密码
因为删除数据卷会导致之前存储的数据也删除,如果想保留之前的数据,可以进入容器修改密码。
- 第一步:使用
docker container ls
将正在运行的容器列出,找到需要进入的容器:
- 第二步:使用
docker exec -it 620176942e96 bash
进入容器内部。 - 第三步:进入容器内部后使用mysql连接命令
mysql -u root -p
连接mysql数据库。 - 第四步:切换数据库
use mysql
,修改密码update user set authentication_string=PASSWORD("xxx") where User='root';
- 第五步:重新启动容器
docker-compose up
。
参考链接:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
How to change 'root' password in MySQL5.7
Docker — 从入门到实践
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。