在生产开发中,你修改代码后希望快速看到效果,有两种方式:
重建镜像:
docker compose up -d --build(会重新构建 web 镜像)挂载源码:开发时把代码目录挂载进去,改代码自动生效(无需重建)
我们演示第二种(更接近真正的开发体验)。
1. 先停止并清理当前环境
docker compose down
2. 修改 docker-compose.yml,添加代码挂载
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- ./app.py:/app/app.py # 将宿主机 app.py 挂载到容器内
depends_on:
- redis
networks:
- my-network
redis:
image: redis:alpine
networks:
- my-network
volumes:
- redis-data:/data
networks:
my-network:
volumes:
redis-data:
EOF
关键变化: volumes: - ./app.py:/app/app.py → 代码不用重建镜像了。3. 启动服务
docker compose up -d
4. 修改 app.py(不重建)
cat > app.py << 'EOF'
from flask import Flask
from redis import Redis
import os
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
count = redis.incr('hits')
# 修改返回内容,增加 emoji
return f'<h1> Visitor #{count}! Docker is awesome </h1>'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
EOF
5. 刷新页面(无需重建)
curl http://localhost:5000
注意:Flask 默认不会自动重载,你需要重启 web 容器让新代码生效:
docker compose restart web curl http://localhost:5000
6. 查看当前运行的服务
7. 最终清理
你已经学完了 Docker Compose 核心功能!
| 功能 | 命令/配置 |
|---|---|
| 定义多服务 | docker-compose.yml |
| 一键启动 | up -d |
| 构建镜像 | build: . |
| 端口映射 | ports: - "5000:5000" |
| 卷挂载 | volumes: - ./app.py:/app/app.py |
| 依赖顺序 | depends_on: - redis |
| 自定义网络 | networks: |
| 持久化卷 | volumes: 顶层定义 |
| 查看状态 | ps, logs |
| 进入容器 | exec |
| 停止/启动 | stop, start |
| 完全清理 | down -v |
