Ubuntu 22.04下Docker一键部署四大数据库实战
1. 项目背景与核心价值
在Linux环境下部署数据库服务是开发者和运维工程师的日常刚需。传统方式需要逐个安装配置MySQL、PostgreSQL、Redis和MongoDB等主流数据库,不仅耗时耗力,还存在版本冲突、依赖缺失等典型问题。这个脚本的价值在于:
- 基于Ubuntu 22.04 LTS(当前最稳定的长期支持版本)
- 采用Docker容器化方案(避免污染主机环境)
- 实现四大主流数据库的一键部署(MySQL+PostgreSQL+Redis+MongoDB)
- 支持数据目录挂载到本地(保障数据持久化)
实测在4核8G的标准云服务器上,完整部署时间从传统方式的2小时缩短到15分钟以内,且各数据库实例完全隔离互不干扰。
2. 技术方案设计解析
2.1 基础环境选择
选择Ubuntu 22.04作为基础系统主要考虑:
- 官方支持到2027年,长期维护有保障
- 对Docker的兼容性经过充分验证
- 默认搭载的glibc 2.35版本满足所有数据库要求
注意:虽然脚本理论上支持其他Linux发行版,但仅在Ubuntu 22.04上经过完整测试
2.2 Docker引擎部署
脚本中Docker安装采用官方推荐方案:
# 卸载旧版本(如有) sudo apt-get remove docker docker-engine docker.io containerd runc # 设置仓库 sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release # 添加Docker官方GPG密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 设置稳定版仓库 echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装Docker引擎 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin关键点说明:
- 使用官方源而非系统默认源,确保获取最新稳定版
- 包含docker-compose-plugin替代旧的docker-compose
- 自动处理了apt-key过时问题(Ubuntu 22.04新特性)
2.3 数据库容器配置
四大数据库均采用Docker官方镜像,具体版本选择策略:
| 数据库 | 镜像版本 | 选择理由 |
|---|---|---|
| MySQL | 8.0 | 兼顾新特性和稳定性 |
| PostgreSQL | 15-alpine | Alpine版体积更小 |
| Redis | 7.0 | 最新稳定系列 |
| MongoDB | 6.0 | 支持新版查询语法 |
每个容器都配置了:
- 自定义数据目录挂载(如/var/lib/mysql → /data/mysql)
- 独立bridge网络(避免端口冲突)
- 环境变量方式设置初始密码
- 时区统一设置为Asia/Shanghai
3. 核心脚本实现
3.1 目录结构设计
脚本执行前会创建以下目录结构:
/data ├── mysql ├── postgres ├── redis └── mongodb通过环境变量控制各数据库的挂载点:
export MYSQL_DATA_DIR="/data/mysql" export PG_DATA_DIR="/data/postgres" export REDIS_DATA_DIR="/data/redis" export MONGO_DATA_DIR="/data/mongodb"3.2 MySQL部署实现
核心启动命令:
docker run -d \ --name mysql8 \ -v $MYSQL_DATA_DIR:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=$DB_PASSWORD \ -e MYSQL_DATABASE=$DB_NAME \ -p 3306:3306 \ --restart unless-stopped \ mysql:8.0 \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_unicode_ci关键参数说明:
--character-set-server显式设置UTF8MB4以支持完整unicode--restart unless-stopped实现服务自愈- 密码通过环境变量传入而非命令行(避免泄露)
3.3 PostgreSQL特殊配置
针对PostgreSQL的优化配置:
docker run -d \ --name postgres15 \ -v $PG_DATA_DIR:/var/lib/postgresql/data \ -e POSTGRES_PASSWORD=$DB_PASSWORD \ -e POSTGRES_DB=$DB_NAME \ -p 5432:5432 \ --shm-size=1g \ postgres:15-alpine \ -c shared_buffers=256MB \ -c max_connections=200Alpine版需要特别注意:
- 必须设置
--shm-size否则可能启动失败 - 默认配置需要调整shared_buffers(容器内存限制)
3.4 Redis持久化方案
采用AOF+RDB双重持久化:
docker run -d \ --name redis7 \ -v $REDIS_DATA_DIR:/data \ -p 6379:6379 \ redis:7.0 \ --appendonly yes \ --save 60 10000参数解释:
--appendonly yes启用AOF日志--save 60 1000060秒内10000次改动触发RDB快照
3.5 MongoDB权限控制
6.0版本需要显式启用认证:
docker run -d \ --name mongodb6 \ -v $MONGO_DATA_DIR:/data/db \ -e MONGO_INITDB_ROOT_USERNAME=root \ -e MONGO_INITDB_ROOT_PASSWORD=$DB_PASSWORD \ -p 27017:27017 \ mongo:6.0 \ --auth重要:MongoDB 4.4+版本必须设置
--auth,否则默认允许无密码访问
4. 完整脚本源码
#!/bin/bash # 配置区 DB_PASSWORD="YourStrong@Passw0rd" DB_NAME="testdb" # 创建数据目录 sudo mkdir -p /data/{mysql,postgres,redis,mongodb} sudo chmod -R 777 /data # 安装Docker sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io sudo systemctl enable docker # 部署MySQL docker run -d \ --name mysql8 \ -v /data/mysql:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=$DB_PASSWORD \ -e MYSQL_DATABASE=$DB_NAME \ -p 3306:3306 \ --restart unless-stopped \ mysql:8.0 \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_unicode_ci # 部署PostgreSQL docker run -d \ --name postgres15 \ -v /data/postgres:/var/lib/postgresql/data \ -e POSTGRES_PASSWORD=$DB_PASSWORD \ -e POSTGRES_DB=$DB_NAME \ -p 5432:5432 \ --shm-size=1g \ --restart unless-stopped \ postgres:15-alpine \ -c shared_buffers=256MB \ -c max_connections=200 # 部署Redis docker run -d \ --name redis7 \ -v /data/redis:/data \ -p 6379:6379 \ --restart unless-stopped \ redis:7.0 \ --appendonly yes \ --save 60 10000 # 部署MongoDB docker run -d \ --name mongodb6 \ -v /data/mongodb:/data/db \ -e MONGO_INITDB_ROOT_USERNAME=root \ -e MONGO_INITDB_ROOT_PASSWORD=$DB_PASSWORD \ -p 27017:27017 \ --restart unless-stopped \ mongo:6.0 \ --auth echo "所有数据库已部署完成!"5. 使用验证与问题排查
5.1 服务状态检查
验证各容器是否正常运行:
docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"预期输出应显示四个容器状态均为"Up"。
5.2 常见问题解决
问题1:Docker服务启动失败
症状:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock解决方案:
sudo systemctl start docker sudo usermod -aG docker $USER newgrp docker问题2:MySQL无法远程连接
检查步骤:
- 确认防火墙放行3306端口
- 登录容器检查用户权限:
docker exec -it mysql8 mysql -uroot -p GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码'; FLUSH PRIVILEGES;问题3:MongoDB认证失败
正确连接方式:
mongo -u root -p 密码 --authenticationDatabase admin6. 性能优化建议
6.1 内存限制调整
对于生产环境,建议为每个容器设置内存限制(在docker run命令中添加):
--memory 2g --memory-swap 4g # MySQL示例各数据库推荐内存配置:
| 数据库 | 最小内存 | 推荐内存 |
|---|---|---|
| MySQL | 1GB | 4GB |
| PostgreSQL | 512MB | 2GB |
| Redis | 256MB | 1GB |
| MongoDB | 1GB | 4GB |
6.2 数据备份方案
建议添加定期备份脚本(示例):
# MySQL备份 docker exec mysql8 sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /backup/mysql_$(date +%Y%m%d).sql # PostgreSQL备份 docker exec postgres15 pg_dumpall -U postgres > /backup/pg_$(date +%Y%m%d).sql7. 安全加固措施
7.1 密码安全
强烈建议:
- 修改脚本中的默认密码
- 使用密码管理器生成强密码
- 定期轮换密码(建议90天)
7.2 网络隔离
生产环境建议:
# 创建专属网络 docker network create db_network # 启动时加入该网络(替代默认bridge) --network db_network7.3 日志审计
启用详细日志记录(以MySQL为例):
docker run ... mysql:8.0 \ --general-log=1 \ --general-log-file=/var/log/mysql/query.log \ --slow-query-log=1 \ --slow-query-log-file=/var/log/mysql/slow.log记得将日志目录也挂载到宿主机持久化。