1. 引言
在本地开发、测试或部署小型项目时,手动安装 Redis、MySQL 等中间件往往比较繁琐:需要处理依赖、配置、环境变量、版本冲突等问题。Docker 通过容器化技术,把应用及其依赖打包成一个个独立、可移植的容器,让我们可以用几条命令快速启动 Redis、MySQL 服务,并结合数据卷把数据持久化到宿主机,避免容器删除后数据丢失。
本文将从 Docker 的基本概念讲起,并演示如何在宿主机上安装 Redis 和 MySQL,同时通过目录挂载实现数据持久化。
2. Docker 简介
2.1 什么是 Docker
Docker 是一个开源的容器化平台,它允许开发者把应用及其依赖环境打包成标准化的镜像,然后在任意安装了 Docker 的机器上运行。相比虚拟机,Docker 容器共享宿主机内核,启动更快、占用资源更少,非常适合微服务部署、持续集成和本地开发环境搭建。
2.2 核心概念
- 镜像(Image):类似一个只读的模板,包含运行应用所需的操作系统、依赖库和程序文件。
- 容器(Container):镜像运行起来的实例,可以被启动、停止、删除。
- 数据卷(Volume):用于把容器内的数据持久化到宿主机,实现数据与容器生命周期的解耦。
- 仓库(Registry):用于存储和分发镜像,如 Docker Hub。
简单来说,镜像类似于程序的安装包,容器是安装后正在运行的程序,数据卷则负责把重要数据保存到宿主机。
3. 环境准备
开始之前,请确认宿主机已经正确安装 Docker,并启动 Docker 服务。可以使用以下命令检查:
docker --version docker info如果能够正常输出版本信息和 Docker 运行状态,说明环境已就绪。本文示例使用 Linux 环境,Windows 或 macOS 上的 Docker Desktop 操作基本相同。
4. 安装 Redis 并实现数据挂载
4.1 拉取 Redis 镜像
docker pull redis:7.2这里指定了 Redis 7.2 版本标签。如果不写版本号,默认会拉取最新版镜像。
4.2 创建宿主机挂载目录
mkdir -p /data/redis/data mkdir -p /data/redis/conf其中/data/redis/data用于存放 Redis 持久化数据,/data/redis/conf用于存放配置文件。这里以/data作为示例根目录,实际使用时可以根据需要修改。
4.3 启动 Redis 容器并挂载目录
docker run -d \ --name myredis \ -p 6379:6379 \ -v /data/redis/data:/data \ -v /data/redis/conf/redis.conf:/etc/redis/redis.conf \ --restart=always \ redis:7.2 redis-server /etc/redis/redis.conf参数说明如下:
-d:后台运行容器。--name myredis:指定容器名称为 myredis。-p 6379:6379:将宿主机 6379 端口映射到容器 6379 端口。-v /data/redis/data:/data:将宿主机目录挂载到容器数据目录。-v /data/redis/conf/redis.conf:/etc/redis/redis.conf:挂载自定义配置文件。--restart=always:设置容器开机自启、异常退出后自动重启。
如果你暂时没有自定义配置文件,也可以简化启动方式,只挂载数据目录并使用默认配置:
docker run -d \ --name myredis \ -p 6379:6379 \ -v /data/redis/data:/data \ --restart=always \ redis:7.2 redis-server --appendonly yes这里的--appendonly yes表示开启 AOF 持久化,让数据写入/data目录,进而同步到宿主机挂载目录中。
4.4 验证 Redis 和数据挂载
docker exec -it myredis redis-cli 127.0.0.1:6379> set name docker OK 127.0.0.1:6379> get name "docker"退出 Redis 客户端后,可以到宿主机/data/redis/data目录查看生成的持久化文件。即使删除容器,数据仍然保留在宿主机上:
ls /data/redis/data5. 安装 MySQL 并实现数据挂载
5.1 拉取 MySQL 镜像
docker pull mysql:8.0这里以 MySQL 8.0 为例,你也可以根据需要选择其他版本。
5.2 创建宿主机挂载目录
mkdir -p /data/mysql/data mkdir -p /data/mysql/conf mkdir -p /data/mysql/logs5.3 启动 MySQL 容器并挂载目录
docker run -d \ --name mymysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=your_password \ -v /data/mysql/data:/var/lib/mysql \ -v /data/mysql/conf:/etc/mysql/conf.d \ -v /data/mysql/logs:/var/log/mysql \ --restart=always \ mysql:8.0参数说明如下:
-e MYSQL_ROOT_PASSWORD=your_password:设置 root 用户密码,请替换为你的实际密码。-v /data/mysql/data:/var/lib/mysql:挂载 MySQL 数据目录。-v /data/mysql/conf:/etc/mysql/conf.d:挂载自定义配置目录。-v /data/mysql/logs:/var/log/mysql:挂载日志目录。
如果需要设置字符集,可以在宿主机/data/mysql/conf目录下创建my.cnf文件:
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci [client] default-character-set=utf8mb4保存后重启容器即可生效:
docker restart mymysql5.4 验证 MySQL 和数据挂载
docker exec -it mymysql mysql -uroot -p输入密码后进入 MySQL 命令行。可以执行以下语句创建测试数据库和表,验证数据是否正常写入:
CREATE DATABASE IF NOT EXISTS docker_test DEFAULT CHARACTER SET utf8mb4; USE docker_test; CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) ); INSERT INTO users (name) VALUES ('docker'); SELECT * FROM users;退出 MySQL 后,检查宿主机/data/mysql/data目录,可以看到 MySQL 生成的数据库文件,说明数据已经持久化到宿主机。
6. 数据挂载方式总结
Docker 中常用的数据持久化方式主要有两种:
- 绑定挂载(bind mount):直接指定宿主机目录和容器目录的映射关系,例如本文示例使用的
-v /data/redis/data:/data。这种方式路径透明,便于管理和备份。 - 命名卷(named volume):由 Docker 管理卷,例如
docker volume create redis_data,再通过-v redis_data:/data挂载。这种方式更便于跨主机迁移和插件扩展。
对于本地开发和单机部署,绑定挂载通常更直观;对于生产环境,命名卷在可移植性和安全性上更有优势。
7. 常见问题
7.1 容器内数据没有写入宿主机目录
首先确认挂载路径是否正确,特别是 MySQL 的数据目录必须是/var/lib/mysql,Redis 默认数据目录是/data。其次检查宿主机目录的权限,可以使用chmod 777 /data/mysql/data临时放开权限进行排查。
7.2 端口被占用
如果宿主机 6379 或 3306 端口已被占用,可以修改宿主机映射端口,例如-p 6380:6379,访问时使用 6380 端口即可。
7.3 如何备份数据
对于目录挂载方式,直接备份宿主机对应目录即可。停止容器后打包/data/redis/data或/data/mysql/data,恢复时把文件放回原目录再启动容器。
7.4 如何查看容器日志
docker logs -f myredis docker logs -f mymysql8. 总结
通过 Docker 安装 Redis 和 MySQL,并配合宿主机目录挂载,可以快速搭建可反复创建、删除而不丢失数据的开发环境。核心思路可以概括为三步:拉取镜像、准备宿主机目录、使用-v参数启动容器。掌握这一套流程后,同样可以迁移到 MongoDB、PostgreSQL、Elasticsearch 等其他镜像的部署中。
建议在今后的生产环境中,进一步结合 Docker Compose 管理多个容器、使用命名卷管理数据,并妥善设置访问密码、网络策略和定期备份,从而获得更稳定、更安全的服务运行体验。