Feb 27, 2021教程1429 words in 10 min


Nginx Proxy Manager——小而美的多容器转发方案

距离上次把博客改用 docker 部署已经过去快半年了,旧的服务器性能有点过剩( 续不起了 ),所以另购置了台新的云主机,考虑到备案迁移的问题,我还是选择了同一家供应商,免除了再次申请备案信息更改的麻烦。

我之前的主机上跑了三个容器,一个是 Nginx 用来部署博客,然后一个 Trilium 云笔记本再加上一个 Minecraft 服务器。解析的域名都是同一个,分别用不同的端口访问。这真是一点不🆒。

那么有没有办法通过二级域名分别访问指定端口的容器呢?如果还能一键部署 SSL 就更妙了。那么就要请出本篇的主角:Nginx Proxy Manager

Nginx Proxy Manager 实际上就是一个带前端管理界面的 Nginx 服务器,通过Let’s encrypt 来自动申请 SLL 证书并自动部署,反向代理你所需要的容器,甚至是任何目的地,让一个不懂 Nginx 的小白也能轻松配置。

本篇文章就来简单介绍一下在 Cent 8.3 下如何部署。

1. 配置环境

1.1 安装 docker

1
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
1
sudo dnf install docker-ce --nobest

配置自动启动

1
sudo systemctl enable --now docker

1.2 安装 docker-compose

下载 Docker Compose

1
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

修改文件的权限

1
sudo chmod +x /usr/local/bin/docker-compose

1.3 更改镜像源

内地访问 Docker Hub 的速度慢得可怕,所以我建议可以选择用国内的镜像源替代。如果你用的是阿里的服务,那么可以在控制台申请一个 docker 加速的网址,替换到文件里即可。下面的代码中用的是网易和百度的源。

1
2
3
4
5
6
7
8
9
10
11
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2. 编写 Docker Compose.xml

先在任意位置创建一个文件夹,然后创建 docker-compose.yml 文件,用于部署容器。

1
2
3
4
cd /home/
mkdir myapp
cd myapp
vim docker-compose.yml

在 vim 中 :i 把写好的文配置直接粘贴进去,esc 退出插入模式,:w 保存文件然后运行 :q 退出编辑器。

下面是我的配置文件。

docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
version: "3.7"
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: always
ports:
# Public HTTP Port:
- '80:80'
# Public HTTPS Port:
- '443:443'
# Admin Web Port:
- '81:81'
environment:
DB_SQLITE_FILE: "/data/database.sqlite"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
nginx:
image: 'nginx'
restart: always
ports:
- '4007:80'
volumes:
- /home/hexoBlog:/usr/share/nginx/html
note:
image: 'zadam/trilium:latest'
restart: always
ports:
- '4005:8080'
volumes:
- /home/trilium-data:/root/trilium-data
mc:
image: 'itzg/minecraft-server'
restart: always
environment:
EULA: 'TRUE'
ENABLE_AUTOPAUSE: 'TRUE'
MODE: 'survival'
LEVEL: 'AfterWorld'
ports:
- '4008:25565'
volumes:
- /home/minecraft:/data


在文件夹下继续运行 docker-compose up -d 即可部署。

部署完毕后,你就可以通过 docker container ls 查看容器的运行情况。

到这里,工作已经运行大半,接下来我们就要配置域名解析和转发。

3. 配置域名

首先你需要去服务器安全组配置中,把 81 端口开放。然后转到你的域名提供商控制台,把需要解析的域名全部指向你的服务器 IP。然后通过域名或者 IP:81 在浏览器直接登陆 Nginx Proxy Manager 的前端界面。

注意,默认的登陆邮箱和密码是:

1
2
admin@example.com
changeme

登陆成功后,系统会要求你修改新的密码。完成后,就可以开始配置了。

点击 New Proxy Host 创建一个代理规则,在 Domin Names 中填写一个或多个你想要用来访问该容器的域名。

如果你没有特殊配置 https ,这里使用默认的 http 第二栏的 Forward Hostname / IP 处,填写容器所在 Docker 网桥的虚拟 IP,这个 IP 可以通过下面的命令查到。

1
docker network inspect bridge

在结果中,找到 IPAM-Config-Gateway 节点,后面的 IP 就是我们所需要的。

如果你在 docker-compose.yml 自定义了一个网桥,那么请用你自定义的网桥名称替换掉上面命令中的 bridge 参数。

而端口,则是你最开始配置中对应容器暴漏在外面的端口。

如果你不需要为网站配置 SSL 的话到这里,点击 Save 就可以了。否则,请点击 SSL 选项卡,证书一栏选择申请一个新的 SSL 证书,填写邮件地址,同意协议即可。如果需要强制 https 访问,请打开 Force SSL 选项。最后点 Save 就可以了。

其余的容器的配置也都是一样的。

最后,你可能注意到了,这个前端页面并不安全,我们需要给他自己也套个代理(套娃警告)。

配置同刚刚的例子差不多,端口号改为 81 即可。

用域名测试,能够正常访问的话,就可以在安全组关掉 81 端口的访问了。

到这里就大功告成咯~

完整的文档你可以在 Nginx Proxy Manager 的官网找到,另外还有一个 Youtube 博主做的视频,希望能对你有所帮助。


参考

[1] 写代码的厨师, 2020.Docker Compose的安装和使用.CSDN
[2] 雪梦科技, 2020.如何在 RHEL 8 / CentOS 8上安装 Docker CE.腾讯云社区

  • Author:

    白桦

  • Copyright:

    Attribution-NonCommercial-NoDerivatives 4.0 International(CC BY-NC-ND 4.0)

  • Updated:

    February 28, 2021

Buy me snacks 🍩.