Docker 安装 MySQL

记录下 Docker 安装 MySQL

  • 本文环境
    • 云服务器:阿里云(不同厂商云服务器上的操作基本相同)
    • 系统:Ubuntu 22.04
    • 终端:腾讯云 OrcaTerm(腾讯云的 WebShell(个人感觉使用体验不错,因为 ui 好看),不同厂商的云服务器都可以使用,可以代替 Xshell+Xftp 使用)

前言

  • 首先需要安装好 Docker,可以参考Ubuntu 安装 Docker
    • 使用 Docker 需要 root 权限,推荐将用户加入 Docker 用户组(上文中有),这样使用就不需要加上sudo了(但是我是 root,所以文中都没加
  • Docker Hub 中的 MySQL 官方镜像文档 mysql - Official Image | Docker Hub

1.寻找镜像

在 Docker 仓库中查找 MySQL 镜像

docker search mysql


可以看到第一个就是我们需要的镜像

2.拉取镜像

在查找到 MySQL 的镜像后,就可以进行拉取

docker pull mysql


因为没有指定 MySQL 的版本,所以默认拉取最新的版本(即 latest)
如果想要拉取指定的版本,可以在拉取时添加版本号(mysql:tag),以 MySQL 5.7 版本为例

docker pull mysql:5.7

3.查看镜像

拉取完毕后,检查镜像是否安装完成

# 查看所有镜像
docker images


可以看到已经有 MySQL 的镜像了(hello-world 是我在安装完 Docker 测试时拉取的镜像)

4.创建容器并启动

# 容器名称、端口、挂载目录、root 密码均可自行指定
docker run \
--name mysql \
-p 3306:3306 \
-v /data/mysql/conf:/etc/mysql/conf.d \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d \
mysql

参数说明:

  • --name mysql:指定容器的名称为 mysql(可以自己指定)
  • -p 3306:3306:将容器的 3306(右边的)端口挂载到宿主机的 3306(左边的)端口(前提是不被占用)
  • -v:将相关目录挂载到宿主机防止数据丢失,如果不挂载的话在删除容器后会丢失存储的数据,即挂载后即使容器删除,只要宿主机目录中的数据还存在,使用该目录新创建的容器中依旧有原先容器中挂载的数据
    • 注:
      • 实际宿主机中用于挂载的目录根据自己需求设置,如果只是开发测试环境可以选择不挂载(用完就删不留痕迹,正合我意),但是配置目录还是推荐挂载,方便修改配置
      • 挂载目录通常选择放在用户的主目录下的一个子目录中,好处是每个用户都有自己的挂载目录,可以隔离不同用户的数据,但是因为我的云服务器只有我一个人在玩,平常都是直接用的 root 用户,所以直接在根目录下创建了一个/data目录用来存放 Docker 容器的挂载配置和数据,MySQL 容器的就都挂载在/data/mysql目录下了
    • /data/mysql/conf:/etc/mysql/conf.d:将容器中/etc/mysql/conf.d配置目录挂载到宿主机的/data/mysql/conf目录
      • 想要修改 MySQL 配置可以直接在宿主机的配置目录下添加一份自定义的my.cnf配置文件,该文件中的配置优先级高于 MySQL 的默认配置(容器中 MySQL 的配置文件路径位于/etc/my.cnf)
      • 也可以提前编辑好my.cnf文件,创建的容器会按你挂载目录中的自定义配置启动
    • /data/mysql/data:/var/lib/mysql:将容器中/var/lib/mysql数据目录挂载到宿主机的/data/mysql/data目录
    • /data/mysql/log:/var/log/mysql:将容器中/var/log/mysql日志目录挂载到宿主机的/data/mysql/log目录
  • -e MYSQL_ROOT_PASSWORD=123456:初始化 MySQL root 用户的密码为 123456
  • -d:以后台的方式运行
  • mysql:tag:指定创建容器的镜像(:tag指定版本,不加默认最新版)
    • 建议创建容器时使用:tag指定版本,可以使用docker images查看镜像的版本,以免过段时间版本更新后导致现在拉取的镜像已经不是最新版本,又重新拉取一个最新版本的镜像进行容器创建


返回的一长串是创建的容器 id

5.查看容器

检查容器是否创建成功

# 查看运行中的容器
docker ps


可以看到创建的 MySQL 容器已经在运行中了
我们可以通过 Docker 命令进入 MySQL 容器内部

# 这里的 mysql 是创建容器时自行指定的容器名称
docker exec -it mysql /bin/bash

# 也可以使用容器 id(即上图中的 CONTANINER ID)
docker exec -it 01c4a501d5c4 /bin/bash


进入后就可以和在 linux 中一样使用 MySQL 了
查看 MySQL 版本号

mysql --version


注:写本文时的最新版本为 8.2.0
输入mysql -u root -p后再输入密码即可进入 MySQL 命令行

后续使用和正常 MySQL 一样,想要退出 MySQL 和容器使用exit命令即可

6.删除容器

不能直接删除运行中的容器,因此需要先停止容器再删除

# 这里的 mysql 是创建容器时自行指定的容器名称
# 停止容器
docker stop mysql
# 删除容器
docker rm mysql

但是可以加上-f参数来强制删除运行中的容器

# 这里的 mysql 是创建容器时自行指定的容器名称
docker rm -f mysql

其他

时区问题

问题描述

进入 MySQL 命令行后使用下面命令查看当前时间

select now();


会发现 MySQL 中时间比系统时间少了8个小时,因为 MySQL 的时区并不是我们所在的东八区(即北京时间)

解决方法

一:命令行中修改

MySQL 中的系统时区,分为全局时区和当前会话的时区,如果当前会话不指定时区,默认使用全局时区,可以使用下面的命令将全局时区修改为东八区(即北京时间)

set global time_zone = '+8.00';

# 修改当前会话的时区(相当于临时修改)
# set time_zone = '+8.00';

如果想要立即生效需要执行

flush privileges;

再次select now();查看时间会发现已经是东八区的时间了

二:修改 my.cnf 配置文件

容器中修改

可以编辑容器中 MySQL 的my.cnf(位于/etc/my.cnf)配置文件
然后在 [mysqld] 区域加上default-time_zone = '+8:00'

[mysqld]
......
default-time_zone = '+8:00'
......
[client]
......

然后重启 MySQL
注:MySQL 容器中没有 vim,如果想要编辑需要先安装 vim(所以我没有演示

通过挂载的配置文件修改

如果在创建容器时将容器中的配置目录挂载到了宿主机,那就可以直接编辑宿主机中的配置文件进行修改了
首先在配置目录挂载的宿主机目录下新建一个my.cnf文件,然后使用 vim 编辑

# 进入你自己挂载的宿主机配置目录
cd /data/mysql/conf
# 新建一个 my.cnf 文件
touch my.cnf
# 使用 vim 编辑
vim my.cnf

添加下面配置内容(不会还有人不会 vim 吧

[mysqld]
default-time-zone = '+08:00'

保存退出后重启容器即可

# 这里的 mysql 是创建容器时自行指定的容器名称
# 重启重启
docker restart mysql

之后再次进入容器中的 MySQL,通过select now();查看时间会发现已经是东八区的时间了

注:想要修改其他配置也可以按照相同的方法在宿主机编辑配置文件,并且只要创建容器时挂载宿主机的配置目录不变,即使删除当前容器重开一个,修改的配置也依旧在