以前用的mysql数据库版本都是5.6的,在写新项目的时候,发现最新版的flaway已经不支持mysql5.6了,本身的mysql也是用docker起的,既然要升级,不如顺便把docker的配置文件写了,免得以后别人遇到此问题。vue
在dockerhub中搜索mysql即可以找到mysql的镜像,也是直接给出了docker-compose 的配置:mysql
# 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,把配置文件修改一下:git
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
密码登录。github
当docker容器运行时,会在镜像的基础层上建立一个当前容器的存储层,当容器亡时,容器存储层也随之消亡,任何保存于容器存储层的信息都会随容器删除而丢失。sql
为了保存数据库中的数据,在上述docker容器中使用volumes: db:/var/lib/mysql
将/var/lib/mysql
目录绑定到数据库db
上。这样一来容器中止也不会丢失数据库中的数据,也正是如此,在第一次启动容器时,已经把root的密码设为example并持久化到数据卷中了,所以再更改密码也不会生效了。docker
使用 docker volume ls
命令能够查看到全部数据卷:数据库
着这里使用的为test_db数据卷,使用docker inspect test_db
详细查看数据卷信息:bash
能够看到数据卷test_db
实际上存储在了本机的/var/lib/docker/volumes/test_db/_data
上了。spa
既然知道了是由于密码保存在了数据卷中致使不能更改,那解决就好办了。rest
解决方法一: 删除数据卷
docker-compose rm -v
docker volume rm test_db
docker-compose up
解决方法二:进入容器修改密码
由于删除数据卷会致使以前存储的数据也删除,若是想保留以前的数据,能够进入容器修改密码。
docker container ls
将正在运行的容器列出,找到须要进入的容器:docker exec -it 620176942e96 bash
进入容器内部。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 — 从入门到实践