由于自己測(cè)試的時(shí)候發(fā)現(xiàn)5.7和8.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嘗試連接

可以看到,在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嘗試連接

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

解決方案
目前還沒(méi)看到好的解決方案。
看到不少博文說(shuō)
配置
--default-authentication-plugin=mysql_native_password-
兼容新老版本的認(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)
