在阿里云上使用Docker安装MySQL并开放给外网访问

在阿里云轻量级应用服务器上使用Docker安装MySQL,并将该MySQL开放给外网访问的踩坑记录


一般而言,给服务器安装Docker和MySQL不会出现啥问题,但是在Docker上使用MySQL时要注意,由于新版MySQL镜像修改了默认加密插件,我们要修改插件后才能正常通过外网访问。

我在安装过程中使用的环境是

  • CentOS Linux release 7.3.1611 (Core)
  • Docker version 1.13.1
  • Dockerfile: mysql8.0.16(latest)

安装Docker和下载MySQL镜像

1
yum install docker
1
docker pull mysql

新建MySQL容器

新建一个MySQL容器,将docker里的3306端口映射到本机的3307端口,yourpassword替换成你的密码

1
docker run --name demo-mysql -p3308:3306 -e MYSQL_ROOT_PASSWORD=yourpassword -d mysql

这时是无法在本机或者外网访问的,需要修改MySQL的加密插件,进入该容器:

1
docker exec -it demo-mysql bash

进入MySQL

1
mysql -uroot -p

修改user表

1
2
use mysql;
select user,host,plugin from user;

就会看到下列表格,使用的插件是caching_sha2_password

1
2
3
4
5
6
7
8
9
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| root | % | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

我们要把插件变成mysql_native_password

1
2
3
4
5
grant all PRIVILEGES on *.* to root@'%' WITH GRANT OPTION;

ALTER user 'root'@'%' IDENTIFIED BY 'yourpassword' PASSWORD EXPIRE NEVER;

ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'yourpassword';

再看一次user表,变成了:

1
2
3
4
5
6
7
8
9
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| root | % | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

接下来我们exit退出mysql和docker容器,在阿里云服务器上尝试用127.0.0.1去连接这个MySQL试试,能连上就成功了

1
mysql -h127.0.0.1 -P3308 -uroot -p

来到阿里运功轻量器应用服务器控制台,添加防火墙规则

再尝试用外网连接