---
URL: "/zh-CN/blog/2025-12/Docker-MySQL.html"
LLMS_URL: "/zh-CN/blog/2025-12/Docker-MySQL.md"
lastUpdated: true
commentabled: true
recommended: true
title: "Docker部署MySQL 8.0"
description: "Docker部署MySQL 8.0"
date:

pageClass: "blog-page-class"
cover: "/covers/docker.svg"
---

---
lastUpdated: true
commentabled: true
recommended: true
title: Docker部署MySQL 8.0
description: Docker部署MySQL 8.0
date: 2025-12-30 11:12:00 
pageClass: blog-page-class
cover: /covers/docker.svg
---

## 为什么选择Docker部署MySQL？ ##

在开始之前，我们先聊聊为什么Docker是部署数据库的“神器”。

- 环境隔离：每个容器都是独立的沙箱。你可以在同一台机器上运行多个不同版本的MySQL（如 `5.7` 和 `8.0`），而它们之间互不干扰，彻底告别版本冲突。
- 秒级部署：告别繁琐的安装配置过程。`docker run` 一条命令，一个全新的MySQL实例就启动了，无论是开发、测试还是生产环境，都能快速复制。
- 可移植性：Docker镜像包含了应用及其所有依赖。这意味着你在Mac上创建的MySQL环境，可以原封不动地在Linux或Windows服务器上运行，保证了环境的一致性。
- 简化管理：容器的启动、停止、重启、删除都非常简单。数据、配置和日志通过“卷”与宿主机分离，备份和迁移变得前所未有的轻松。

## 前置准备 ##

在开始之前，请确保你的系统中已经安装了Docker。如果还没有，可以访问Docker官网下载并安装。

## 核心步骤：一条命令启动MySQL ##

万事俱备，只欠东风。下面就是我们的主角——这条强大的docker run命令。打开你的终端，复制并执行它：

```bash
docker run -d \
--name mysql8 \
--privileged=true \
--restart=always \
-p 3306:3306 \
-v /Users/User/Documents/docker/mysql8/data:/var/lib/mysql \
-v /Users/User/Documents/docker/mysql8/config:/etc/mysql/conf.d \
-v /Users/User/Documents/docker/mysql8/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai \
mysql:8.0
```

> ⚠️ 注意：请将命令中的 `/Users/User/Documents/docker/mysql8/` 替换为你自己电脑上希望存放MySQL数据的目录路径。

执行完毕后，一个功能完备的MySQL 8.0容器就已经在后台静默运行了！

## 命令深度解析：知其然，更要知其所以然 ##

作为技术博主，我不能只给你一条“魔法咒语”。让我们来逐行拆解这条命令，理解每个参数的真正含义。

| **参数**        |      **解释**      |
| :------------- | :-----------: |
| `docker run`      | Docker的启动容器命令。  |
| `-d`      | `--detach` 的缩写，表示在“后台”运行容器，不会占用你的当前终端。  |
| `--name mysql8`      | 给容器起一个独一无二的名字，方便后续管理（如 `docker stop mysql8`）。  |
| `--privileged=true`      | 赋予容器扩展权限。这能解决一些文件系统权限问题，尤其是在macOS和Windows上挂载目录时，避免出现“Permission denied”错误。  |
| `--restart=always`      | 设置容器的重启策略为“总是”。这意味着无论Docker守护进程重启还是容器意外退出，MySQL都会自动重新启动，保证了服务的高可用性。  |
| `-p 3306:3306`      | 端口映射。格式为`宿主机端口:容器端口`。它将你电脑的3306端口映射到容器内的3306端口，这样你就可以通过`127.0.0.1:3306`访问到容器里的MySQL了。  |
| `-v /path/to/data:/var/lib/mysql`      | *数据卷挂载（最关键！）* 。它将你宿主机的 `/path/to/data` 目录挂载到容器内MySQL存储数据的目录 `/var/lib/mysql`。这样做的好处是，即使容器被删除，你的数据库文件依然安全地保存在宿主机上，实现了数据持久化。  |
| `-v /path/to/config:/etc/mysql/conf.d`      | *配置文件挂载*。将你宿主机的配置目录挂载到容器的配置目录。你可以在这里放置自定义的 `my.cnf` 文件来覆盖MySQL的默认配置，非常灵活。  |
| `-v /path/to/logs:/var/log/mysql`      | 日志文件挂载。将MySQL的日志文件映射到宿主机，方便你随时查看和排查问题。  |
| `-e MYSQL_ROOT_PASSWORD=123456`      | 环境变量。`-e` 用于设置环境变量。这里我们设置了MySQL的root用户密码为123456。*在生产环境中，请务必使用更复杂的密码！*  |
| `-e TZ=Asia/Shanghai`      | 设置容器的时区为“亚洲/上海”，确保数据库中的时间戳与本地时间一致。  |
| `mysql:8.0`      | 指定我们使用的Docker镜像。这里我们明确指定了mysql镜像的8.0版本标签。  |

## 验证与连接 ##

部署完成，如何确认它是否正常工作呢？

### 查看容器状态 ###

```bash
docker ps
```

你应该能看到名为 `mysql8` 的容器正在运行。

### 查看启动日志 ###

如果遇到问题，日志是最好的朋友

```bash
docker logs mysql8
```

### 连接数据库 ###

现在你可以使用任何数据库客户端工具（如Navicat, DataGrip, Sequel Pro）或命令行来连接你的MySQL了。

- 主机: `127.0.0.1` 或 `localhost`
- 端口: `3306`
- 用户名: `root`
- 密码: `123456`

## 进阶玩法：自定义配置 ##

还记得我们挂载的 `config` 目录吗？现在让我们来发挥它的威力。通过自定义配置文件，我们可以让 MySQL 更贴合我们的开发需求。

### 一份推荐的 `my.cnf` 配置 ###

这里我为你准备了一份兼顾兼容性与最佳实践的 `my.cnf` 配置模板。在你的 `config` 目录（例如 `/Users/User/Documents/docker/mysql8/config`）下，新建一个文件，名为 `my.cnf`，然后将以下内容粘贴进去：

```ini
[mysqld]
# 基础设置
user=mysql
default_authentication_plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

# 时区
default-time-zone = '+08:00'

# 网络
port=3306
bind-address=0.0.0.0
```

### 配置详解 ###

这份配置虽然简洁，但每一项都至关重要。让我们来逐一分析：

| **配置块**        |      **配置项**      |     **解释**      |
| :------------- | :-----------: | :-----------: |
| `[mysqld]`     |   | 这是MySQL服务器进程的核心配置节，所有针对服务器的设置都应放在这里。  |
| 基础设置     | `user=mysql`  | 指定MySQL服务以`mysql`用户身份运行，这是一个安全最佳实践，避免了使用root用户运行服务。  |
|      | `default_authentication_plugin=mysql_native_password`  | *【关键】*  MySQL 8.0默认使用 `caching_sha2_password` 认证插件，安全性更高，但很多旧版客户端工具（如一些Navicat版本、PHP等）不支持。设置此项可兼容旧版客户端，避免连接失败。  |
|      | `character-set-server=utf8mb4`  | 设置服务器默认字符集为 `utf8mb4`。它能支持包括Emoji在内的所有Unicode字符，是现代应用的首选。  |
|      | `collation-server=utf8mb4_unicode_ci`  | 设置默认排序规则。`_ci` 表示不区分大小写，是通用场景下的推荐设置。  |
| 时区     | `default-time-zone = '+08:00'`  | 明确设置MySQL服务器的时区为东八区。这可以确保数据库时间戳与本地时间保持一致，避免因容器默认UTC时区导致的时间错乱问题。  |
| 网络     | `port=3306`  | 指定MySQL服务监听的端口。虽然在Docker命令中已映射，但在配置文件中明确指定也是一个好习惯。  |
|      | `bind-address=0.0.0.0`  | *【关键】*  允许MySQL服务监听容器内的所有IP地址。这是实现从宿主机（或其他容器）访问数据库的关键。如果设置为`127.0.0.1`，则只能从容器内部访问。  |

### 让配置生效 ###

保存好 `my.cnf` 文件后，需要重启MySQL容器才能让新的配置生效：

```bash
docker restart mysql8
```

现在，你的MySQL实例就按照你的“私人订制”来运行了！

## 数据备份与恢复 ##

数据是宝贵的。使用 Docker，备份也变得异常简单。

**备份数据库**：

```bash
docker exec mysql8 mysqldump -uroot -p123456 --all-databases > /Users/User/Documents/docker/mysql8/backup/all_$(date +%F).sql
```

这条命令通过 `docker exec` 在容器内执行 `mysqldump`，并将备份文件直接输出到宿主机的指定目录。

**恢复数据库**：

```bash
docker exec -i mysql8 mysql -uroot -p123456 < /Users/User/Documents/docker/mysql8/backup/all_2023-10-21.sql
```

## 总结 ##

通过今天的分享，我们见证了 Docker 在部署和管理 MySQL 方面的巨大优势。从一条简单的命令出发，我们深入理解了每个参数的作用，并探索了数据持久化、自定义配置和数据备份等高级用法。

使用 Docker，我们不仅得到了一个数据库实例，更获得了一种现代化、标准化的工作流。它将我们从繁琐的环境配置中解放出来，让我们能更专注于业务逻辑和代码本身。

Docker，让开发回归纯粹。  你还在等什么？赶紧打开终端，体验一下吧！
