Docker中使用Nginx代理多个应用站点的方法

2020-06-17 07:22:21易采站长站整理

 配置应用容器

同样使用 docker-compose 创建应用。

这是一个 php 项目,所以这个应用里至少需要 nginx 和 php-fpm 两个服务容器,项目目录结构如下:


baipiaoquan/
├── docker-compose.yml
├── log
│ └── nginx
│ └── error.log
├── nginx
│ ├── Dockerfile
│ ├── log
│ ├── nginx.conf
│ ├── sites
│ │ └── baipiaoquan.com.conf
│ ├── ssl
│ │ ├── baipiaoquan.com.key
│ │ ├── baipiaoquan.com.pem
│ └── startup.sh
└── php-fpm
├── Dockerfile
└── php.ini

docker-compose.yml


version: '3'

networks:
proxy:
external:
name: ${PROXY_NETWORK_NAME}
backend:
driver: ${NETWORKS_DRIVER}

services:
php-fpm:
build:
context: ./php-fpm
volumes:
- ./php-fpm/php.ini:/usr/local/etc/php/php.ini
- ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG}
networks:
- backend

nginx:
build:
context: ./nginx
args:
- PHP_UPSTREAM_CONTAINER=${NGINX_PHP_UPSTREAM_CONTAINER}
- PHP_UPSTREAM_PORT=${NGINX_PHP_UPSTREAM_PORT}
volumes:
- ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG}
- ./log:/var/log/nginx
- ./sites:/etc/nginx/sites-available
- ./ssl:/etc/nginx/ssl
container_name: ${COMPOSE_PROJECT_NAME}_nginx
depends_on:
- php-fpm
networks:
- proxy
- backend

为了方便调整,这里使用了环境变量。

注意 nginx 的容器名称 container_name: ${COMPOSE_PROJECT_NAME}_nginx,这个值很关键并且会在后续代理中用到。

.env


# 宿主机中代码的位置
APP_CODE_PATH_HOST=../

# 容器中代码的位置
APP_CODE_PATH_CONTAINER=/var/www

# 这个是抄的 laradock
APP_CODE_CONTAINER_FLAG=:cached

# 选择机器上的存储路径。适用于所有储存系统
DATA_PATH_HOST=~/.baipiaoquan/data

### Drivers ################################################

# All volumes driver
VOLUMES_DRIVER=local

# 网络驱动
NETWORKS_DRIVER=bridge

# 代理网络名称,这是前面创建的
PROXY_NETWORK_NAME=proxy-network

### Docker compose files ##################################
#
COMPOSE_FILE=docker-compose.yml

# Change the separator from : to ; on Windows
COMPOSE_PATH_SEPARATOR=:

# 项目名称
COMPOSE_PROJECT_NAME=baipiaoquan

使用的代理网络名称是:proxy-network,这是在前面创建的;
nginx 的容器名称会是:baipiaoquan_nginx。