Docker部署MySQL

由于自己測(cè)試的時(shí)候發(fā)現(xiàn)5.78.0部署不太一樣,所以這里分2個(gè)版本來(lái)部署。

docker 部署 MySQL 5.7

直接運(yùn)行運(yùn)行一個(gè)5.7版本的MySQL

docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql57 -d mysql:5.7

MYSQL_ROOT_PASSWORD 指定了 root 的密碼。

進(jìn)入容器中,登陸到MySQL,需要輸入root的登錄密碼。

docker exec -it mysql57 mysql -uroot -p

看看mysql.user表中的數(shù)據(jù)

mysql> select Host,User,plugin from mysql.user;
+-----------+---------------+-----------------------+
| Host      | User          | plugin                |
+-----------+---------------+-----------------------+
| localhost | root          | mysql_native_password |
| localhost | mysql.session | mysql_native_password |
| localhost | mysql.sys     | mysql_native_password |
| %         | root          | mysql_native_password |
+-----------+---------------+-----------------------+
4 rows in set (0.00 sec)

可以看到root用戶可以在任意機(jī)器進(jìn)行登陸。

于是在本地使用Sequel Pro嘗試連接

使用Sequel Pro進(jìn)行遠(yuǎn)程連接

可以看到,在5.7版本下可以直接連接上

成功連接

docker 部署 MySQL 8.0

按照5.7版本那樣,直接運(yùn)行一個(gè)8.0版本的MySQL

docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql8 -d mysql:8.0

MYSQL_ROOT_PASSWORD 指定了 root 的密碼。

進(jìn)入容器中,登陸到MySQL,需要輸入root的登錄密碼。

docker exec -it mysql8 mysql -uroot -p

看看mysql.user表中的數(shù)據(jù)

mysql> select Host,User,plugin from mysql.user;
+-----------+------------------+-----------------------+
| Host      | User             | plugin                |
+-----------+------------------+-----------------------+
| %         | root             | caching_sha2_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session    | caching_sha2_password |
| localhost | mysql.sys        | caching_sha2_password |
| localhost | root             | caching_sha2_password |
+-----------+------------------+-----------------------+
5 rows in set (0.00 sec)

可以看到MySQL8默認(rèn)的認(rèn)證方式是caching_sha2_password,而在MySQL5.7版本則為mysql_native_password。

我們先不做任何改變,直接使用Sequel Pro嘗試連接

使用Sequel Pro進(jìn)行遠(yuǎn)程連接

可以發(fā)現(xiàn),需要caching_sha2_password認(rèn)證方式登陸,目前的客戶端工具暫時(shí)還不支持caching_sha2_password認(rèn)證方式登陸。

aching_sha2_password認(rèn)證報(bào)錯(cuò)

解決方案

目前還沒(méi)看到好的解決方案。

看到不少博文說(shuō)

  1. 配置--default-authentication-plugin=mysql_native_password

  2. 兼容新老版本的認(rèn)證方式

    ALTER USER 'root'@'localhost' IDENTIFIED BY 'root' PASSWORD EXPIRE NEVER; #修改加密規(guī)則 
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root'; #更新一下用戶的密碼 
    FLUSH PRIVILEGES; #刷新權(quán)限
    

但是我自己試了這2種方式,仍然無(wú)法通過(guò)Sequel Pro遠(yuǎn)程進(jìn)行連接。看樣子好像是Sequel Pro的問(wèn)題,并不是MySQL 8的問(wèn)題。使用test-build版本的Sequel Pro進(jìn)行連接就能可以正常連接了。

使用docker-compose進(jìn)行部署

上面部署都是直接通過(guò)docker命令運(yùn)行一個(gè)容器,但是在生產(chǎn)環(huán)境中很少會(huì)使用這種方式進(jìn)行部署,通常都是通過(guò)docker stack進(jìn)行部署的,docker stack會(huì)使用一個(gè)yml配置文件來(lái)進(jìn)行部署,所以這里就演示通過(guò)docker-compose來(lái)部署,那么使用docker stack進(jìn)行部署時(shí)就比較簡(jiǎn)單了

version: '3.7'
services:
  db:
    image: mysql:5.7 # 基礎(chǔ)鏡像
    secrets:
      - mysql_root_password # 這里使用了docker的secret機(jī)制,防止直接在yml文件中直接暴露root的密碼
    environment:
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_root_password # 通過(guò)文件的方式來(lái)指定root密碼
      MYSQL_USER: wemeng # 非root的用戶名
      MYSQL_PASSWORD: 123456 # 非root密碼
    ports:
      - 3306:3306 # 暴露的端口
    networks:
      - net # 使用的網(wǎng)絡(luò)
    volumes:
      - [你指定的絕路徑]:/var/lib/mysql # mysql的默認(rèn)數(shù)據(jù)存放位置是/var/lib/mysql,通過(guò)volumn可以持久化mysql的數(shù)據(jù)
      - [你指定的絕路徑]:/etc/mysql/conf.d # 當(dāng) MySQL 服務(wù)啟動(dòng)時(shí)會(huì)以/etc/mysql/my.cnf為配置文件,本文件會(huì)導(dǎo)入 /etc/mysql/conf.d 目錄中所有以 .cnf 為后綴的文件。這些文件會(huì)拓展或覆蓋 /etc/mysql/my.cnf 文件中的配置。因此你可以創(chuàng)建你自己需要的配置文件并掛載至 MySQL 容器中的/etc/mysql/conf.d目錄。
      - ./init-db:/docker-entrypoint-initdb.d/ # init-db目錄映射到/docker-entrypoint-initdb.d,那么就可以在改目錄下放一些初始化的sql語(yǔ)句
secrets:
  mysql_root_password:
    file: mysql_root_password.txt # 指定secret的文件
networks:  # 配置網(wǎng)絡(luò)
  net:
    ipam:
      config:
        - subnet: 172.28.0.0/16

有了上述配置文件,可以直接通過(guò)

docker-compose -f docker-compose.yml up

就可以直接啟動(dòng)了,后面會(huì)發(fā)布多個(gè)服務(wù)時(shí),只需要講services里面再添加其他服務(wù)就可以使用docker stack進(jìn)行部署了

歡迎關(guān)注我的公眾號(hào)

我的公眾號(hào)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容