前言
- 本系列最初的想法就是搭建一个多项目的环境, 包含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或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中即可