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

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

 前言

代理的作用是什么?
– 多个域名解析到同一个服务器

– 方便一台服务器多个应用只对外开放一个端口

– 访问应用不需要带着烦人的端口,直接域名访问

– 应用隔离

– 降低耦合度

– …

总的来说就是方便维护,并且在维护一个应用的时候,不影响其他应用。

如何代理 (容器间如何通信)?

直接使用 nginx 的代理功能即可 (相关能力另行查阅),这里麻烦的就是 docker 容器间的通信。

Docker 容器间通信的主要方式有以下 4 种:

– 通过容器 IP 访问:容器重启后,IP 会发生变化。

– 通过宿主机的 ip:port 的方式访问:如果宿主机 IP 改变,就得每个应用都得改一遍,并且还要绑定端口,麻烦。

– 通过 link 建立链接:相互依赖的太紧,不利于维护。

– 自定义 network: 在同一个桥接网络中的容器可以相互访问。

很明显,会选择 自定义 network 的方式,让相关应用链接到同一个网络,这样应用与应用、代理与被代理之间其实就没什么依赖,不仅维护方便,而且迁移也方便。配置也不麻烦,只需要将常规的 IP 或域名换成相应的容器名即可。

一、统一网络

那么,首先需要创建一个共用的桥接网络:


docker network create proxy-network

# 查看
docker network ls

 二、代理服务容器

创建一个专门用来代理的 nginx 服务容器,取名:proxy-nginx,这里使用 docker-compose 构建,其目录结构最终如下:


proxy-nginx
├── docker-compose.yml
├── logs # 日志
│ └── error.log
├── nginx
│ ├── Dockerfile
│ ├── nginx.conf
│ └── startup.sh
├── sites # 被代理站点配置
│ ├── baipiaoquan.com.conf
│ └── chaohuahui.com.conf
└── ssl # 证书文件
└── baipiaoquan.com.pem

有些文件是在后续的运行过程产生的,配置时,只需要把必要的文件和目录创建好就行。

 docker-compose.yml


version: "3"

networks:
default:
external:
name: proxy-network

services:
nginx:
build:
context: ./nginx
volumes:
- ./logs:/var/log/nginx
- ./sites:/etc/nginx/sites-available
- ./ssl:/etc/nginx/ssl
ports:
- "80:80"
- "443:443"

把对外的 80、443 的端口绑定到代理服务器,所有的应用都可以从这里进来。

 Dockerfile