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

相关推荐
sbjdhjd25 分钟前
云安全 | Docker 容器逃逸复盘(三):docker.sock 挂载与 Docker-in-Docker 风险
经验分享·网络安全·docker·云原生·容器·kubernetes·云安全
热爱Liunx的丘丘人42 分钟前
1、什么是K8s
云原生·容器·kubernetes
帷幕落秋2 小时前
Docker的两种安装
运维·docker·容器
fengkai45453 小时前
十二、Redis -2
运维·数据库·redis·容器
DolitD5 小时前
3D应用多实例并发中的GPU隔离技术路径分析
容器·gru·接口隔离原则
姜鱼问生6 小时前
docker exec 排查容器问题:从日志到进程
运维·网络·数据库·docker·容器
小匠石钧知8 小时前
07_在k8s集群中安装ingress-nginx
nginx·容器·kubernetes·ingress
零基础1239 小时前
Docker 部署实战:从入门到精通
docker·容器
承渊政道9 小时前
自建服务越来越多怎么管理?Docker部署Flare,搭一个自己的数字入口
运维·docker·容器·内网穿透·cpolar·nas·flare
芷栀夏10 小时前
极空间部署Photopea:Docker运行、网页修图与多设备使用
运维·docker·容器