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

相关推荐
野蛮人6号15 分钟前
p29 docker08-docker基础-本地目录挂载 无法正确添加mysql 点击更新后data没有正常显示
mysql·docker·容器
峰顶听歌的鲸鱼33 分钟前
15.docker:网络
运维·网络·docker·容器·云计算·php·学习方法
遇见火星2 小时前
Docker Compose 实战教程,理解Docker Compose核心概念,学会编写 compose.yml,掌握常用命令!
运维·docker·容器·compose
原神启动12 小时前
Docker(二)—— Docker容器操作
运维·docker·容器
你什么冠军?2 小时前
Docker
运维·容器
呼啦啦呼啦啦啦啦啦啦2 小时前
推送docker镜像至私有 Docker 镜像仓库(附企业harbor实战)
运维·docker·容器
m0_485614672 小时前
Docker基础
docker·容器·php
爱学大树锯2 小时前
【Docker本地化超级实践】Docker 镜像离线构建方案
运维·docker·容器
默恋~微凉3 小时前
Docker
运维·docker·容器
叽里咕噜怪3 小时前
Docker 场景化作业:生产环境容器操作实训
运维·docker·容器