第六章-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原生的集群编排工具。

相关推荐
安易算力12 小时前
昇腾生态开发深度实践:CANN算子库架构解析与MindSpore模型优化
网络·容器·架构·kubernetes·vllm
闲云自留地12 小时前
不用 docker!containerd 镜像 crctl 命令一把梭
容器
周先生FullStack13 小时前
Mac + 容器本地 MySQL/Redis 环境搭建与网络原理实战
java·spring boot·微服务·容器·架构·个人开发
Dovis(誓平步青云)13 小时前
突破 32 位瓶颈:64 位 XID 如何化解事务号回卷危机
运维·服务器·人工智能·docker·容器
闲云自留地14 小时前
nerdctl 实战全解:替代 docker 的 containerd 客户端,镜像 / 容器 / 网络 / 存储 / Namespace 一把抓
容器
容器魔方15 小时前
基于 KubeEdge 为云边协同 AI 流数据分析提供基础设施
大数据·云原生·容器·开源·边缘计算
九皇叔叔1 天前
Kubernetes 核心概念:集群架构、核心组件与资源对象
docker·容器·kubernetes·k8s
wdfk_prog1 天前
ROS教程07:从 ros::start() 顺着源码读懂 Master、XML-RPC 与 Topic 注册发现
运维·缓存·docker·容器·ros
两点王爷1 天前
常用的 Docker 镜像拉取地址仓库及常用命令详解
运维·服务器·容器
wdfk_prog1 天前
用 Git Submodule + Sparse Checkout 管理 RT-Thread:内核、BSP、第三方库与业务代码分层实践
运维·缓存·docker·容器·ros