Docker部署MySQL

由于自己测试的时候发现5.78.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尝试连接

使用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尝试连接

使用Sequel Pro进行远程连接

可以发现,需要caching_sha2_password认证方式登陆,目前的客户端工具暂时还不支持caching_sha2_password认证方式登陆。

aching_sha2_password认证报错

解决方案

目前还没看到好的解决方案。

看到不少博文说

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

  2. 兼容新老版本的认证方式

    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远程进行连接。看样子好像是Sequel 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进行部署了

欢迎关注我的公众号

我的公众号

推荐阅读更多精彩内容