保姆级教程:用Docker Compose一键部署苍穹外卖(含MySQL、Redis、Nginx全栈配置)

张开发
2026/4/4 3:20:25 15 分钟阅读
保姆级教程:用Docker Compose一键部署苍穹外卖(含MySQL、Redis、Nginx全栈配置)
全栈容器化实战用Docker Compose高效部署苍穹外卖系统在当今云原生技术蓬勃发展的时代容器化部署已成为现代应用交付的标准方式。对于像苍穹外卖这样的全栈应用来说传统的手动部署方式不仅效率低下还容易因环境差异导致各种在我机器上能跑的问题。本文将带你用Docker Compose这一工业级编排工具实现从零开始的一键式部署体验。1. 环境准备与架构设计苍穹外卖作为一个典型的互联网应用其技术栈包含多个关键组件数据层MySQL 8.0作为关系型数据库Redis 6.x作为缓存服务层基于Spring Boot的Java后端服务接入层Nginx同时承担前端资源服务和API网关角色客户端微信小程序作为用户入口传统部署方式需要逐个配置这些服务而使用Docker Compose可以将其抽象为声明式配置。以下是我们的目录结构设计/sky-takeout ├── docker-compose.yml # 主编排文件 ├── mysql │ ├── conf/my.cnf # MySQL自定义配置 │ ├── init/init.sql # 初始化数据库脚本 │ └── data # 数据持久化目录 ├── redis │ └── redis.conf # Redis配置文件 ├── backend │ ├── Dockerfile # 后端构建文件 │ └── app.jar # Spring Boot应用包 └── nginx ├── nginx.conf # 主配置文件 └── html # 前端静态资源提示建议使用JDK17作为基础镜像以获得更好的容器兼容性这也是Spring Boot 3.x的推荐运行环境。2. Docker Compose核心配置解析创建docker-compose.yml文件这是整个系统的编排核心。我们将采用版本3.8的Compose语法这是目前最稳定且功能完善的版本。version: 3.8 services: mysql: image: mysql:8.0 container_name: sky-mysql environment: MYSQL_ROOT_PASSWORD: sky123 TZ: Asia/Shanghai MYSQL_DATABASE: sky_db volumes: - ./mysql/data:/var/lib/mysql - ./mysql/conf:/etc/mysql/conf.d - ./mysql/init:/docker-entrypoint-initdb.d ports: - 3306:3306 healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 5s timeout: 10s retries: 5 networks: - sky-network redis: image: redis:6-alpine container_name: sky-redis command: redis-server --requirepass skyredis volumes: - ./redis/redis.conf:/usr/local/etc/redis/redis.conf ports: - 6379:6379 healthcheck: test: [CMD, redis-cli, ping] interval: 5s timeout: 3s retries: 5 networks: - sky-network backend: build: ./backend container_name: sky-backend depends_on: mysql: condition: service_healthy redis: condition: service_healthy environment: SPRING_PROFILES_ACTIVE: prod TZ: Asia/Shanghai ports: - 8080:8080 networks: - sky-network nginx: image: nginx:1.21-alpine container_name: sky-nginx depends_on: backend: condition: service_started volumes: - ./nginx/html:/usr/share/nginx/html - ./nginx/nginx.conf:/etc/nginx/nginx.conf ports: - 80:80 - 443:443 networks: - sky-network networks: sky-network: driver: bridge关键配置说明服务依赖通过depends_on确保服务启动顺序结合healthcheck实现真正的服务可用性检测健康检查每个服务都配置了健康检查策略避免出现服务未就绪就被调用的情况网络隔离所有服务加入自定义的sky-network实现容器间域名通信资源限制虽然没有显式展示但可以通过deploy.resources为每个服务设置CPU/内存限制3. 各服务定制化配置3.1 MySQL优化配置在mysql/conf/my.cnf中添加以下优化参数[mysqld] default_authentication_pluginmysql_native_password character_set_serverutf8mb4 collation_serverutf8mb4_unicode_ci max_connections200 innodb_buffer_pool_size256M innodb_log_file_size128M skip-name-resolve初始化脚本mysql/init/init.sql应包含数据库schema和基础数据CREATE TABLE IF NOT EXISTS sky_order ( id bigint NOT NULL AUTO_INCREMENT, user_id bigint NOT NULL COMMENT 用户ID, address_id bigint NOT NULL COMMENT 地址ID, total_amount decimal(10,2) NOT NULL COMMENT 订单总金额, status tinyint NOT NULL DEFAULT 1 COMMENT 状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消, create_time datetime NOT NULL COMMENT 下单时间, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci; -- 其他表结构和初始化数据...3.2 Redis性能调优redis/redis.conf关键配置bind 0.0.0.0 protected-mode no port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize no supervised no pidfile /var/run/redis_6379.pid loglevel notice logfile databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir ./ maxmemory 256mb maxmemory-policy allkeys-lru3.3 后端服务Dockerfilebackend/Dockerfile应采用多阶段构建减小镜像体积# 构建阶段 FROM eclipse-temurin:17-jdk-jammy as builder WORKDIR /app COPY . . RUN ./gradlew bootJar # 运行阶段 FROM eclipse-temurin:17-jre-jammy WORKDIR /app COPY --frombuilder /app/build/libs/*.jar app.jar ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime echo $TZ /etc/timezone EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar]3.4 Nginx高级配置nginx/nginx.conf需要配置API反向代理和WebSocket支持worker_processes auto; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root /usr/share/nginx/html/sky; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://backend:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /ws/ { proxy_pass http://backend:8080/ws/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection Upgrade; proxy_set_header Host $host; } } }4. 部署与运维实践4.1 一键启动与停止启动整个系统后台模式docker-compose up -d查看服务状态docker-compose ps停止并清理资源docker-compose down4.2 常见问题排查MySQL连接问题docker-compose logs mysql后端服务启动失败docker-compose logs backendNginx配置检查docker exec sky-nginx nginx -t4.3 性能监控方案添加Prometheus监控扩展docker-compose.ymlmonitor: image: prom/prometheus ports: - 9090:9090 volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml networks: - sky-network示例prometheus.yml配置global: scrape_interval: 15s scrape_configs: - job_name: backend static_configs: - targets: [backend:8080] - job_name: mysql static_configs: - targets: [mysql:9104] - job_name: redis static_configs: - targets: [redis:9121]4.4 微信小程序适配技巧小程序开发环境下需要配置合法域名但在测试阶段可以通过以下方式绕过在微信开发者工具中开启不校验合法域名选项修改小程序请求基地址为Nginx服务地址// 开发环境配置 const baseURL process.env.NODE_ENV development ? http://your-server-ip/api : https://prod-domain.com/api;对于WebSocket连接需要确保Nginx配置了正确的代理location /ws/ { proxy_pass http://backend:8080/ws/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; }5. 进阶优化策略5.1 资源限制与调度在docker-compose.yml中为每个服务添加资源限制services: backend: deploy: resources: limits: cpus: 1 memory: 512M reservations: memory: 256M5.2 日志集中管理集成ELK栈收集容器日志logstash: image: docker.elastic.co/logstash/logstash:7.14.0 volumes: - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf ports: - 5044:5044 networks: - sky-network filebeat: image: docker.elastic.co/beats/filebeat:7.14.0 user: root volumes: - /var/lib/docker/containers:/var/lib/docker/containers:ro - ./filebeat.yml:/usr/share/filebeat/filebeat.yml networks: - sky-network5.3 CI/CD集成示例.gitlab-ci.yml示例stages: - build - deploy build_backend: stage: build image: docker:20.10 services: - docker:20.10-dind script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE/backend:$CI_COMMIT_SHA ./backend - docker push $CI_REGISTRY_IMAGE/backend:$CI_COMMIT_SHA deploy_prod: stage: deploy image: docker:20.10 services: - docker:20.10-dind script: - apk add --no-cache openssh-client - echo $SSH_PRIVATE_KEY ssh_key - chmod 600 ssh_key - scp -i ssh_key docker-compose.prod.yml userserver:/app/sky-takeout - ssh -i ssh_key userserver cd /app/sky-takeout docker-compose -f docker-compose.prod.yml pull docker-compose -f docker-compose.prod.yml up -d only: - master在实际项目中我们团队发现将MySQL的innodb_buffer_pool_size设置为可用内存的70%能显著提升查询性能同时要注意为容器保留足够的内存余量避免OOM killer终止数据库进程。

更多文章