《Docker Compose 入门:用一个文件管理多容器应用》
·
好的,这是一份清晰、实用的 Docker Compose 入门指南,聚焦于用单个文件管理多容器应用:
Docker Compose 入门:用一个文件管理多容器应用
核心问题:当应用由多个相互依赖的服务(如 Web 服务器、数据库、缓存)组成时,手动使用 docker run 逐个启动和管理容器非常繁琐且容易出错。
解决方案:Docker Compose。它允许你使用一个 YAML 格式的文件 (docker-compose.yml) 定义和配置所有相关的服务、网络、卷等。通过一个命令,即可启动、停止或重建整个应用栈。
核心优势
- 单文件定义:所有服务及其配置(镜像、端口、环境变量、依赖关系、网络、数据卷)集中在一个文件中。
- 一键操作:
docker compose up启动所有服务;docker compose down停止并清理所有资源。 - 环境一致性:无论在开发、测试还是生产环境,使用相同的 Compose 文件能保证应用运行环境一致。
- 简化协作:共享一个
docker-compose.yml文件即可让团队成员快速搭建起相同的应用环境。
关键概念与 docker-compose.yml 结构
一个典型的 docker-compose.yml 文件包含以下主要部分:
version(必需):指定 Compose 文件格式的版本(如"3.8")。版本决定了可用的功能。services(必需):定义你的应用包含哪些容器(服务)。<service_name>(例如web,db): 自定义的服务名称。image: 指定要使用的 Docker 镜像 (如nginx:latest,postgres:13).build: 如果需从 Dockerfile 构建镜像,指定构建上下文路径 (如context: .).ports: 将容器端口映射到主机端口 (格式:"HOST_PORT:CONTAINER_PORT", 如"8080:80").volumes: 挂载主机目录或命名卷到容器 (格式:"HOST_PATH:CONTAINER_PATH"或volume_name:CONTAINER_PATH).environment: 设置容器内的环境变量 (可直接写键值对或用env_file指定文件).depends_on: 声明服务之间的启动依赖关系 (如db服务必须在web服务之前启动).networks: 指定服务连接到的网络。restart: 定义容器退出时的重启策略 (如always,on-failure).
volumes(可选):声明需要使用的命名数据卷。Compose 会自动创建和管理它们。networks(可选):声明需要使用的自定义网络。默认会创建一个与应用栈同名的网络,所有服务自动加入其中并可通过服务名相互访问。
实战示例:构建一个简单的 Web + Redis 应用
假设我们有一个简单的 Web 应用 (app.py) 使用 Flask 框架,它需要一个 Redis 服务来存储访问计数。
-
项目结构:
myapp/ ├── app.py # Flask 应用代码 ├── requirements.txt # Python 依赖 ├── Dockerfile # 用于构建 Web 应用镜像 └── docker-compose.yml # Compose 配置文件 -
app.py(简化版):from flask import Flask from redis import Redis app = Flask(__name__) redis = Redis(host='redis', port=6379) # 注意主机名是服务名 'redis' @app.route('/') def hello(): count = redis.incr('hits') return f'Hello World! I have been seen {count} times.' if __name__ == "__main__": app.run(host="0.0.0.0", debug=True) -
Dockerfile(构建 Web 镜像):FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "app.py"](
requirements.txt包含flask和redis) -
核心:
docker-compose.yml:version: '3.8' # 指定 Compose 文件格式版本 services: web: build: . # 使用当前目录下的 Dockerfile 构建镜像 ports: - "8000:5000" # 映射主机 8000 端口 -> 容器 5000 端口 (Flask 默认端口) depends_on: - redis # 声明依赖,确保 redis 服务先启动 networks: - app-network # 加入自定义网络 redis: image: "redis:alpine" # 使用官方的 Redis Alpine 镜像 networks: - app-network # 加入同一个网络 # Redis 数据默认存储在容器内,生产环境建议添加 volumes networks: app-network: # 定义自定义网络 driver: bridge关键点解析:
web服务:基于当前目录 (build: .) 构建镜像,将主机的8000端口映射到容器的5000端口。redis服务:直接拉取官方redis:alpine镜像运行。depends_on: - redis:确保redis容器先于web容器启动。networks: 定义了一个名为app-network的桥接网络,两个服务都加入其中。在同一个 Compose 网络中的容器,可以通过服务名 (redis) 直接通信,无需知道 IP 地址。
-
启动应用栈: 在包含
docker-compose.yml的目录 (myapp/) 下运行:docker compose up -d # -d 表示在后台运行 (detached mode)输出示例:
[+] Building 15.3s (10/10) FINISHED [+] Running 3/3 ✔ Network myapp_app-network Created ✔ Container myapp-redis-1 Started ✔ Container myapp-web-1 Started -
验证:
- 打开浏览器访问
http://localhost:8000,应该能看到显示访问次数的 "Hello World!" 页面,刷新页面次数会增加。 - 查看运行中的容器:
docker compose ps - 查看日志 (特定服务):
docker compose logs web或docker compose logs redis - 查看所有日志:
docker compose logs
- 打开浏览器访问
-
停止并清理:
docker compose down # 停止并移除容器、网络(默认不移除卷和镜像)可选参数:
docker compose down --volumes:同时移除在volumes部分声明的命名卷。docker compose down --rmi all:同时移除由 Compose 构建的本地镜像。
常用命令速查
| 命令 | 作用 |
|---|---|
docker compose up -d | 构建镜像(如果需要),创建并启动所有服务(后台运行) |
docker compose down | 停止并移除所有容器、网络 |
docker compose ps | 列出项目相关的所有容器 |
docker compose logs [service] | 查看服务的日志输出 (-f 跟踪实时日志) |
docker compose exec [service] [cmd] | 在运行中的容器内执行命令 (如 docker compose exec web bash) |
docker compose build [service] | 重新构建服务的镜像 |
docker compose pull [service] | 拉取服务所需的镜像 |
docker compose config | 验证并查看解析后的 Compose 文件配置 |
docker compose stop | 停止运行中的容器,但不移除资源 |
docker compose start | 启动已停止的容器 |
docker compose restart [service] | 重启服务 |
总结
Docker Compose 通过 docker-compose.yml 这个单一配置文件,革命性地简化了多容器 Docker 应用的管理。它定义了:
- 应用所需的所有服务及其详细配置(镜像、端口、环境变量等)。
- 服务间的依赖关系 (
depends_on)。 - 共享的网络(服务间通过服务名通信)。
- 持久化数据卷。 使用
docker compose up和docker compose down即可一键管理整个应用栈的生命周期,极大地提升了开发、测试和部署复杂容器化应用的效率和一致性。它是现代容器化开发工作流中不可或缺的工具。
更多推荐
所有评论(0)