docker中mysql修改密码问题

之前用的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命令可以查看到所有数据卷:
docker中mysql修改密码问题_第1张图片

着这里使用的为test_db数据卷,使用docker inspect test_db详细查看数据卷信息:
docker中mysql修改密码问题_第2张图片

可以看到数据卷test_db实际上存储在了本机的/var/lib/docker/volumes/test_db/_data上了。

解决

既然知道了是因为密码保存在了数据卷中导致不能更改,那解决就好办了。

解决方法一: 删除数据卷

  • 第一步:删除容器docker-compose rm -v
  • 第二步:删除数据卷docker volume rm test_db
  • 第三步:重新启动容器docker-compose up

解决方法二:进入容器修改密码
因为删除数据卷会导致之前存储的数据也删除,如果想保留之前的数据,可以进入容器修改密码。

  • 第一步:使用docker container ls将正在运行的容器列出,找到需要进入的容器:

image.png

  • 第二步:使用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 — 从入门到实践

你可能感兴趣的:(docker)