(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中即可

相关推荐
摇滚侠12 小时前
Docker 如何查询挂载的目录
运维·docker·容器
用户66885998476614 小时前
Vue 3.0安装与使用
vue.js
空中海15 小时前
01 React Native 基础、核心组件与布局体系
javascript·react native·react.js
空中海15 小时前
05 React架构设计、项目实践与专家清单
前端·react.js·前端框架
江湖有缘17 小时前
基于Ubuntu系统Docker部署Note Mark:从安装到配置全流程
linux·ubuntu·docker
前端之虎陈随易17 小时前
2年没用Nodejs了,Bun很香
linux·前端·javascript·vue.js·typescript
空中海18 小时前
04 工程化、质量体系与 React 生态
前端·ubuntu·react.js
空中海18 小时前
03 性能、动画与 React Native 新架构
react native·react.js·架构
呆萌的代Ma18 小时前
docker内的n8n配置Code节点运行python代码
python·docker·容器
空中海19 小时前
02 React Native状态、导航、数据流与设备能力
javascript·react native·react.js