Docker compose详细介绍以及编写

1. Docker compose介绍

Docker Compose 是 Docker 官方提供的一个工具,用于定义和管理多容器应用。它使用 YAML 文件来描述多个 Docker 容器的配置,并通过一条命令来创建和管理这些容器。

  1. Docker compose适用于
    • 微服务架构(例如Nginx + PHP + Mysql)
    • 测试环境(快速搭建应用)
    • CI/CD流程(自动化部署)
  2. Docker Compose解决了什么问题
    1. 手动运行多个 docker run 命令:
      • 需要为每个容器手动指定网络、端口映射、环境变量等
      • 容易出错,难以维护
    2. 使用 Shell 脚本:
      • 通过 Bash 或 Python 脚本管理多个 docker run 命令
      • 仍然缺乏灵活性,维护成本较高。

Docker Compose 通过 YAML 配置文件(docker-compose.yml)来简化多容器管理,让运维更搞笑!


2. Docker Compose 安装

Docker Compose 通常已经集成在 Docker CLI 中,可以直接使用 docker compose 命令。如果需要单独安装,可以执行以下命令:

curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

检查是否安装成功,并检查版本:

docker-compose version

3. Docker Compose 核心概念

Docker Compose 主要由一个 YAML配置文件命令行工具 组成

  1. YAML配置文件(docker-compose.yml)

    • 用于描述应用的所有 服务(容器)、网络数据卷 等。
  2. 核心命令(CLI)

    • 启动所有容器

      docker-compose run
      
    • 停止并删除容器

      docker-compose down
      
    • 查看日志

      docker-compose logs
      
    • 查看容器状态

      docker-compose ps
      

4. docker-compose.yml

假设要部署一个wordpress网站,包含:

  • Nginx + PHP + Wordpress (web服务)
  • Mysql(数据库服务)

docker-compose.yml 示例:

version: '3.8'

services:
  wordpress:
    image: wordpress:latest
    restart: always
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: mypassword
      WORDPRESS_DB_NAME: wordpress
    depends_on:
      - db

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: mypassword
      MYSQL_DATABASE: wordpress

解析:

  • services:定义了两个服务(wordpress 和 db)
  • images:指定使用的Docker镜像
  • ports:映射端口(如 8080:80,访问 localhost:8080 就能打开wordpress
  • environment:设置环境变量
  • depends_on:确保 db 服务先启动

5. Docker Compose 常用命令

命令 作用
docker-compose up -d 以后台模式启动所有服务
docker-compose down 停止并删除所有容器
docker-compose ps 查看正在运行的容器
docker-compose logs -f 实时查看容器日志
docker-compose restart 重新启动所有服务
docker-compose stop 停止所有容器
docker-compose start 启动已停止的容器
docker-compose exec 服务名 bash 进入容器

6. 数据持久化(Volumes)

如果不使用数据卷,数据库数据会丢失

在 docker-compose.yml 中添加 volumes 来解决:

services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: mypassword
      MYSQL_DATABASE: wordpress
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

这样即使 docker-compose down,数据仍然保留


7. 使用 .env 文件管理环境变量

可以创建一个 .env 文件:

DB_PASSWORD=mypassword

然后 docker-compose.yml 这样写

environment:
  MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}

这样可以更加安全地管理密码文件,而不直接写在 docker-compose.yml 里。


8. Docker Compose 与 Dockerfile 结合

首先可以自定义一个镜像,例如 PHP + Wordpress 镜像:

services:
  wordpress:
    build: .
    ports:
      - "8080:80"
    depends_on:
      - db

同时编写 Dockerfile

FROM wordpress:latest
RUN apt update && apt install -y vim

然后运行:

docker compose up --build -d

这样就可以用 自己的 Dockerfile 来构建镜像了。


9. Docker Compose 网络(Network)

默认情况下,Docker Compose 会为所有服务构建一个 独立的网络,并允许它们通过 服务名互相通信

也可以自己手动定义网络,如果不手动定义网络那么在Docker compose文件中的主机都会处于同一个网络

networks:
  mynetwork:
    driver: bridge

services:
  wordpress:
    networks:
      - mynetwork

  db:
    networks:
      - mynetwork

这样可以管理不同服务的通信


10. docker-compose.yml文件模版

version: "3.8"  # 指定 Docker Compose 版本

services:
  # 1️⃣ Nginx 反向代理
  nginx:
    image: nginx:latest
    container_name: nginx_proxy
    ports:
      - "80:80"    # 访问 http://localhost
      - "443:443"  # 访问 https://localhost
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro  # Nginx 主配置文件
      - ./nginx/conf.d:/etc/nginx/conf.d:ro  # 站点配置
      - ./nginx/logs:/var/log/nginx  # Nginx 日志持久化
    depends_on:
      - tomcat
    networks:
      - backend_network
    restart: always  # 自动重启

  # 2️⃣ Tomcat 服务器(运行 Java Web 应用)
  tomcat:
    image: tomcat:9.0
    container_name: tomcat_server
    ports:
      - "8080:8080"  # Tomcat 端口
    volumes:
      - ./app:/usr/local/tomcat/webapps  # 挂载 Web 应用目录
      - ./tomcat/conf/server.xml:/usr/local/tomcat/conf/server.xml:ro  # Tomcat 配置
      - ./tomcat/logs:/usr/local/tomcat/logs  # Tomcat 日志持久化
    environment:
      - TZ=Asia/Shanghai  # 设置时区
    networks:
      - backend_network
    restart: always

  # 3️⃣ MySQL 数据库
  mysql:
    image: mysql:8.0
    container_name: mysql_db
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: myapp_db
      MYSQL_USER: myapp_user
      MYSQL_PASSWORD: myapp_pass
    volumes:
      - mysql_data:/var/lib/mysql  # 持久化 MySQL 数据
    networks:
      - backend_network
    restart: always

  # 4️⃣ Redis 缓存数据库
  redis:
    image: redis:latest
    container_name: redis_cache
    command: ["redis-server", "--appendonly", "yes"]
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    networks:
      - backend_network
    restart: always

  # 5️⃣ Prometheus 监控系统
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus_server
    ports:
      - "9090:9090"  # Prometheus Web 访问地址
    volumes:
      - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml  # 配置文件
    networks:
      - monitoring_network
    restart: always

  # 6️⃣ Grafana 数据可视化
  grafana:
    image: grafana/grafana:latest
    container_name: grafana_dashboard
    ports:
      - "3000:3000"  # Grafana Web 界面
    volumes:
      - grafana_data:/var/lib/grafana
    networks:
      - monitoring_network
    restart: always

networks:
  backend_network:
    driver: bridge
  monitoring_network:
    driver: bridge

volumes:
  mysql_data:
  redis_data:
  grafana_data:

个人学习使用

posted @ 2025-03-24 20:36  小时候老白啦  阅读(292)  评论(0)    收藏  举报