由于自己测试的时候发现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尝试连接
可以发现,需要caching_sha2_password
认证方式登陆,目前的客户端工具暂时还不支持caching_sha2_password
认证方式登陆。
解决方案
目前还没看到好的解决方案。
看到不少博文说
配置
--default-authentication-plugin=mysql_native_password
-
兼容新老版本的认证方式
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root' PASSWORD EXPIRE NEVER; #修改加密规则 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root'; #更新一下用户的密码 FLUSH PRIVILEGES; #刷新权限
但是我自己试了这2种方式,仍然无法通过Sequel Pro远程进行连接??囱雍孟袷荢equel Pro的问题,并不是MySQL 8的问题。使用test-build版本的Sequel Pro进行连接就能可以正常连接了。
使用docker-compose进行部署
上面部署都是直接通过docker命令运行一个容器,但是在生产环境中很少会使用这种方式进行部署,通常都是通过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 文件中的配置。因此你可以创建你自己需要的配置文件并挂载至 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
就可以直接启动了,后面会发布多个服务时,只需要讲services里面再添加其他服务就可以使用docker stack进行部署了
欢迎关注我的公众号