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

想象一下这样的场景:你刚写完一个简单的Web应用,准备部署到服务器上。按照传统方式,你需要手动安装依赖、配置环境、启动服务……每一步都可能遇到各种问题。但现在,有了Docker Compose,这一切都可以变得无比简单。本文将带你从零开始,用一个具体的例子演示如何通过Docker Compose一键部署你的第一个Web应用。

1. 为什么选择Docker Compose?

在单容器场景下,使用docker run命令可能还算方便。但一旦涉及到多个容器(比如Web应用+数据库+缓存),手动管理就会变得非常麻烦。Docker Compose通过一个简单的YAML文件,让你能够定义和运行多容器应用,解决了以下痛点:

  • 环境一致性:确保开发、测试、生产环境完全一致
  • 简化部署:一条命令即可启动整个应用栈
  • 易于维护:所有配置集中在一个文件中,方便版本控制
  • 快速扩展:轻松调整服务数量和配置

下面是一个简单的对比,展示了使用Docker Compose前后的区别:

操作传统方式使用Docker Compose
启动应用多个docker run命令docker-compose up
停止应用手动查找并停止容器docker-compose down
配置管理分散在各处集中在一个YAML文件
环境变量需要单独设置在YAML中统一管理

2. 环境准备

在开始之前,确保你的系统已经安装了Docker和Docker Compose。可以通过以下命令检查:

docker --version
docker-compose --version

如果尚未安装,可以参考官方文档进行安装。对于大多数Linux系统,安装过程非常简单:

# 安装Docker
curl -fsSL https://get.docker.com | sh

# 安装Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

注意:安装完成后,可能需要将当前用户加入docker组才能无需sudo运行docker命令:

sudo usermod -aG docker $USER

然后需要重新登录使更改生效。

3. 创建示例Web应用

为了演示,我们将创建一个简单的Python Flask应用。首先创建一个项目目录:

mkdir mywebapp && cd mywebapp

然后创建应用文件app.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, Docker Compose!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

接下来创建requirements.txt文件,列出应用依赖:

Flask==2.0.1

4. 编写docker-compose.yml

现在我们来创建核心的docker-compose.yml文件。这个文件定义了我们的服务、网络和卷等配置。

version: '3.8'

services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
    depends_on:
      - redis

  redis:
    image: "redis:alpine"

让我们分解这个配置文件的关键部分:

  1. version:指定使用的Compose文件格式版本
  2. services:定义要运行的服务
    • web:我们的Flask应用服务
      • build: .:使用当前目录的Dockerfile构建镜像
      • ports:将容器端口映射到主机
      • volumes:挂载代码目录实现开发时热重载
      • environment:设置环境变量
      • depends_on:声明依赖关系
    • redis:Redis缓存服务
      • 直接使用官方Redis镜像

还需要创建一个简单的Dockerfile

FROM python:3.9-slim

WORKDIR /code

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

CMD ["python", "app.py"]

5. 启动应用

一切就绪后,启动应用只需要一条命令:

docker-compose up

你会看到Docker Compose做了以下几件事:

  1. 构建web服务的镜像
  2. 拉取redis镜像(如果本地没有)
  3. 创建默认网络
  4. 启动两个容器
  5. 将日志输出到终端

要停止应用,只需按Ctrl+C或运行:

docker-compose down

6. 进阶配置

现在我们已经有了一个基本的工作配置,让我们看看如何进一步优化它。

6.1 环境变量管理

直接在YAML文件中硬编码环境变量不是最佳实践。更好的做法是使用.env文件:

# .env文件
FLASK_ENV=development
REDIS_HOST=redis

然后在docker-compose.yml中引用:

environment:
  FLASK_ENV: ${FLASK_ENV}

6.2 健康检查

添加健康检查可以确保服务真正可用:

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:5000"]
  interval: 30s
  timeout: 10s
  retries: 3

6.3 资源限制

限制容器资源使用:

deploy:
  resources:
    limits:
      cpus: '0.5'
      memory: 512M

7. 实际应用中的技巧

在实际项目中使用Docker Compose时,有几个实用技巧值得分享:

  • 多环境配置:使用docker-compose.override.yml为不同环境提供特定配置
  • 项目命名:使用-p参数指定项目名,避免与其他项目冲突
  • 日志管理:配置日志驱动和选项防止日志占用过多磁盘空间
  • 性能优化
    • 对于开发环境,使用volumes实现代码热重载
    • 对于生产环境,使用COPY将代码构建进镜像
# 指定项目名启动
docker-compose -p myproject up

# 生产环境构建
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

8. 常见问题解决

在使用过程中,可能会遇到一些典型问题:

  1. 端口冲突:确保主机端口没有被其他应用占用
  2. 构建缓存问题:有时需要清除缓存重新构建
    docker-compose build --no-cache
    
  3. 权限问题:特别是挂载卷时,注意容器内外的用户权限
  4. 服务启动顺序depends_on只确保容器启动顺序,不保证服务可用性

对于更复杂的应用,你可能需要:

  • 使用多个Compose文件管理不同环境
  • 配置自定义网络实现更精细的网络控制
  • 设置卷标签实现数据持久化
  • 使用Docker Swarm或Kubernetes进行集群部署
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐