2026/2/18 17:50:41
网站建设
项目流程
毕业做网站运营好吗,jquery 单页网站,网站vr视角怎么做,企业网站托管外包方式视频看了几百小时还迷糊#xff1f;关注我#xff0c;几分钟让你秒懂#xff01;#x1f9e9; 一、为什么你需要 Docker Compose#xff1f;你是不是经常干这些事#xff1a;每次开发都要手动启动 MySQL、Redis、RabbitMQ、Nginx、Spring Boot……一个项目要敲 5 条 dock…视频看了几百小时还迷糊关注我几分钟让你秒懂 一、为什么你需要 Docker Compose你是不是经常干这些事每次开发都要手动启动 MySQL、Redis、RabbitMQ、Nginx、Spring Boot……一个项目要敲 5 条docker run命令还容易漏参数想把整套环境分享给同事结果他配了三天还没跑起来测试完想清理环境结果忘了删哪个 volumeDocker Compose 就是你的“一键部署神器”它用一个docker-compose.yml文件定义所有服务、网络、卷、依赖关系然后一条命令docker-compose up全部搞定 二、需求场景Spring Boot MySQL Redis Nginx 一键启动假设你有一个典型的 Java 微服务项目包含后端Spring Boot监听 8080数据库MySQL缓存Redis网关Nginx反向代理到后端现在你要在本地快速搭建这套环境并且能随时启动/停止/重建。✅ 三、正确姿势编写 docker-compose.yml步骤 1创建项目目录结构mkdir myapp-compose cd myapp-compose touch docker-compose.yml mkdir -p nginx/conf.d步骤 2编写docker-compose.ymlversion: 3.8 services: # MySQL 服务 mysql-db: image: mysql:8.0 container_name: mysql-db environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: myapp_db volumes: - mysql_data:/var/lib/mysql ports: - 3306:3306 networks: - app-network restart: always # Redis 服务 redis-cache: image: redis:7.0 container_name: redis-cache command: redis-server --appendonly yes --requirepass mypassword123 volumes: - redis_data:/data ports: - 6379:6379 networks: - app-network restart: always # Spring Boot 应用假设你已构建好镜像 my-spring-app:1.0 app: image: my-spring-app:1.0 container_name: my-spring-app depends_on: - mysql-db - redis-cache ports: - 8080:8080 networks: - app-network restart: always # Nginx 反向代理 nginx-proxy: image: nginx:1.25 container_name: nginx-proxy ports: - 80:80 volumes: - ./nginx/conf.d:/etc/nginx/conf.d depends_on: - app networks: - app-network restart: always # 定义自定义网络自动创建 networks: app-network: driver: bridge # 定义持久化卷数据不会丢 volumes: mysql_data: redis_data: 注意所有服务都在同一个app-network可以直接用服务名作为域名通信depends_on表示启动顺序但不等服务真正 ready需配合健康检查volumes实现数据持久化ports用于对外暴露端口步骤 3配置 Nginxnginx/conf.d/default.confserver { listen 80; server_name localhost; location /api/ { proxy_pass http://app:8080/; # ← 关键直接用服务名 app proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location / { root /usr/share/nginx/html; index index.html; } }✅ 因为 Nginx 和 app 在同一个 Docker 网络所以http://app:8080能直接解析步骤 4Spring Boot 配置application.ymlspring: datasource: url: jdbc:mysql://mysql-db:3306/myapp_db?useSSLfalseserverTimezoneUTC username: root password: 123456 redis: host: redis-cache port: 6379 password: mypassword123✅ 数据库地址写mysql-db服务名不是localhost 四、一键启动 管理启动所有服务后台运行docker-compose up -d查看日志# 查看所有服务日志 docker-compose logs -f # 只看 app 日志 docker-compose logs -f app停止 删除# 停止 docker-compose down # 停止 删除卷⚠️ 数据会丢 docker-compose down -v重建某个服务比如更新了 Spring Boot 镜像docker-compose up -d --build app❌ 五、反例新手常犯的错误反例 1没用自定义网络靠 IP 或 localhost 通信# 错误默认网络无法用服务名解析 services: app: image: myapp db: image: mysql→ 结果UnknownHostException: db✅ 正确显式定义networks并让所有服务加入。反例 2忘记挂载配置文件Nginx 用默认配置Nginx 启动了但没代理后端白跑✅ 正确用volumes挂载自定义default.conf反例 3把敏感信息写死在 yml 里生产大忌environment: MYSQL_ROOT_PASSWORD: 123456 # ← 明文密码✅ 正确做法开发可用生产用 secretsenvironment: MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_password secrets: - mysql_password⚠️ 六、注意事项避坑指南depends_on不等于“等服务就绪”它只控制容器启动顺序不等待 MySQL 真正可连接解决方案在 Spring Boot 中加连接重试或使用healthcheckCompose v2.1 支持。Windows 路径挂载注意如果用 Windows路径写成volumes: - ./nginx/conf.d:/etc/nginx/conf.d确保 Docker Desktop 已授权该目录共享。镜像版本固定写mysql:8.0而不是mysql:latest避免自动升级导致兼容问题。不要在生产直接用docker-compose生产建议用 Kubernetes 或 Swarm。Compose 适合开发/测试。 七、进阶技巧技巧 1多环境配置dev / prod# 开发环境 docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d # 生产环境 docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d技巧 2变量替换.env文件创建.envDB_PASSWORDsupersecret123 REDIS_PASSWORDcache123在docker-compose.yml中引用environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}✅ 八、总结Compose 的核心优势传统方式Docker Compose多条docker run命令一个docker-compose.yml手动管理网络/volume自动创建和清理配置分散难维护配置集中版本可控分享环境靠口头描述git clonedocker-compose up一句话记住“一个文件定义一切一条命令启动全家”视频看了几百小时还迷糊关注我几分钟让你秒懂