别再手动配置了!用Docker Compose一键部署你的第一个Web应用(附完整YAML文件)

每次搭建开发环境都要重复安装依赖、配置服务端口、处理数据库连接?这种低效操作早该被淘汰了。今天我要分享的是现代Web开发的正确打开方式——用Docker Compose实现一键环境部署。看完这篇,你会发现自己过去浪费了多少时间在环境配置上。

1. 为什么你需要Docker Compose

还记得第一次配置LNMP环境时的手忙脚乱吗?安装Nginx、配置PHP-FPM、设置MySQL权限...每个环节都可能出错。更糟的是,当项目需要迁移或团队协作时,环境差异导致的"在我机器上能跑"问题简直让人抓狂。

Docker Compose解决了三个核心痛点:

  • 环境一致性:相同的配置在任何机器上运行结果一致
  • 依赖隔离:不同项目的服务完全独立,不会互相干扰
  • 配置即代码docker-compose.yml文件记录全部环境配置,可版本控制

对比传统方式,使用Compose部署的优势显而易见:

对比项 传统方式 Docker Compose
部署时间 30min+ 1分钟
环境还原 靠文档记忆 一个命令
多项目隔离 需要手动处理 自动隔离
团队协作 容易出错 完全一致

2. 准备你的第一个Compose项目

2.1 环境准备

确保已安装:

  • Docker Engine 20.10+
  • Docker Compose v2.2+

检查版本:

docker --version
docker compose version

2.2 项目结构设计

推荐的基础目录结构:

/my-webapp
├── docker-compose.yml
├── nginx/
│   └── nginx.conf
├── app/
│   └── (你的应用代码)
└── mysql/
    └── init.sql

提示:这种结构将配置、代码和数据分离,方便管理和扩展

3. 编写完整的docker-compose.yml

下面是一个支持PHP+MySQL+Nginx的完整配置示例:

version: '3.8'

services:
  app:
    build: ./app
    volumes:
      - ./app:/var/www/html
    environment:
      - DB_HOST=db
      - DB_USER=root
      - DB_PASSWORD=secret

  db:
    image: mysql:5.7
    volumes:
      - mysql_data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=secret
      - MYSQL_DATABASE=myapp

  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./app:/var/www/html
    depends_on:
      - app

volumes:
  mysql_data:

关键配置解析:

  • volumes:实现宿主机与容器间的文件同步
  • depends_on:控制服务启动顺序
  • environment:设置容器内环境变量

4. 实战操作与技巧

4.1 启动与停止

启动所有服务:

docker compose up -d

停止并清理:

docker compose down --volumes

4.2 常见问题排查

问题1:端口冲突

解决方案:修改ports映射,如"8081:80"

问题2:服务启动顺序

注意:depends_on只控制启动顺序,不保证服务就绪

问题3:文件权限

# 查看容器日志
docker compose logs app

# 进入容器检查
docker compose exec app bash

4.3 性能优化技巧

  1. 开发环境使用bind mount实现代码热更新:
volumes:
  - ./app:/var/www/html:cached
  1. 生产环境建议:
  • 使用.dockerignore减少构建上下文
  • 配置资源限制:
deploy:
  resources:
    limits:
      cpus: '0.5'
      memory: 512M

5. 进阶:扩展到Node.js应用

只需修改app服务配置:

app:
  image: node:16
  working_dir: /usr/src/app
  volumes:
    - ./app:/usr/src/app
  ports:
    - "3000:3000"
  command: npm start

配套的Nginx配置需要添加反向代理:

location / {
  proxy_pass http://app:3000;
}

6. 最佳实践与经验分享

在实际项目中,我总结了这些经验教训:

  1. 版本控制:将docker-compose.yml和所有配置文件纳入Git管理
  2. 环境分离:使用docker-compose.override.yml实现开发/生产配置
  3. 敏感信息:用.env文件管理密码等机密:
DB_PASSWORD=real_secret

然后在Compose文件中引用:

environment:
  - DB_PASSWORD=${DB_PASSWORD}
  1. 健康检查:确保服务真正就绪:
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 30s
  timeout: 10s
  retries: 3

最后一个小技巧:在团队中,可以把常用命令写成Makefile:

up:
	docker compose up -d

logs:
	docker compose logs -f

down:
	docker compose down
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐