(2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)

前言

  1. 本系列最初的想法就是搭建一个多项目的环境, 包含nginx, nodejs, php, html, redis, MongoDB, mysql.
  2. 本文使用的PHP镜像为php:7.3.6-apache, 这里可以使用上一篇文章中生成好的镜像.
  3. LAMP或包含react或vue的前端项目, 本文就各写了一个, 可以按照实际需求, 自行添加多个容器, 但要保证一个容器启动一个项目.

项目规划

  1. 服务器环境为centos, 所有的项目均放置在/web目录.
  2. 使用nginx反向代理各项目, 并提供域名解析. 目录为/web/nginx
  3. react或vue的前端项目, 目录为/web/laoliu_pro
  4. php(LAMP)项目, 目录为/web/php_laoliu
  5. mysql, 目录为/web/mysql
  6. redis, 目录为/web/redis
  7. 部署两个域名, 分别是http://www.laoliu.pro对应laoliu_pro容器, http://php.laoliu.pro对应php_laoliu容器.

目录结构

web
|-- docker-compose.yaml					docker-composer的配置文件
|-- laoliu_pro							前端项目
|   |-- conf  							前端项目配置
|   |   `-- default.conf
|   `-- html  							前端项目文件
|       `-- index.html
|-- mysql
|   |-- conf  							mysql配置
|   |-- data  							mysql数据
|   |   |-- 223900885ed6.pid
|   |   |-- auto.cnf
|   |   |-- ca-key.pem
|   |   |-- ca.pem
|   |   |-- client-cert.pem
|   |   |-- client-key.pem
|   |   |-- ib_buffer_pool
|   |   |-- ibdata1
|   |   |-- ib_logfile0
|   |   |-- ib_logfile1
|   |   |-- ibtmp1
|   |   |-- mysql
|   |   |-- performance_schema
|   |   |-- private_key.pem
|   |   |-- public_key.pem
|   |   |-- server-cert.pem
|   |   |-- server-key.pem
|   |   `-- sys
|   `-- log  							mysql日志
|-- nginx
|   |-- certs 							nginx证书
|   |-- conf 							nginx配置
|   |   |-- laoliu_pro.conf
|   |   `-- php_laoliu.conf
|   `-- html 							nginx默认目录
|       `-- index.php
|-- php_laoliu							PHP项目
|   |-- conf							PHP项目配置
|   |   |-- php.ini						PHP.INI
|   |   `-- 000-default.conf			APACHE配置
|   |-- Dockerfile
|   |-- html                            PHP项目文件
|   |   `-- index.php
|   `-- log                             PHP项目日志
|       |-- access.log
|       |-- error.log
|       `-- other_vhosts_access.log
`-- redis
    |-- conf  							mysql配置
    |   `-- redis.conf
    `-- data  							mysql数据
        |-- backup.db
        `-- dump.rdb

docker-compose.yaml配置文件说明

如果有已经构建好的镜像, 可以使用image字段直接指定镜像.

version: '3'

services:      
  nginx:
    restart: always
    # 镜像
    image: nginx:latest
    # 端口映射 <宿主机端口>:<容器端口>
    ports:
      - 80:80
      - 443:443
    # 挂载卷 <宿主机路径>:<容器路径>
    volumes:
      # docker时间同步
      - /etc/localtime:/etc/localtime:ro
      # nginx证书目录
      - ./nginx/certs:/etc/nginx/certs:ro
      # nginx配置目录
      - ./nginx/conf:/etc/nginx/conf.d:ro
      # nginx默认站点
      - ./nginx/html:/html:ro
    # 容器名称
    container_name: nginx

  # 前端项目
  laoliu_pro:
    restart: always
    # 镜像
    image: nginx:latest
    # 挂载卷 <宿主机路径>:<容器路径>
    volumes:
      - /etc/localtime:/etc/localtime:ro
      # 前端项目目录
      - ./laoliu_pro/html:/app:rw
      # nginx配置目录
      - ./laoliu_pro/conf:/etc/nginx/conf.d:ro
    # 工作目录
    working_dir: /app
    # 容器名称
    container_name: laoliu_pro

  # PHP项目
  php_laoliu:
    restart: always
    # 镜像
    image: php:7.3.6-apache
    # 挂载卷 <宿主机路径>:<容器路径>
    volumes:
      # docker时间同步
      - /etc/localtime:/etc/localtime:ro
      # 日志目录
      - ./php_laoliu/log:/var/log/apache2:rw 
      # 项目文件目录
      - ./php_laoliu/html:/var/www/html:rw 
      # apache配置
      - ./php_laoliu/conf/000-default.conf:/etc/apache2/sites-available/000-default.conf:ro
      # php.ini
      - ./php_laoliu/conf/php.ini:/usr/local/etc/php/php.ini
    # 容器名称
    container_name: php_laoliu

  # 服务名
  mysql:
    restart: always
    # mysql镜像, 可选5.7或8
    image: mysql:5.7
    environment:
      # root密码
      MYSQL_ROOT_PASSWORD: 1234@5678
      # 允许远程连接
      MYSQL_ROOT_HOST: '%'
    # 挂载卷 <宿主机路径>:<容器路径>
    volumes:
      # docker时间同步
      - /etc/localtime:/etc/localtime:ro
      # 映射日志目录
      - ./mysql/log:/var/log/mysql
      # 映射配置目录
      - ./mysql/conf:/etc/mysql/mysql.conf.d:rw
      # 映射数据目录
      - ./mysql/data:/var/lib/mysql:rw
    # 容器名称
    container_name: mysql
    # 端口映射 <宿主机端口>:<容器端口>
    ports:
      - 3306:3306


  # 服务名
  redis:
    restart: always
    # redis镜像
    image: redis:5-alpine
    # 挂载卷 <宿主机路径>:<容器路径>
    volumes:
      # docker时间同步
      - /etc/localtime:/etc/localtime:ro
      # 映射配置目录
      - ./redis/conf:/etc/redis:ro
      # 映射数据目录
      - ./redis/data:/data:rw
    # 容器名称
    container_name: redis
    # 端口映射 <宿主机端口>:<容器端口>
    ports:
      - 6379:6379
    hostname: redis
    # 在容器启动后执行的命令
    command: redis-server /etc/redis/redis.conf

Dockerfile说明(可选, 没有额外的要求可以直接使用php:7.3.6-apache镜像)

# 这里使用的是php:7.3.6-apache镜像
FROM php:7.3.6-apache

ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

# apache开启伪静态
RUN a2enmod rewrite

# 安装扩展
RUN install-php-extensions gd \
	&& install-php-extensions iconv \
	&& install-php-extensions opcache \
	&& install-php-extensions zip \
	&& install-php-extensions pdo_mysql \
	&& install-php-extensions bcmath pcntl \
	&& install-php-extensions sockets \
	&& install-php-extensions sysvmsg \
	&& install-php-extensions mysqli \
	&& install-php-extensions redis \
	&& install-php-extensions gettext \
	&& install-php-extensions intl \
	&& install-php-extensions mcrypt \
	&& install-php-extensions mysql \
	&& install-php-extensions shmop \
	&& install-php-extensions soap \
	&& install-php-extensions xmlrpc

构建镜像

# 构建镜像
docker build -t laoliu_pro/php736_apache:v5 /web/image

启动容器

# 启动容器
docker-compose up -d

nginx反向代理

php.laoliu.pro

server {
    listen 80;
    server_name php.laoliu.pro;

    location / {
        proxy_pass http://php_laoliu;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }
}

www.laoliu.pro

server {
    listen 80;
    server_name www.laoliu.pro;

    location / {
        proxy_pass http://laoliu_pro;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }
}

PHP项目配置

apache配置文件

文件路径: /web/laoliu_pro/conf/000-default.conf

<VirtualHost *:80>
    ServerName laoliu.pro
    ServerAlias laoliu.pro
    DocumentRoot /var/www/html/public

    <Directory /var/www/html/public>
	    DirectoryIndex index.php index.html index.htm
        Options Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        allow from all
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

php.ini

文件路径: /web/laoliu_pro/conf/php.ini

如果需要修改运行内存, 上传设置, 超时时间等, 则需要补充/web/laoliu_pro/conf/php.ini文件. 若只是使用默认设置, 则可以在docker-compose.yaml中去掉php.ini的映射.

前端项目配置

文件路径: /web/laoliu_pro/conf/default.conf

server {
    listen 80 default;
    server_name laoliu.pro0;
    root /app;
    try_files $uri $uri/index.html /index.html;
    index index.html;
 
    location /assets/ {
        etag on;
    }
}

项目部署

PHP项目直接部署到/web/php_laoliu/html中即可. 记得修改数据库配置文件

前端项目直接部署到/web/laoliu_pro/html中即可

相关推荐
活宝小娜4 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点4 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow4 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js
刚刚好ā5 小时前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
沉默璇年7 小时前
react中useMemo的使用场景
前端·react.js·前端框架
会发光的猪。8 小时前
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
前端·javascript·vue.js
天下代码客8 小时前
【vue】vue中.sync修饰符如何使用--详细代码对比
前端·javascript·vue.js
红绿鲤鱼8 小时前
React-自定义Hook与逻辑共享
前端·react.js·前端框架
周全全8 小时前
Spring Boot + Vue 基于 RSA 的用户身份认证加密机制实现
java·vue.js·spring boot·安全·php
ZwaterZ9 小时前
vue el-table表格点击某行触发事件&&操作栏点击和row-click冲突问题
前端·vue.js·elementui·c#·vue