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

相关推荐
舰长11513 分钟前
使用 kubeadm搭建生产环境的单 master 节点 K8S 集群(一)
云原生·容器·kubernetes
hwj运维之路1 小时前
Docker面试题汇总系列
运维·docker·云原生·容器
VermiliEiz2 小时前
使用二进制方式部署k8s(6)
云原生·容器·kubernetes
七七powerful2 小时前
Docker 容器化 GPU 压测工具(压测单卡)
运维·docker·容器
firstacui3 小时前
Docker compose的安装与使用
运维·docker·容器
汪碧康3 小时前
一文讲解kubernetes的gateway Api的功能、架构、部署、管理及使用
云原生·容器·架构·kubernetes·gateway·kubelet·xkube
Wpa.wk18 小时前
容器编排 - 了解K8s(pod, deployment,service,lable等概念)
经验分享·测试工具·docker·云原生·容器·kubernetes
xuefuhe19 小时前
Kubernetes基础入门4 应用的扩展与收缩
云原生·容器·kubernetes
Wpa.wk20 小时前
容器编排 - K8s - 配置文件参数说明和基础命令
经验分享·测试工具·docker·云原生·容器·kubernetes
杭州杭州杭州1 天前
Docker
运维·docker·容器