作为一名前端开发,我在扩展全栈技能、折腾本地后端项目时,发现数据库环境的搭建往往是阻碍开发效率的第一道坎。直接在 Windows 宿主机上安装各种数据库(Native 安装)不仅会写入大量注册表、留下难以清理的系统后台服务,还极易引发端口冲突和多版本不兼容的问题。
为了让其他项目能够方便地复用环境配置,我总结了这篇完全基于 Docker Desktop 的数据库部署指南。本篇博文专为初涉后端领域的新手准备,涵盖 PostgreSQL、MongoDB、Redis 以及 MySQL 的背景知识、核心原理和应用场景。所有的部署操作均浓缩为"一行命令",并开启了详细的注释模式。
整体架构与运行原理
Docker 的核心原理是"容器化"和"隔离"。在使用下列部署命令时,数据库软件及其所需的所有依赖,都打包运行在一个个独立的轻量级 Linux 虚拟机(容器)中。
为了保证容器被删除后,核心业务数据不会随之灰飞烟灭,我使用了 Docker 的 Volume(数据卷挂载)技术。通过 -v 参数,将 Windows 本地 D 盘的某个真实文件夹,强行映射替换掉 Linux 容器内部的存储目录。这样,数据库在容器内写入的数据,实际上都实时保存在了宿主机的硬盘上。
以下是环境数据流转的 Mermaid 原理图:
路径映射与持久化挂载
Windows 宿主机: D:/mzh/DockerData
Docker Desktop 引擎
PostgreSQL 18 容器
处理强事务关系型数据
MongoDB 容器
处理动态 JSON 文档数据
Redis 容器
处理内存级极速缓存层
MySQL 容器
处理经典业务关系型数据
1. PostgreSQL 18+(最新版部署与避坑)
背景知识与应用场景 :
PostgreSQL 被誉为目前功能最强大的开源关系型数据库。除了严谨的事务处理能力外,它原生支持对 JSON 格式的深度查询,并且借助插件在 AI 向量检索领域表现抢眼。如果是开发逻辑复杂、需要强数据一致性的应用(如 ERP、财务系统),这是绝佳选择。
踩坑与原理剖析(必看) :
在部署 PostgreSQL 18 及以上版本时,官方镜像的底层目录规范发生了破坏性更新(Breaking Change)。为了兼容 pg_ctlcluster 工具以支持大版本无缝升级,18+ 镜像强制要求数据存放于按版本号划分的子目录中。
如果沿用旧版习惯将宿主机目录挂载到 /var/lib/postgresql/data,容器会因为检测到异常挂载点而直接报错宕机(Error: unused mount/volume)。
因此,新版代码必须将挂载点提升一级,改为 /var/lib/postgresql。
保姆级部署代码:
bash
# -d: 让容器在后台静默运行,不阻塞当前命令行窗口。
# --name postgres: 指定容器的名称为 postgres,方便后续使用 docker start/stop 进行管理。
# -e POSTGRES_PASSWORD=123456: 通过环境变量注入方式,设置超级管理员 postgres 的初始密码。
# -p 5432:5432: 网络端口映射,左侧为宿主机端口,右侧为容器内服务真实端口。
# -v D:\mzh\DockerData\postgres:/var/lib/postgresql: 核心避坑点。将本地空文件夹映射到容器内 18+ 规定的根目录,容器启动后会自动在本地生成 18/main 等子目录用于存放数据。
# postgres:18: 明确指定拉取并使用版本号为 18 的官方镜像。
docker run -d --name postgres -e POSTGRES_PASSWORD=123456 -p 5432:5432 -v D:\mzh\DockerData\postgres:/var/lib/postgresql postgres:18
# 带pgvector插件 llm专用
docker run -d --name postgres_pgvector -e POSTGRES_PASSWORD=123456 -p 5432:5432 -v D:\mzh\DockerData\postgres_pgvector:/var/lib/postgresql/data pgvector/pgvector:pg16
2. MongoDB
背景知识与应用场景 :
MongoDB 是一款主流的 NoSQL 文档型数据库。它抛弃了传统的表结构,将数据以类似 JSON 的 BSON 格式存储。这种特性使得它极度灵活,非常适合字段经常变动的项目,例如:用户行为日志采集、爬虫数据清洗、或者是早期快速迭代的 Web 平台原型。
原理剖析 :
MongoDB 官方镜像默认处于无权限验证状态。为了安全起见,需要在创建容器的瞬间,通过注入特定的环境变量来初始化一个全局管理员账号,否则本地开发的数据可能会面临安全风险。
保姆级部署代码:
bash
# --name mongodb: 设定容器名称。
# -e MONGO_INITDB_ROOT_USERNAME=admin: 创建一个名为 admin 的超级管理员账号。
# -e MONGO_INITDB_ROOT_PASSWORD=123456: 设定上述管理员的密码。
# -p 27017:27017: MongoDB 的默认通信端口映射。
# -v D:\mzh\DockerData\mongodb:/data/db: /data/db 是 MongoDB 内部雷打不动的数据文件存放路径,将其挂载出以实现持久化。
docker run -d --name mongodb -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=123456 -p 27017:27017 -v D:\mzh\DockerData\mongodb:/data/db mongo:latest
3. Redis
背景知识与应用场景 :
Redis 是一款基于内存的键值对(Key-Value)存储系统。由于操作全在内存中进行,其读写速度极高。我通常把它当作 MySQL 或 PostgreSQL 前面的"挡箭牌",用来做高频接口的数据缓存、用户登录状态(Token/Session)保存,或者是高并发场景下的秒杀队列。
原理剖析 :
正因为数据在内存中,一旦容器重启或崩溃,数据就会彻底消失。为了让 Redis 也具备类似硬盘数据库的持久化能力,启动时必须强行追加 --appendonly yes 指令。该指令会开启 AOF(Append Only File)机制,将内存里的每一次写操作日志同步追加到硬盘文件中。
保姆级部署代码:
bash
# -p 6379:6379: 映射 Redis 标志性的 6379 端口。
# -v D:\mzh\DockerData\redis:/data: 挂载持久化文件的存放目录。
# redis:latest: 使用最新版 Redis 镜像。
# 后续的命令均为传入容器内部由 Redis 服务引擎执行的参数:
# redis-server: 启动服务端应用。
# --requirepass "123456": 强行设定连接密码,防止未授权访问。
# --appendonly yes: 开启 AOF 数据持久化引擎。
docker run -d --name redis -p 6379:6379 -v D:\mzh\DockerData\redis:/data redis:latest redis-server --requirepass "123456" --appendonly yes
4. MySQL
背景知识与应用场景 :
在 Web 时代最为普及的开源关系型数据库,生态无可匹敌。其内置的 InnoDB 存储引擎完美支持 ACID 事务,对于订单流转、账户余额扣减等对一致性要求苛刻的经典商业逻辑,它是最稳妥的基本盘。
原理剖析 :
与 PostgreSQL 类似,MySQL 在首次通过镜像初始化系统表时,强制要求必须存在一个 root 密码。如果不提供对应环境变量,Docker 容器启动后会立刻判定自身环境不完整,从而导致启动失败并自动退出。
保姆级部署代码:
bash
# -e MYSQL_ROOT_PASSWORD=123456: MySQL 镜像特有的环境变量,用于初始化数据库超级用户的密码。
# -p 3306:3306: 暴露 3306 端口供宿主机客户端连接。
# -v D:\mzh\DockerData\mysql:/var/lib/mysql: /var/lib/mysql 是 Linux 下 MySQL 存放底层数据文件(如 .ibd 文件)的核心目录,必须将其挂载出来。
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -v D:\mzh\DockerData\mysql:/var/lib/mysql mysql:latest
核心复用建议
-
零成本迁移 :未来如果需要重装系统或者更换电脑,只需要将整个
D:\mzh\DockerData文件夹打包备份。到了新环境,重新执行这四条命令,所有数据库环境瞬间恢复原样,且数据不会有任何丢失。 -
文件夹预设:执行上述命令前,确保存放在 D 盘的路径拼写正确。Docker 默认具备创建缺失目录的能力,但提前手动建立好相应的文件夹,可以有效规避某些特定系统版本下的权限挂载失败问题。
如有任何进一步拆解容器网络互通(Docker Network)或使用 docker-compose 进行统一编排的需求,我可以在后续的技术沉淀中继续补充说明。
opensearch
javascriptdocker run -d --name opensearch-local -p 9200:9200 -p 9600:9600 -e "discovery.type=single-node" -e "OPENSEARCH_INITIAL_ADMIN_PASSWORD=Admin@123456" -v D:\mzh\DockerData\openSearch:/usr/share/opensearch/data opensearchproject/opensearch:2.11.0