(2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
前言
- 本系列最初的想法就是搭建一个多项目的环境, 包含nginx, nodejs, php, html, redis, MongoDB, mysql.
- 本文使用的PHP镜像为php:7.3.6-apache, 这里可以使用上一篇文章中生成好的镜像.
- LAMP或包含react或vue的前端项目, 本文就各写了一个, 可以按照实际需求, 自行添加多个容器, 但要保证一个容器启动一个项目.
项目规划
- 服务器环境为centos, 所有的项目均放置在/web目录.
- 使用nginx反向代理各项目, 并提供域名解析. 目录为/web/nginx
- react或vue的前端项目, 目录为/web/laoliu_pro
- php(LAMP)项目, 目录为/web/php_laoliu
- mysql, 目录为/web/mysql
- redis, 目录为/web/redis
- 部署两个域名, 分别是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或8image: mysql:5.7environment:# 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:6379hostname: redis# 在容器启动后执行的命令command: redis-server /etc/redis/redis.conf
Dockerfile说明(可选, 没有额外的要求可以直接使用php:7.3.6-apache镜像)
# 这里使用的是php:7.3.6-apache镜像
FROM php:7.3.6-apacheADD --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.proServerAlias laoliu.proDocumentRoot /var/www/html/public<Directory /var/www/html/public>DirectoryIndex index.php index.html index.htmOptions Indexes FollowSymLinksAllowOverride AllOrder allow,denyallow from allRequire all granted</Directory>ErrorLog ${APACHE_LOG_DIR}/error.logCustomLog ${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中即可