前言
代理的作用是什么?
– 多个域名解析到同一个服务器
– 方便一台服务器多个应用只对外开放一个端口
– 访问应用不需要带着烦人的端口,直接域名访问
– 应用隔离
– 降低耦合度
– …
总的来说就是方便维护,并且在维护一个应用的时候,不影响其他应用。
如何代理 (容器间如何通信)?
直接使用 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










