别再手动配置了!用Docker Compose一键部署你的第一个Web应用(附完整YAML文件)
别再手动配置了!用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"
让我们分解这个配置文件的关键部分:
- version:指定使用的Compose文件格式版本
- services:定义要运行的服务
- web:我们的Flask应用服务
build: .:使用当前目录的Dockerfile构建镜像ports:将容器端口映射到主机volumes:挂载代码目录实现开发时热重载environment:设置环境变量depends_on:声明依赖关系
- redis:Redis缓存服务
- 直接使用官方Redis镜像
- web:我们的Flask应用服务
还需要创建一个简单的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做了以下几件事:
- 构建web服务的镜像
- 拉取redis镜像(如果本地没有)
- 创建默认网络
- 启动两个容器
- 将日志输出到终端
要停止应用,只需按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. 常见问题解决
在使用过程中,可能会遇到一些典型问题:
- 端口冲突:确保主机端口没有被其他应用占用
- 构建缓存问题:有时需要清除缓存重新构建
docker-compose build --no-cache - 权限问题:特别是挂载卷时,注意容器内外的用户权限
- 服务启动顺序:
depends_on只确保容器启动顺序,不保证服务可用性
对于更复杂的应用,你可能需要:
- 使用多个Compose文件管理不同环境
- 配置自定义网络实现更精细的网络控制
- 设置卷标签实现数据持久化
- 使用Docker Swarm或Kubernetes进行集群部署
更多推荐



所有评论(0)