由于自己測試的時候發(fā)現5.7
和8.0
部署不太一樣搏讶,所以這里分2個版本來部署互妓。
docker 部署 MySQL 5.7
直接運行運行一個5.7版本的MySQL
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql57 -d mysql:5.7
MYSQL_ROOT_PASSWORD 指定了 root 的密碼篮撑。
進入容器中纹安,登陸到MySQL毛俏,需要輸入root的登錄密碼幅恋。
docker exec -it mysql57 mysql -uroot -p
看看mysql.user
表中的數據
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
用戶可以在任意機器進行登陸杏死。
于是在本地使用Sequel Pro嘗試連接
可以看到,在5.7
版本下可以直接連接上
docker 部署 MySQL 8.0
按照5.7
版本那樣,直接運行一個8.0
版本的MySQL
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql8 -d mysql:8.0
MYSQL_ROOT_PASSWORD 指定了 root 的密碼淑翼。
進入容器中腐巢,登陸到MySQL,需要輸入root的登錄密碼玄括。
docker exec -it mysql8 mysql -uroot -p
看看mysql.user
表中的數據
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
默認的認證方式是caching_sha2_password
冯丙,而在MySQL5.7
版本則為mysql_native_password
。
我們先不做任何改變遭京,直接使用Sequel Pro嘗試連接
可以發(fā)現银还,需要caching_sha2_password
認證方式登陸,目前的客戶端工具暫時還不支持caching_sha2_password
認證方式登陸洁墙。
解決方案
目前還沒看到好的解決方案蛹疯。
看到不少博文說
配置
--default-authentication-plugin=mysql_native_password
-
兼容新老版本的認證方式
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root' PASSWORD EXPIRE NEVER; #修改加密規(guī)則 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root'; #更新一下用戶的密碼 FLUSH PRIVILEGES; #刷新權限
但是我自己試了這2種方式,仍然無法通過Sequel Pro遠程進行連接热监∞嘞遥看樣子好像是Sequel Pro的問題,并不是MySQL 8的問題孝扛。使用test-build版本的Sequel Pro進行連接就能可以正常連接了列吼。
使用docker-compose進行部署
上面部署都是直接通過docker命令運行一個容器,但是在生產環(huán)境中很少會使用這種方式進行部署苦始,通常都是通過docker stack進行部署的寞钥,docker stack會使用一個yml配置文件來進行部署,所以這里就演示通過docker-compose來部署陌选,那么使用docker stack進行部署時就比較簡單了
version: '3.7'
services:
db:
image: mysql:5.7 # 基礎鏡像
secrets:
- mysql_root_password # 這里使用了docker的secret機制理郑,防止直接在yml文件中直接暴露root的密碼
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_root_password # 通過文件的方式來指定root密碼
MYSQL_USER: wemeng # 非root的用戶名
MYSQL_PASSWORD: 123456 # 非root密碼
ports:
- 3306:3306 # 暴露的端口
networks:
- net # 使用的網絡
volumes:
- [你指定的絕路徑]:/var/lib/mysql # mysql的默認數據存放位置是/var/lib/mysql,通過volumn可以持久化mysql的數據
- [你指定的絕路徑]:/etc/mysql/conf.d # 當 MySQL 服務啟動時會以/etc/mysql/my.cnf為配置文件咨油,本文件會導入 /etc/mysql/conf.d 目錄中所有以 .cnf 為后綴的文件您炉。這些文件會拓展或覆蓋 /etc/mysql/my.cnf 文件中的配置。因此你可以創(chuàng)建你自己需要的配置文件并掛載至 MySQL 容器中的/etc/mysql/conf.d目錄役电。
- ./init-db:/docker-entrypoint-initdb.d/ # init-db目錄映射到/docker-entrypoint-initdb.d赚爵,那么就可以在改目錄下放一些初始化的sql語句
secrets:
mysql_root_password:
file: mysql_root_password.txt # 指定secret的文件
networks: # 配置網絡
net:
ipam:
config:
- subnet: 172.28.0.0/16
有了上述配置文件,可以直接通過
docker-compose -f docker-compose.yml up
就可以直接啟動了法瑟,后面會發(fā)布多個服務時冀膝,只需要講services里面再添加其他服務就可以使用docker stack進行部署了
歡迎關注我的公眾號