Docker容器化中间件部署实践指南 1. 为什么需要容器化中间件部署在现代化应用开发中中间件部署往往是最耗费时间的环节之一。传统部署方式需要手动安装依赖、配置环境、处理版本冲突整个过程既繁琐又容易出错。我经历过无数次在我机器上能跑的窘境直到开始使用Docker才彻底解决这个问题。以MongoDB为例官方提供了从3.2到7.0的多个版本每个版本对系统库的依赖都不尽相同。如果要在同一台服务器部署多个版本的应用传统方式几乎不可能实现。而通过Docker容器我们可以轻松实现版本隔离不同项目使用不同中间件版本环境一致性开发、测试、生产环境完全一致快速重置秒级创建和销毁测试环境2. 部署前的准备工作2.1 Docker环境配置首先确保已安装Docker Engine和Docker Compose。推荐使用官方安装脚本# Docker Engine安装 curl -fsSL https://get.docker.com | sh sudo systemctl enable --now docker # Docker Compose安装 sudo curl -L https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose注意生产环境建议使用特定版本而非latest标签避免意外升级导致兼容性问题2.2 存储规划中间件容器通常需要持久化数据建议提前规划存储目录/mnt/docker/ ├── mongo/ # MongoDB数据卷 ├── mysql/ # MySQL数据卷 ├── redis/ # Redis数据卷 └── tomcat/ # Tomcat webapps3. MongoDB容器化部署3.1 单节点部署使用官方MongoDB镜像快速启动docker run -d \ --name mongodb \ -p 27017:27017 \ -v /mnt/docker/mongo:/data/db \ -e MONGO_INITDB_ROOT_USERNAMEadmin \ -e MONGO_INITDB_ROOT_PASSWORD123456 \ mongo:6.0 --wiredTigerCacheSizeGB 1关键参数说明--wiredTigerCacheSizeGB限制内存使用避免容器占用过多主机内存MONGO_INITDB_*初始化root用户生产环境应使用更复杂的密码3.2 副本集配置生产环境建议使用副本集# docker-compose.yml version: 3.8 services: mongo1: image: mongo:6.0 ports: [27017:27017] volumes: [/mnt/docker/mongo1:/data/db] command: mongod --replSet rs0 --wiredTigerCacheSizeGB 1 mongo2: image: mongo:6.0 volumes: [/mnt/docker/mongo2:/data/db] command: mongod --replSet rs0 --wiredTigerCacheSizeGB 1 mongo3: image: mongo:6.0 volumes: [/mnt/docker/mongo3:/data/db] command: mongod --replSet rs0 --wiredTigerCacheSizeGB 1初始化副本集docker exec -it mongo1 mongosh --eval rs.initiate({ _id: rs0, members: [ {_id: 0, host: mongo1:27017}, {_id: 1, host: mongo2:27017}, {_id: 2, host: mongo3:27017} ] })4. Redis容器化部署4.1 基础部署Redis官方镜像已优化得很好docker run -d \ --name redis \ -p 6379:6379 \ -v /mnt/docker/redis:/data \ redis:7.0-alpine \ --save 60 1 --loglevel warning参数说明--save 60 160秒内至少1次修改则触发RDB持久化alpine版本镜像体积更小约30MB4.2 持久化配置Redis提供两种持久化方式RDB默认启用--save 900 1 # 15分钟至少1个key变化 --save 300 10 # 5分钟至少10个key变化AOF追加更安全--appendonly yes --appendfsync everysec # 折衷方案生产环境建议同时开启RDB和AOF既保证数据安全又便于灾难恢复5. MySQL容器化部署5.1 基础配置MySQL官方镜像支持多种初始化方式docker run -d \ --name mysql \ -p 3306:3306 \ -v /mnt/docker/mysql:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD123456 \ -e MYSQL_DATABASEapp_db \ -e MYSQL_USERapp_user \ -e MYSQL_PASSWORDuser123 \ mysql:8.0 \ --character-set-serverutf8mb4 \ --collation-serverutf8mb4_unicode_ci字符集设置要点utf8mb4支持完整Unicode包括emoji排序规则根据业务需求选择5.2 性能调优通过配置文件调整性能参数# custom.cnf [mysqld] innodb_buffer_pool_size 1G # 建议为物理内存的50-70% innodb_log_file_size 256M max_connections 200挂载配置文件-v ./custom.cnf:/etc/mysql/conf.d/custom.cnf6. Tomcat容器化部署6.1 标准部署使用官方Tomcat镜像docker run -d \ --name tomcat \ -p 8080:8080 \ -v /mnt/docker/tomcat/webapps:/usr/local/tomcat/webapps \ tomcat:9.0-jdk176.2 优化建议时区设置-e TZAsia/Shanghai内存限制-e JAVA_OPTS-Xms512m -Xmx1024m生产环境应使用JDK17以获得更好的容器支持7. 使用Docker Compose编排完整编排示例version: 3.8 services: mongodb: image: mongo:6.0 ports: [27017:27017] volumes: [mongo_data:/data/db] environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: 123456 command: mongod --wiredTigerCacheSizeGB 1 redis: image: redis:7.0-alpine ports: [6379:6379] volumes: [redis_data:/data] command: redis-server --save 60 1 mysql: image: mysql:8.0 ports: [3306:3306] volumes: [mysql_data:/var/lib/mysql, ./mysql.cnf:/etc/mysql/conf.d/custom.cnf] environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: app_db MYSQL_USER: app_user MYSQL_PASSWORD: user123 tomcat: image: tomcat:9.0-jdk17 ports: [8080:8080] volumes: [tomcat_webapps:/usr/local/tomcat/webapps] depends_on: - mongodb - redis - mysql volumes: mongo_data: redis_data: mysql_data: tomcat_webapps:8. 常见问题排查8.1 容器启动失败检查日志的三种方式docker logs containerdocker compose logsjournalctl -u docker系统级日志8.2 连接问题典型错误解决Connection refused检查端口映射和防火墙Authentication failed确认环境变量已正确设置Too many connections调整MySQL的max_connections8.3 数据持久化验证数据卷挂载docker inspect container | grep Mounts9. 性能监控与维护9.1 资源监控使用docker stats查看实时资源占用CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O a1b2c3d4e5f6 mongodb 2.3% 512MiB / 1.952GiB 25.6% 1.2MB / 3MB 0B / 0B9.2 定期维护镜像更新docker compose pull docker compose up -d日志轮转docker run --log-opt max-size10m --log-opt max-file3备份策略定期导出数据库dump备份数据卷目录10. 安全最佳实践不要使用默认密码限制网络暴露ports: - 127.0.0.1:3306:3306 # 仅本地访问使用非root用户运行USER 1000定期更新镜像获取安全补丁