Docker 安装 Mysql

以下是安装Docker版MySQL 8.0.25并实现目录挂载的步骤:

docker仓库:https://hub.docker.com/_/mysql


1. 拉取Mysql镜像文件

bash 复制代码
docker pull mysql:8.0.25

2. 创建mysql临时容器服务

bash 复制代码
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  mysql:8.0.25

3. 创建宿主机挂载目录

bash 复制代码
mkdir -p /root/docker/mysql/{data,init,conf,logs}
  • /root/docker/mysql/data :映射容器的 /var/lib/mysql(数据库文件)
  • /root/docker/mysql/init :映射容器的 /docker-entrypoint-initdb.d(初始化 SQL/Shell 脚本)
  • /root/docker/mysql/conf :映射容器的 /etc/mysql/conf.d(自定义配置文件)
  • /root/docker/mysql/logs :映射容器的 /var/log/mysql(自定义日志文件)

4. 调整目录权限(避免权限问题)

bash 复制代码
#[root@localhost ~]# docker run --rm mysql:8.0.25 sh -c 'cat /etc/passwd | grep mysql'
#mysql:x:999:999::/home/mysql:/bin/sh
chmod -R 755 /root/docker/mysql/{data,init,conf,logs}
chown -R 999:999 /root/docker/mysql/data  # MySQL容器内默认使用UID/GID 999
chmod -R 777 /root/docker/mysql/logs      # 确保容器可写入日志

5. 将容器中的数据、配置信息复制到宿主机

bash 复制代码
docker cp mysql:/var/lib/mysql/. /root/docker/mysql/data
docker cp mysql:/docker-entrypoint-initdb.d/. /root/docker/mysql/init
docker cp mysql:/etc/mysql/conf.d/. /root/docker/mysql/conf

6. 准备MySQL配置文件

创建或编辑配置文件 `/root/docker/mysql/conf/my.cnf:

ini 复制代码
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init-connect='SET NAMES utf8mb4'
# 错误日志
log_error = /var/log/mysql/error.log
# 可选:启用通用日志和慢查询日志
general_log = 1
general_log_file = /var/log/mysql/mysql.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log

# 其他自定义配置...

7. 准备初始化脚本(由于步骤2已完成初始化导致该测试脚本未生效)

将SQL脚本(如建表语句)放入 /root/docker/mysql/init,例如:

bash 复制代码
echo "CREATE DATABASE IF NOT EXISTS test_nacos;" > /root/docker/mysql/init/test.sql

8. 启动MySQL容器

bash 复制代码
# 删除临时容器
docker rm -f mysql
# 启动新容器
docker run -d \
  --name mysql \
  -p 3306:3306 \
  #--restart unless-stopped
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v /root/docker/mysql/data:/var/lib/mysql \
  -v /root/docker/mysql/init:/docker-entrypoint-initdb.d \
  -v /root/docker/mysql/conf:/etc/mysql/conf.d \
  -v /root/docker/mysql/logs:/var/log/mysql \
  mysql:8.0.25 \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci
参数说明
  • -d:后台运行容器。
  • --name mysql:容器名称。
  • -p 3306:3306:将宿主机的 3306 端口映射到容器的 3306 端口。
  • -e MYSQL_ROOT_PASSWORD:设置 MySQL root 用户的密码(必填)。
  • -v:将容器内的 /var/lib/mysql 目录挂载到宿主机,确保数据持久化。
  • --character-set-server--collation-server:配置字符集和排序规则(可选)。
  • --restart:mysql重启策略。
    • no:不自动重启容器(默认值)。

    • always:容器无论退出状态如何都会自动重启。

    • unless-stopped:容器除非被手动停止,否则会自动重启。

    • on-failure:仅当容器因错误退出时才重启,你还可以设置最大重启次数(例如 on-failure:5)。

      bash 复制代码
      # 由于运行时没有设置mysql的启动策略,这里需要更新重启策略配置
      docker update --restart unless-stopped mysql
      # 查看重启策略
      docker inspect --format '{{.HostConfig.RestartPolicy.Name}}' mysql

9. 验证容器运行状态

bash 复制代码
docker ps -a | grep mysql   # 检查状态是否为Up
docker logs mysql           # 查看启动日志,确认无报错

10. 容器开启、关闭、重启

bash 复制代码
docker start mysql   # 开启
docker stop mysql    # 关闭
docker restart mysql # 重启

11. 检查挂载内容

  • 数据持久化/root/docker/mysql/data 会保存所有数据库文件。

  • 配置生效 :进入容器检查配置:

    bash 复制代码
    docker exec -it mysql bash
    cat /etc/mysql/conf.d/my.cnf
  • 初始化脚本 :首次启动后,/root/docker/mysql/init中的脚本会自动执行。

  • 日志文件 :在 /root/docker/mysql/logs 下查看 error.log 等日志。


常见问题解决

  • 权限拒绝 :确保挂载目录权限正确(尤其 datalogs)。
  • 配置不生效 :检查配置文件路径是否为 /etc/mysql/conf.d
  • 日志未生成 :确认 my.cnf 中的日志路径与挂载路径一致。

通过以上步骤,MySQL 8.0.25容器将实现数据、配置、脚本和日志的完整挂载,确保持久化和可维护性。

相关推荐
生活爱好者!26 分钟前
我把NAS当作下载机,docker一键部署qb
运维·docker·容器
用户713335851562430 分钟前
MySQL - 事务、redo/undo 日志与 MVCC
mysql
MC皮蛋侠客1 小时前
uv 系列(七):CI/CD、Docker 与私有索引——生产级交付
python·ci/cd·docker·uv
用户71333585156242 小时前
MySQL - InnoDB 的 Buffer Pool
mysql
L1624764 小时前
MySQL 全环境生产快速安装 + 完整配置手册(整合国产银河麒麟适配 + 主从补充版)
数据库·mysql
用户233376852184 小时前
Docker 端口"时通时不通"的排查实战
docker
前端世界4 小时前
MySQL 基础入门(学习第4天)——约束与 DML 操作详解
数据库·学习·mysql
做个文艺程序员5 小时前
Linux第22篇:用Docker容器化你的Java SaaS应用:一次构建,随处运行
java·docker·容器
ShiXZ2135 小时前
Redis docker-compose 部署指南
redis·docker·eureka
Vect__6 小时前
MySQL 数据类型和约束:从字段设计到表结构建模
数据库·mysql