保姆级教程:用Docker Compose一键部署你的第一个Web应用(附常见错误排查) 保姆级教程用Docker Compose一键部署你的第一个Web应用附常见错误排查当你第一次听说Docker Compose时可能会觉得这不过是又一个需要学习的工具。但当你真正开始用它来管理多个容器时那种一键启动整个应用的爽快感会让你立刻明白为什么这个工具能成为现代开发者的标配。本教程将带你从零开始用最直观的方式部署一个包含Web服务器、数据库和缓存的全栈应用。1. 环境准备与基础概念在开始编写docker-compose.yml文件之前我们需要确保开发环境已经就绪。不同于单纯的Docker使用Compose的核心价值在于它能用声明式的方式定义和管理多容器应用。首先检查你的Docker环境docker --version docker-compose --version如果尚未安装Docker Compose可以使用以下命令适用于Linux/macOSsudo 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提示Windows用户建议直接安装Docker Desktop它已经包含了Compose工具理解几个关键概念服务(Service)在Compose文件中定义的每个容器如web、db项目(Project)由一组关联服务组成的完整应用网络(Network)服务间通信的隔离网络环境2. 编写你的第一个docker-compose.yml让我们从一个最简单的三服务架构开始前端Web应用Nginx、后端APINode.js和数据库MySQL。在项目根目录创建docker-compose.yml文件version: 3.8 services: web: image: nginx:alpine ports: - 8080:80 volumes: - ./static:/usr/share/nginx/html depends_on: - api api: build: ./backend ports: - 3000:3000 environment: - DB_HOSTdb - DB_USERroot - DB_PASSWORDsecret depends_on: - db db: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORDsecret - MYSQL_DATABASEapp_db volumes: - db_data:/var/lib/mysql volumes: db_data:这个配置文件做了以下几件事定义了一个Nginx服务映射主机8080端口到容器80端口构建一个Node.js后端服务需要项目中有backend目录和Dockerfile设置MySQL数据库并创建持久化数据卷常见新手错误缩进错误YAML对缩进极其敏感必须使用空格而非Tab端口冲突确保主机端口未被占用如8080、3000环境变量未传递检查变量名是否与应用程序预期一致3. 多服务编排实战技巧当服务数量增加时编排的复杂性会显著上升。以下是几个高级技巧3.1 服务依赖与健康检查简单的depends_on只确保容器启动不保证服务可用。更可靠的做法services: api: depends_on: db: condition: service_healthy db: healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 5s timeout: 10s retries: 53.2 网络配置优化默认情况下Compose会创建一个隔离网络。如需自定义networks: app_net: driver: bridge ipam: config: - subnet: 172.28.0.0/16 services: web: networks: app_net: ipv4_address: 172.28.1.13.3 资源限制防止单个容器占用过多资源services: db: deploy: resources: limits: cpus: 0.5 memory: 512M reservations: memory: 256M4. 常见错误排查手册遇到问题时按这个流程排查查看日志docker-compose logs [service_name]检查容器状态docker-compose ps docker inspect container_id常见错误代码错误现象可能原因解决方案端口已占用主机端口冲突更改ports映射或停止占用进程连接被拒绝服务未启动/网络问题检查depends_on和健康检查权限不足容器用户权限添加user: 1000:1000配置构建失败Dockerfile错误单独构建测试docker build -t test .调试技巧进入运行中的容器docker-compose exec api sh测试服务连通性docker-compose run --rm api curl http://db:33065. 生产环境优化建议当准备将应用部署到生产环境时需要考虑以下优化安全加固使用非root用户运行容器限制不必要的capabilities定期更新基础镜像services: api: user: 1000:1000 cap_drop: - ALL cap_add: - NET_BIND_SERVICE性能调优配置合理的资源限制使用.sock文件代替TCP连接启用日志轮转services: nginx: logging: options: max-size: 10m max-file: 3CI/CD集成 在GitLab CI中的示例配置deploy: stage: deploy script: - docker-compose -f docker-compose.prod.yml up -d --build only: - master实际部署中我发现最容易被忽视的是容器时区设置。很多日志时间戳混乱的问题都源于此。简单的解决方案services: api: environment: - TZAsia/Shanghai volumes: - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro