以docker的方式部署mysql数据库的方法


1、概述

本文档介绍如何通过docker的方式来运行mysql数据库,进而以最简单的、最快速的方式来部署mysql

2、部署过程

接下来,我们来介绍通过docker部署mysql的过程。

2.1、创建目录(配置、数据)

在部署之前,通过以下的命令创建配置目录、数据库,用于将容器内数据持久化到本地,和增加自定义的配置。

MYSQL_BASEDIR=/data/apps/mysql

mkdir -p ${MYSQL_BASEDIR}/data
mkdir -p ${MYSQL_BASEDIR}/conf

2.2、启动mysql服务

#声明mysql相关的环境变量
MYSQL_VERSION="8.0.28"
MYSQL_CONTAINER_NAME=mysql-${MYSQL_VERSION}
MYSQL_HOST_PORT="3306"

MYSQL_BASEDIR=/data/apps/mysql
MYSQL_DATADIR=${MYSQL_BASEDIR}/data
MYSQL_CONFDIR=${MYSQL_BASEDIR}/conf

MYSQL_ROOT_PASSWORD="xxxxxxx"
MYSQL_IMAGE_TAG="172.20.58.152/database/mysql:8.0.28"

# 运行mysql服务

docker run -d \
  --name ${MYSQL_CONTAINER_NAME} \
  -p ${MYSQL_HOST_PORT}:3306 \
  --restart always \
  -v ${MYSQL_DATADIR}:/var/lib/mysql \
  -v ${MYSQL_CONFDIR}:/etc/mysql/conf.d \
  -e MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} \
  ${MYSQL_IMAGE_TAG}

说明:上面使用的镜像172.20.58.152/database/mysql:8.0.28已经提前下载到本地的harbor中了,如果是内网可以直接使用,否则,需要先下载同版本的mysql镜像才能运行。

2.3、查看服务的状态

  • 查看容器状态
docker ps -l

  • 查看端口启动情况

[root@nctest-snap-test-02 mysql]# netstat -ntlp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      12104/docker-proxy  
[root@nctest-snap-test-02 mysql]# 

确保端口已经正常的启动。

2.4、通过客户端工具进行连接测试

docker exec -it mysql-8.0.28 bash -c "mysql -u root -p"

输入环境变量中声明的root用户的密码,来登录到数据库

已经可以看到其中的具体的库的信息。

OK,通过以上的步骤,就完成了数据库的基本部署,那么,如果要自定义配置,该怎么做呢?

继续往下看··· ···

3、增加自定义的配置

在开始,我们声明了配置文件目录conf,我们自定义的配置文件就要以.cnf 【后缀必须是这个】方式放在这个目录中。

以下为具体的示例:

  • 创建配置文件
cd ${MYSQL_BASEDIR}/conf

cat > mysqld.cnf <<"eof"
[mysqld]
default-time-zone=+08:00
transaction-isolation=READ-COMMITTED
server-id=1
log-bin
expire_logs_days=7
log_bin_trust_function_creators=1
max_connect_errors=99999
max_error_count=65535
character-set-server=utf8mb4
lower_case_table_names=1
max_connections=10000
max_user_connections=10000
wait_timeout=31536000
interactive_timeout=31536000
innodb_buffer_pool_size=8192M
max_allowed_packet=100M
eof

  • 重启mysql容器

docker restart mysql-8.0.28

如果无法重启,且报错如下:

2022-04-02T06:10:08.742692Z 1 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0').
2022-04-02T06:10:08.742971Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2022-04-02T06:10:08.743214Z 0 [ERROR] [MY-010119] [Server] Aborting

由于字典已经初始化过了,不可以修改,建议重新初始化!

也就是说,先将配置文件配置好,在进行2.2步骤的启动mysql服务。

如果已经运行,可以通过以下的步骤,关闭、删除容器、删除数据库目录,重新启动mysql

  • 关闭、删除数据库
docker stop mysql-8.0.28
docker rm mysql-8.0.28


MYSQL_BASEDIR=/data/apps/mysql
MYSQL_DATADIR=${MYSQL_BASEDIR}/data
rm -rf ${MYSQL_DATADIR}/*

  • 重新初始化数据

#声明mysql相关的环境变量
MYSQL_VERSION="8.0.28"
MYSQL_CONTAINER_NAME=mysql-${MYSQL_VERSION}
MYSQL_HOST_PORT="3306"

MYSQL_BASEDIR=/data/apps/mysql
MYSQL_DATADIR=${MYSQL_BASEDIR}/data
MYSQL_CONFDIR=${MYSQL_BASEDIR}/conf

MYSQL_ROOT_PASSWORD="xxxxx"
MYSQL_IMAGE_TAG="172.20.58.152/database/mysql:8.0.28"

# 运行mysql服务

docker run -d \
  --name ${MYSQL_CONTAINER_NAME} \
  -p ${MYSQL_HOST_PORT}:3306 \
  --restart always \
  -v ${MYSQL_DATADIR}:/var/lib/mysql \
  -v ${MYSQL_CONFDIR}:/etc/mysql/conf.d \
  -e MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} \
  ${MYSQL_IMAGE_TAG}

注意:在mysql 8中很多的配置参数都已经发生了变化,配置的时候,根据提示动态的进行调整。

相关