Docker 安装 MySQL

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/

截止目前, 星球 内专栏累计输出 66w+ 字,讲解图 2896+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2300+ 小伙伴加入学习 ,欢迎点击围观

本小节中,我们将学习如何通过 Docker , 快速在阿里云 Linux 云服务器中,将 MySQL 环境安装好。

1. 下载 MySQL 镜像

首先,远程登录云服务器,执行如下命令,拉取 MySQL 5.7 版本的镜像:

docker pull mysql:5.7

Docker 拉取 MySQL 环境Docker 拉取 MySQL 环境

镜像下载完成后,通过 docker images 查看本机已经下载的镜像列表,检查一下 MySQL 5.7 的镜像是否下载成功:

Docker 查看本地已下载的镜像Docker 查看本地已下载的镜像

2. 启动 MySQL 容器

镜像下载成功后,我们先以最简单的方式启动容器,执行命令如下:

docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7

参数说明:

  • -d:以后台的方式运行;
  • --name mysql:指定容器的名称为 mysql;
  • -p 3306:3306 将宿主机的 3306 端口挂载到容器中的 3306 端口上;
  • -e MYSQL_ROOT_PASSWORD=123456:指定 root 用户的密码为 123456;

命令执行后,可以通过 docker ps命令来查看正在运行的 Docker 容器,确认下 MySQL 容器是否运行成功:

Docker 启动 MySQL 容器Docker 启动 MySQL 容器

3. 复制 MySQL 容器中配置文件到宿主机

接下来,执行下面的命令,创建一个 /docker/mysql 文件夹,专门用于存放 MySQL 相关文件,如配置文件、存储的数据等:

mkdir -p /docker/mysql

然后,执行 docker cp 命令,将运行中的 mysql 容器中的配置文件目录,复制到宿主机中的 /docker/mysql/config 目录中:

# 将容器中的 mysql 配置文件复制到宿主机中指定路径下
docker cp mysql:/etc/mysql /docker/mysql/config

Docker 复制容器中的配置文件到宿主机Docker 复制容器中的配置文件到宿主机

复制成功后,通过 ll 命令确认下 /docker/mysql/config 目录中的文件,可以看到,MySQL 相关的配置文件都从容器中复制到宿主机中了,这样方便后续如果有自定义配置的需求:

查看 MySQL 配置文件目录文件查看 MySQL 配置文件目录文件

4. 重新运行容器,挂载存储数据

注意了,使用上面这种方式启动的容器,因为未将容器中数据目录挂载到宿主机中,会导致容器重启后,存于容器中的数据会全部丢失,所以,我们需要将正在运行的 MySQL 容器删除掉,重新运行一个 MySQL 容器,并将数据存储目录挂载到宿主机上,另外还有配置文件也需要一并挂载出来:

  1. MySQL 配置文件;

  2. 数据存储目录;

执行如下命令,将刚刚运行的 MySQL 容器删除掉:

docker rm -f mysql

PS: mysql 是我们运行容器时指定的名称,当然,你也可以通过容器 ID 来删除容器。

容器删除成功后,重新运行 MySQL 容器 , 命令如下:

docker run -d \
--name mysql \
-p 3306:3306 \
-v /docker/mysql/config:/etc/mysql \
-v /docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7

和之前运行的方式不太一样的地方是,这次额外添加了两个目录挂载参数:

  • -v /docker/mysql/config:/etc/mysql: 将宿主机中 /docker/mysql/config 配置文件目录挂载到容器中的 /etc/mysql 目录上 ;
  • -v /docker/mysql/data:/var/lib/mysql: 将宿主机中的 /docker/mysql/data 数据存储目录挂载到 /var/lib/mysql 目录上 ;

命令执行后,通过 docker ps 命令,确认一下容器是否启动成功:

重新运行 MySQL 容器重新运行 MySQL 容器

5. 阿里云安全组开放

到这里,MySQL 数据库环境就安装完成了。接下来,我们将通过 Navicat 连接一下这个远程的数据库,看看能不能连接成功。当然直接连肯定是不行的,我们需要在阿里云后台中,给购买的服务器开放 3306 端口才行。为了保证安全性,我们只给自己的 IP 开放白名单,保证只有自己的机器才能链接。

这就需要拿到自己的 IP 地址,可以在百度中查询关键词 ip , 即可获取自己的 IP 地址:

如果百度查询不到,也可以访问这个网站:https://www.ip138.com/ , 也是能够查询到你的 IP 地址的:

将自己的 IP 地址复制出来,然后,访问阿里云 ECS 控制台:https://ecs.console.aliyun.com/home#/ 点击云服务器

然后,选择安全组,点击管理规则

入方向列表中,添加自己的 IP 地址,开放的端口为 3306 并保存。这样,就能保证只有自己的机器才能访问到该数据库了。

6. 客户端连接测试

端口白名单添加完成后,打开 Navicat 客户端 , 连接刚刚创建的 MySQL 数据库 , 看看能否连接成功:

客户端连接 MySQL客户端连接 MySQL

填写连接名、云服务器的公网 IP 、以及登录用户名、密码,点击测试连接按钮,如下图所示,连接成功了啦:

7. 相关问题补充

7.1 时区少 8 小时的问题

在向数据库插入数据时,总是发现时间比系统时间少 8 个小时,这是因为 MySQL 的时区并不是我们想要的东八区。

解决方案:修改挂载到宿主机的 MySQL 配置文件 mysqld.cnf ,添加如下参数:

default-time-zone = '+08:00'

添加改配置后,重启 MySQL 容器, 再插入数据,这个时候,插入的数据时间就正常了:

docker restart mysql