以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中很多的配置参数都已经发生了变化,配置的时候,根据提示动态的进行调整。