Docker安装mysql8.0

发布于 2024-08-17  12 次阅读


1.环境准备

docker安装参考:Centos安装docker

2.容器搭建

拉取镜像

docker pull mysql:8.0

创建复制配置文件的容器

docker run -d --name mysql8.0 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

复制文件

宿主机创建以下目录

mkdir -p /home/docker/mysql8.0/conf \
/home/docker/mysql8.0/data \
/home/docker/mysql8.0/logs \
/home/docker/mysql8.0/bak

执行docker cp命令

docker cp mysql8.0:/etc/my.cnf /home/docker/mysql8.0/conf/my.cnf && \
docker cp mysql8.0:/etc/mysql/conf.d /home/docker/mysql8.0/conf/ && \
docker cp mysql8.0:/var/lib/mysql/. /home/docker/mysql8.0/data/

删除复制文件的容器

docker stop mysql8.0 && \
docker rm mysql8.0

创建容器

docker run --restart=always -d --name mysql8.0 -p 3306:3306 \
-v /home/docker/mysql8.0/conf/my.cnf:/etc/my.cnf \
-v /home/docker/mysql8.0/conf/conf.d:/etc/mysql/conf.d \
-v /home/docker/mysql8.0/logs:/logs \
-v /home/docker/mysql8.0/data:/var/lib/mysql \
-v /home/docker/mysql8.0/bak:/mysqlbak \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0

参数解释
-v 挂载目录
-v /home/docker/mysql8.0/bak:/mysqlbak 备份数据的目录
设置mysql密码
-e MYSQL_ROOT_PASSWORD=123456

查看是否运行

docker ps # 查看运行容器
docker logs mysql8.0 # 查看运行日志

其它

mysql的定时数据备份与数据恢复

备份

mysql备份命令mysqldump,运行命令

# 使用这条命令会备份数据到容器内/mysqlbak/2024-8-18_ce_blog.sql文件里
docker exec -it mysql8.0 bash -c "mkdir -p /mysqlbak" && docker exec -it mysql8.0 bash -c \
> "mysqldump -uroot -p123456 --databases ce_blog > /mysqlbak/2024-8-18_ce_blog.sql"


# 使用这条命令会将容器内ce_blog数据库备份到宿主机的/home/docker/mysql8.0/bak/2024-8-18_ce_blog.sql文件里
docker exec -it mysql8.0 bash -c "mysqldump -uroot -p123456 --databases ce_blog" > /home/docker/mysql8.0/bak/2024-8-18_ce_blog.sql

定时运行执行以下命令

# 编辑定时任务
crontab -e

# 将命令写入进去
# 1.只设置定时备份 
# */1 * * * * 每分钟执行一次  0 3 * * *每天凌晨3点执行
0 3 * * * docker exec mysql8.0 bash -c "mkdir -p /mysqlbak && mysqldump -uroot -p123456 --databases ce_blog > /mysqlbak/\$(date +\%Y-\%m-\%d-\%H-\%M-\%S).sql"

# 2.设置定时备份并设置备份时错误日志的输出目录宿主机目录/home/docker/mysql8.0/logs/mysql_backup_error.log
# */1 * * * * 每分钟执行一次  0 3 * * *每天凌晨3点执行
# 可能宿主机和docker时间不同 导致文件名时间显示看不懂 加上TZ='Asia/Shanghai'
0 3 * * * /usr/bin/docker exec mysql8.0 bash -c "mkdir -p /mysqlbak && mysqldump -uroot -p123456 --databases ce_blog > /mysqlbak/$(TZ='Asia/Shanghai' date +'\%Y-\%m-\%d-\%H-\%M-\%S').sql" 2>> /home/docker/mysql8.0/logs/mysql_backup_error.log

# 验证定时任务
crontab -l

恢复

mysql恢复命令mysql,运行命令

# 运行这条命令会将宿主机的/home/docker/mysql8.0/bak/ce_blog.sql这个文件数据恢复
docker exec -i mysql8.0 mysql -uroot -p123456 ce_blog < /home/docker/mysql8.0/bak/ce_blog.sql

# 可能会报错 ERROR 1067 (42000) at line 44: Invalid default value for 'comment_date'
# 这个错误是sql模式使用了严格模式,执行下面语句即可
docker exec -i mysql8.0 mysql -uroot -p123456 -e "SET GLOBAL sql_mode='';" && \
docker exec -i mysql8.0 mysql -uroot -p123456 ce_blog < /home/docker/mysql8.0/bak/ce_blog.sql && \
docker exec -i mysql8.0 mysql -uroot -p123456 -e "SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';"


欢迎来到我的世界!