第六章-DockerCompose:多容器应用的‘指挥家‘

6.1 为什么需要Docker Compose?

在上一章的实战中,我们已经体验到了管理多个容器的复杂性。如果应用包含更多服务(比如Web服务器、数据库、缓存、消息队列等),手动管理会变得非常繁琐:

  • 需要依次启动多个容器
  • 需要记住复杂的参数(端口映射、环境变量、挂载目录等)
  • 需要处理服务之间的依赖关系
  • 停止和清理也很麻烦

Docker Compose就是为了解决这些问题而生的,它就像一个"指挥家",能够统一编排和管理多个容器。

6.2 Docker Compose核心概念

6.2.1 服务(Service)

服务是Compose中的核心概念,代表一个可运行的容器。一个服务可以运行多个相同容器实例(副本)。

6.2.2 项目(Project)

项目是Compose的一个隔离环境,通常对应一个应用。项目名称默认为目录名。

6.2.3 编排文件(docker-compose.yml)

这是Compose的"乐谱",用YAML格式描述应用的服务、网络和数据卷。

6.3 编写docker-compose.yml文件

让我们以一个典型的Web应用为例,包含Nginx、Flask和MySQL:

yaml 复制代码
version: '3.8'

# 定义服务
services:
  # Nginx服务
  nginx:
    image: nginx:alpine
    container_name: my-nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./static:/static
    depends_on:
      - flask
    networks:
      - frontend

  # Flask应用服务
  flask:
    build: ./flask-app
    container_name: my-flask
    ports:
      - "5000:5000"
    environment:
      - DATABASE_URL=mysql://user:pass@mysql:3306/mydb
    volumes:
      - ./flask-app:/app
    depends_on:
      - mysql
    networks:
      - frontend
      - backend

  # MySQL数据库服务
  mysql:
    image: mysql:5.7
    container_name: my-mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: mydb
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - backend

# 定义数据卷
volumes:
  mysql_data:

# 定义网络
networks:
  frontend:
  backend:

6.4 Compose常用命令

bash 复制代码
# 启动所有服务(首次运行会自动构建镜像)
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看服务日志
docker-compose logs

# 停止所有服务
docker-compose stop

# 启动已停止的服务
docker-compose start

# 重启服务
docker-compose restart

# 停止并删除所有服务、网络、数据卷
docker-compose down

# 执行单次命令(比如数据库迁移)
docker-compose run flask python manage.py db upgrade

6.5 实战:用Compose部署WordPress

WordPress是一个流行的博客系统,依赖Apache/Web服务器和MySQL数据库。我们用Compose来部署它:

yaml 复制代码
version: '3.8'

services:
  wordpress:
    image: wordpress:latest
    container_name: my-wordpress
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppass
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress_data:/var/www/html
    depends_on:
      - mysql
    networks:
      - app-network

  mysql:
    image: mysql:5.7
    container_name: my-mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppass
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - app-network

volumes:
  wordpress_data:
  mysql_data:

networks:
  app-network:

保存为docker-compose.yml,然后执行:

bash 复制代码
docker-compose up -d

几分钟后,访问http://localhost:8080,就能看到WordPress的安装界面了!

Docker Compose大大简化了多容器应用的管理,是Docker生态系统中不可或缺的工具。

下一章,我们将学习Docker Swarm,它是Docker原生的集群编排工具。

相关推荐
summer_west_fish1 小时前
K8S Advance: 集群 IP 地址管理指南
tcp/ip·容器·kubernetes
b***62951 小时前
使用Docker部署postgresql
docker·postgresql·容器
Liangomy1 小时前
FAST-Calib 激光雷达与相机联合标定教程 (Docker版)
数码相机·docker·容器
de之梦-御风2 小时前
【远程控制】RustDesk 自建服务端完整方案(Docker + Windows 客户端)
windows·docker·容器
de之梦-御风2 小时前
【远程控制】开箱即用的 RustDesk 自建服务端完整 Docker Compose 模板
运维·docker·容器
努力也学不会java3 小时前
【docker】Docker Register(镜像仓库)
运维·人工智能·机器学习·docker·容器
青啊青斯3 小时前
Dify Docker部署
运维·docker·容器·dify
saber_andlibert3 小时前
【docker】入门基础和镜像、容器
linux·运维·docker·容器
小毅&Nora3 小时前
【云计算】【Kubernetes】 ③ 深入 containerd - CRI 插件如何驱动 OCI 容器?
容器·kubernetes·云计算