docker中mysql修改密碼問題

以前用的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命令能夠查看到全部數據卷:
image.png數據庫

着這裏使用的爲test_db數據卷,使用docker inspect test_db詳細查看數據卷信息:
image.pngbash

能夠看到數據卷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將正在運行的容器列出,找到須要進入的容器:

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 — 從入門到實踐

相關文章
相關標籤/搜索