news 2026/10/25 4:26:06

Ubuntu 22.04下Docker一键部署四大数据库实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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

关键点说明:

  1. 使用官方源而非系统默认源,确保获取最新稳定版
  2. 包含docker-compose-plugin替代旧的docker-compose
  3. 自动处理了apt-key过时问题(Ubuntu 22.04新特性)

2.3 数据库容器配置

四大数据库均采用Docker官方镜像,具体版本选择策略:

数据库镜像版本选择理由
MySQL8.0兼顾新特性和稳定性
PostgreSQL15-alpineAlpine版体积更小
Redis7.0最新稳定系列
MongoDB6.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=200

Alpine版需要特别注意:

  1. 必须设置--shm-size否则可能启动失败
  2. 默认配置需要调整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无法远程连接

检查步骤:

  1. 确认防火墙放行3306端口
  2. 登录容器检查用户权限:
docker exec -it mysql8 mysql -uroot -p GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码'; FLUSH PRIVILEGES;
问题3:MongoDB认证失败

正确连接方式:

mongo -u root -p 密码 --authenticationDatabase admin

6. 性能优化建议

6.1 内存限制调整

对于生产环境,建议为每个容器设置内存限制(在docker run命令中添加):

--memory 2g --memory-swap 4g # MySQL示例

各数据库推荐内存配置:

数据库最小内存推荐内存
MySQL1GB4GB
PostgreSQL512MB2GB
Redis256MB1GB
MongoDB1GB4GB

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).sql

7. 安全加固措施

7.1 密码安全

强烈建议:

  1. 修改脚本中的默认密码
  2. 使用密码管理器生成强密码
  3. 定期轮换密码(建议90天)

7.2 网络隔离

生产环境建议:

# 创建专属网络 docker network create db_network # 启动时加入该网络(替代默认bridge) --network db_network

7.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

记得将日志目录也挂载到宿主机持久化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/25 4:20:35

AI视频变现与竞争:从技术架构到工程实践

1. AI视频赛道的变现逻辑与竞争格局1.1 从工具到生意:AI视频到底靠什么赚钱AI视频生成这个方向,从2023年开始就一直是热点,但真正把"赚钱"这件事跑通的产品并不多。大部分团队还停留在"炫技"阶段——生成效果很惊艳&…

作者头像 李华
网站建设 2026/10/25 4:11:17

从长文本翻车到拆块流水线:OptiMUS如何让大模型生成可靠数学模型

1. 长文本直接投喂的翻车现场:为什么"上下文窗口够大"依然不行做数学建模的人,尤其碰过运筹优化问题的,应该都有过这种冲动:把一段几百字的业务描述直接丢给大模型,让它输出一个完整的整数规划模型。我第一次…

作者头像 李华
网站建设 2026/10/25 4:10:33

工业三维扫描到CAD建模的实战落地指南

1. 这不是科幻,是正在发生的工业设计范式迁移最近在几个制造业技术交流群里,频繁刷到“GPT-6 Astra”和“Prevu3D”这两个词被并列讨论,尤其集中在“工厂三维扫描→CAD自动生成”这个动作上。我第一时间没点开任何演示视频,而是先…

作者头像 李华
网站建设 2026/10/25 4:06:35

中国车企智能驾驶技术突破与行业变革分析

1. 智能驾驶测试背后的行业格局变迁最近一份来自美国的智能驾驶测试报告在业内引发热议,测试结果显示三家中国车企表现优异,而部分传统强势车企却意外落马。这个结果看似简单,实则折射出全球汽车产业正在经历的重大变革。智能驾驶测试通常包含…

作者头像 李华
网站建设 2026/10/25 4:06:32

MAI协议中committed字段的真实含义与实时字幕渲染原理

1. 实时字幕里那个“committed”到底在承诺什么?——不是文字定稿,而是时间戳契约你有没有在看一场技术直播时,盯着右下角跳动的实时字幕,突然发现某句话刚出现就立刻被划掉、替换成另一个版本?更奇怪的是,…

作者头像 李华
网站建设 2026/10/25 3:46:05

Kafka Producer性能优化实战与深度解析

1. 问题现象与背景分析最近在排查线上服务性能问题时,发现一个奇怪的现象:消息队列的Producer端发送消息速度明显下降,导致业务处理出现延迟。具体表现为发送单条消息耗时从平均5ms飙升到200ms以上,高峰期甚至达到秒级延迟。这种情…

作者头像 李华