使用 Docker Compose 管理多服务项目部署(含 Nginx+PHP+MySQL)

优化 docker compose 性能需选择轻量镜像(如 alpine)、合并 dockerfile 指令、设置资源限制、利用构建缓存并优化网络;2. 处理数据库迁移可通过 depends_on 结合 entrypoint 脚本等待数据库就绪后执行迁移命令,或使用 flyway/liquibase 等专用工具;3. 监控应用可使用 docker stats 和 logs 实时查看资源与日志,或部署 prometheusgrafana 收集指标并可视化,也可结合 cadvisor 或 elk stack 实现全面监控,最终实现高效、稳定、可观测的容器化应用部署。

使用 Docker Compose 管理多服务项目部署(含 Nginx+PHP+MySQL)

使用 Docker Compose 可以极大简化多服务项目的部署流程,它允许你用一个 YAML 文件定义整个应用,包括服务、网络和卷。这比手动配置每个容器要高效得多,也更易于维护。

解决方案

以下是一个使用 Docker Compose 管理 nginx+php+mysql 项目部署的示例。我们将创建一个

docker-compose.yml

文件,定义这三个服务,以及它们之间的依赖关系和网络配置。

立即学习PHP免费学习笔记(深入)”;

version: "3.8"  services:   nginx:     image: nginx:latest     ports:       - "80:80"     volumes:       - ./nginx/conf.d:/etc/nginx/conf.d       - ./php:/var/www/html     depends_on:       - php     networks:       - app-network    php:     build:       context: ./php       dockerfile: Dockerfile     volumes:       - ./php:/var/www/html     depends_on:       - mysql     networks:       - app-network    mysql:     image: mysql:8.0     environment:       MYSQL_ROOT_PASSWORD: your_root_password       MYSQL_DATABASE: your_database       MYSQL_USER: your_user       MYSQL_PASSWORD: your_password     volumes:       - mysql_data:/var/lib/mysql     networks:       - app-network  volumes:   mysql_data:  networks:   app-network:     driver: bridge

这个

docker-compose.yml

文件定义了三个服务:

  • nginx: 使用官方 Nginx 镜像,将宿主机的 80 端口映射到容器的 80 端口。它挂载了两个卷:一个用于 Nginx 的配置文件,另一个用于 PHP 代码。
    depends_on

    指令确保 PHP 服务在 Nginx 启动之前运行。

  • php: 使用自定义的 Dockerfile 构建 PHP 镜像 (位于
    ./php

    目录)。它挂载了 PHP 代码的卷,并依赖于 MySQL 服务。

  • mysql: 使用官方 MySQL 8.0 镜像,设置了环境变量来配置数据库。它挂载了一个卷来持久化 MySQL 数据。

步骤:

  1. 创建目录结构:

    mkdir nginx php touch nginx/conf.d/default.conf php/Dockerfile php/index.php
  2. Nginx 配置 (nginx/conf.d/default.conf):

    server {     listen 80;     index index.php index.html;     root /var/www/html;      location ~ .php$ {         try_files $uri =404;         fastcgi_split_path_info ^(.+.php)(/.+)$;         fastcgi_pass php:9000;         fastcgi_index index.php;         include fastcgi_params;         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;         fastcgi_param PATH_INFO $fastcgi_path_info;     }      location ~ /.ht {         deny all;     } }
  3. PHP Dockerfile (php/Dockerfile):

    FROM php:8.1-fpm  RUN apt-get update && apt-get install -y      libpng-dev      libjpeg-turbo8-dev      libzip-dev      && docker-php-ext-configure gd --with-jpeg=/usr/include/      && docker-php-ext-install -j$(nproc) gd zip pdo pdo_mysql  RUN pecl install xdebug      && docker-php-ext-enable xdebug  WORKDIR /var/www/html
  4. PHP 示例代码 (php/index.php):

    <?php phpinfo(); ?>
  5. 运行 Docker Compose:

    docker-compose up -d

部署完成后,访问

localhost

即可看到 PHP 的

phpinfo()

页面。

如何优化 Docker Compose 文件以提高性能?

优化 Docker Compose 文件以提高性能,可以从几个方面入手:

  • 选择合适的镜像: 使用体积更小、性能更好的镜像。例如,对于 Nginx,可以考虑使用 Alpine linux 版本的 Nginx 镜像。
  • 构建优化: 在 Dockerfile 中,合并多个 RUN 指令,减少镜像层数。使用
    .dockerignore

    文件排除不必要的文件,减小镜像体积。

  • 资源限制: 为每个服务设置资源限制(CPU、内存),防止某个服务占用过多资源,影响其他服务。
  • 缓存利用: Docker Compose 会缓存构建好的镜像层,下次构建时可以复用。避免不必要的重新构建。
  • 网络优化: 使用 Docker 的 overlay 网络,可以提高容器之间的通信效率。

一个例子,优化 PHP Dockerfile:

FROM php:8.1-fpm-alpine  RUN apk update && apk add --no-cache      libpng-dev      libjpeg-turbo-dev      libzip-dev      freetype-dev      && docker-php-ext-configure gd --with-freetype --with-jpeg      && docker-php-ext-install -j$(nproc) gd zip pdo pdo_mysql  RUN pecl install xdebug      && docker-php-ext-enable xdebug  WORKDIR /var/www/html

这里使用了

php:8.1-fpm-alpine

作为基础镜像,它比标准的 debian 版本更小。同时,使用

apk

代替

apt-get

安装软件包,

apk

是 Alpine Linux 的包管理器,速度更快。

--no-cache

参数防止缓存包数据,进一步减小镜像体积。

如何处理 Docker Compose 部署中的数据库迁移?

数据库迁移是部署过程中一个重要的环节。通常,我们需要在应用启动之前或之后执行数据库迁移脚本。Docker Compose 提供了一些方法来处理这个问题:

  • 使用
    depends_on

    和脚本: 在 Docker Compose 文件中,使用

    depends_on

    确保数据库服务先启动。然后,创建一个脚本来执行数据库迁移,并将该脚本添加到 PHP 容器的启动命令中。

  • 使用
    entrypoint

    脚本: 可以创建一个

    entrypoint

    脚本,在容器启动时执行。该脚本可以先检查数据库是否需要迁移,如果需要,则执行迁移脚本。

  • 使用专门的迁移工具 例如,Flyway 或 Liquibase。这些工具可以自动管理数据库迁移,并提供版本控制和回滚功能。
  • 使用 init 容器: 创建一个 init 容器,专门负责执行数据库迁移。该容器会在应用容器启动之前运行,确保数据库已经准备好。

一个使用

entrypoint

脚本的例子(假设我们使用 laravel):

  1. 创建
    entrypoint.sh

    文件:

#!/bin/bash  # 等待 MySQL 服务启动 until mysqladmin ping -h"$MYSQL_HOST" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD"; do   echo "Waiting for MySQL to start..."   sleep 5 done  echo "MySQL is up and running!"  # 执行数据库迁移 php artisan migrate --force  # 启动 PHP-FPM exec "$@"
  1. 修改 PHP Dockerfile:
FROM php:8.1-fpm-alpine  # ... (安装依赖)  COPY entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh  ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] CMD ["php-fpm"]
  1. docker-compose.yml

    中设置环境变量:

php:   # ...   environment:     MYSQL_HOST: mysql     MYSQL_USER: your_user     MYSQL_PASSWORD: your_password

这个

entrypoint.sh

脚本会先等待 MySQL 服务启动,然后执行 Laravel 的数据库迁移命令。

如何监控 Docker Compose 管理的应用?

监控 Docker Compose 管理的应用,可以帮助我们及时发现问题,并优化应用性能。以下是一些常用的监控方法:

  • Docker Stats: 使用
    docker stats

    命令可以查看容器的 CPU、内存、网络和 I/O 使用情况。

  • Docker Logs: 使用
    docker logs

    命令可以查看容器的日志输出。

  • Prometheus 和 Grafana: Prometheus 是一个流行的监控系统,可以收集容器的指标数据。Grafana 是一个数据可视化工具,可以用来展示 Prometheus 收集的数据。
  • cadvisor: cAdvisor 是一个 Google 开源的容器监控工具,可以自动发现容器并收集指标数据。
  • ELK Stack: ELK Stack (elasticsearch, Logstash, Kibana) 是一个强大的日志管理和分析平台,可以用来收集、存储和分析容器的日志。

使用 Prometheus 和 Grafana 监控 Docker Compose 应用的步骤:

  1. 安装 Prometheus 和 Grafana: 可以使用 Docker Compose 来安装 Prometheus 和 Grafana。
  2. 配置 Prometheus: 配置 Prometheus 收集 Docker 容器的指标数据。可以使用
    docker-compose.yml

    文件中的

    labels

    字段来标记需要监控的容器。

  3. 配置 Grafana: 配置 Grafana 连接到 Prometheus 数据源,并创建仪表盘来展示容器的指标数据。

一个简单的

docker-compose.yml

文件,用于部署 Prometheus 和 Grafana:

version: "3.8"  services:   prometheus:     image: prom/prometheus:latest     ports:       - "9090:9090"     volumes:       - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml    grafana:     image: grafana/grafana:latest     ports:       - "3000:3000"     depends_on:       - prometheus 

然后,创建一个

prometheus.yml

文件,配置 Prometheus 收集 Docker 容器的指标数据。

global:   scrape_interval:     15s  scrape_configs:   - job_name: 'docker'     static_configs:       - targets: ['host.docker.internal:9100'] # 需要安装 node_exporter

最后,访问

localhost:3000

即可访问 Grafana,并配置 Prometheus 数据源。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享