admin管理员组

文章数量:1530085

前言

转自我的博客文章https://blognas.hwb0307/linux/docker/604,内容更新仅在个人博客可见。欢迎关注!

如果有人问我:你觉得最重要的docker应用有些?

我的答案是:

  • ddns-go。非常好用的动态域名解析服务。家用NAS必备神器。
  • NPM。Nginx反向代理神器之一,自动管理nginx代理配置、Let’s Encrypt的ssl证书自动申请和续期。

当然,这里我不会说mysql/mariadb,因为它们往往不直接面对用户,我们很难感受到它们的存在,虽然它们在搭建docker应用的时候会经常出现。

本文主要解决如何安装和基本使用NPM/ddns-go。我之所以将两者合并讨论,是因为它们的组合可以很好地解决如何方便和安全地远程访问docker应用这个使用场景。

值得一说的是,如果你用的是VPS,有固定的公网ip,此时ddns-go不是必需的。你只需要去阿里云、cloudflare这样的域名托管商的后台一次性添加就行了!

当然,有些小伙伴可能都没怎么听说过这两个应用。除了之前测试用的Ward,这两个应用就是我们安装好Docker要首先安装的应用噢!

下面我们一起来看看吧 😆

测试环境

  • 操作系统: Linux openmediavault 5.4.174-2-pve #1 SMP PVE 5.4.174-2 (Thu, 10 Mar 2022 15:58:44 +0100) x86_64 GNU/Linux
  • Docker: Docker version 20.10.14, build a224086
  • docker-compose: Docker Compose version v2.4.1

准备工作

# 工作目录请按需修改喔
path_docker=/nas 

# 目录管理
sudo mkdir -p ${path_docker}/ddns-go/ ${path_docker}/npm
sudo chown -R user:group ${path_docker}/ddns-go/ ${path_docker}/npm # 你的用户(组)

# 提前拉取好镜像
docker pull jeessy/ddns-go:latesst
docker pull jc21/nginx-proxy-manager:latest

另外,你还需要在阿里云或者cloudflare进行域名托管,并且有至少1个域名。其它域名服务商应该也是类似的,我用是就是这两个,其它的不特别讨论。

DDNS-GO目前支持的DNS服务商有:Alidns(阿里云)、Dnspod(腾讯云)、Cloudflare、华为云和Callback。

NPM支持的服务商太多了,自己去看看吧,不再赘述。

NPM

Nginx proxy manager(NPM)是集Nginx设置和ssl证书申请的docker神器。

官方网站:https://nginxproxymanager/

目录管理

cd ${path_docker}/npm

配置yml文件

创建新文件docker-compose.yml并添加内容如下:

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '<NPM-后台端口>:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

你可以使用默认端口或者自定义。

一般地,对于VPS来说,80和443端口应该使用默认的。可以使用80和443端口也是玩VPS的优势之一呀!想想你每次访问互联网服务都要加个端口号,看着就很难受。你的家用NAS一般是你或者你的家人等少数人用,有一些端口号也无伤大雅。

可是,如果你要建一个个人博客,用非443端口不合适吧?看着就很不正式呢!

一般地,新买的个人云服务器可以默认;而家用宽带一般不放行443端口,而要改用其它端口。

另外,这个81端口是NPM的默认后台端口,这个你可以改一个自己喜欢的。我建议不要用默认的81端口,这样可以使NPM更加隐蔽。

服务管理

# 上线服务
docker-compose up -d

# 下线服务
docker-compose down

# 更新服务(我还没用过。更新的话建议先对旧服务进行备份,以防新旧版本有兼容问题。)
docker-compose pull
docker-compose up -d

不要忘了用ufw开放你选择的NPM-后台端口端口喔!还记得ufw怎么用吗?44380端口在之前的演示中应该已经开放过了。自己用sudo ufw status numbered查询一下。

访问:http://<ip>:<NPM-后台端口>进行NPM管理。

根据官网,它的默认帐户和密码是:

默认帐户:admin@example
默认密码:changeme

进入后台后,具体使用可以参考B站的咕咕鸽的演示:https://www.bilibili/video/BV1Gg411w7kQ。这里我也简单地介绍一下NPM的使用方式。

特别注意

**个人宽带的公网ip不开放80端口,所以在NPM中一般用DNS challege而不是HTTP challege的方式申请Let’s Encrypt SSL证书。**如果你使用的是DNS challege的方式,一般还要提供一些token信息,这个每个托管商都是不太一样的。你可以试一下,HTTP challege失败就换DNS challege。我在国内都可以成功申请到证书。

如果你用VPS的话,应该没有这个问题。这也是为什么推荐新手玩VPS嘛 😜

这里值得一说的是,**NPM是可以反向代理自己的!**你第一次访问NPM的时候,是用http://<ip>:<NPM-后台端口>的方式访问,这个时候你输入的帐户和密码都是明文传播的。你设置好NPM的自身反代后,要尽快用https://domain的方式来访问它,然后将用户名和密码修改一下。NPM是本地和外界沟通的桥梁,可不能有什么安全隐患!

使用方法

申请SSL证书

我喜欢统一申请好证书,然后在建立新的反代记录后添加申请好的证书。

在国内,由于家庭宽带的80端口是被封锁的,所以用http challenge申请ssl证书的方式很容易失败。NPM也提供了DNS challge的方式来申请Let’s Encrypt证书。这里也主要是讲述后者的方式。

帐户设置等初始化工作就不再赘述。自己摸索一下,不是很难。

在界面中点击SSL Certificates--Add SSL Certificate--Let's Encrypt

其它设置如下图。你可以申请一个二级域名的通用证书,或者专门为一个三级域名设置证书。下面我展示的是申请一个二级域名的通用证书。我这个人比较懒,申请一个证书给所有的三级域名用,比较简单一些,哈哈 😛 你要同时为两个域名申请*.hwb0307hwb0307,这样才可以正常使用喔:

个人的key和secret要注意保密。DNA provider可以选好多种,看你自己的情况。

save。等一会就好了。如果有报错的话,再多试几次,检查一下自己有没有写错信息。我在国内的网络环境中都可以成功申请证书。成功后如下图所示:

添加反向代理记录

添加一个记录:

这里以ddns-go为例。比如,ddns-go的反向代理设置如下。这个172.17.0.1是docker的默认主机ip地址,通过这个地址加上docker应用的ports即可访问具体的docker应用。当然用192.XXX之类的地址也是可以的,你都可以试试看。

值得一提的是,这里NPM和ddns-go都是在同一个局域网中,所以可以通过反代局域网地址加端口号成功实现。而且,你不需要在路由器中为ddns-go专门设置一个端口映射,这样在互联网使用的环境下,外部的应用只能通过NPM对ddns-go服务进行访问。由于这种访问是https加密的,因此具有较好的安全性。

点击save保存,就会有一条记录:

此时通过:https://exampledomain:<NPM-443端口>即可访问ddns-go。如果你用的是443端口,可以不加端口号,因为443是互联网中默认的https端口。

多数docker应用可以通过这样简单地设置即可以实现成功代理。不过,不是所有的docker服务都这么简单就可以设置好反代,它们还往往需要一些额外的Nginx基础才可以成功,比如Umami。具体情况具体分析。有机会再开一个专题来讨论NPM的nginx自定义配置吧。

ddns-go

ddns-go是一个动态域名解析神器,并提供漂亮的UI界面进行操作。简单好用的DDNS。支持阿里云DNS、腾讯云dnspod、Cloudflare、华为云 。官方镜像:https://registry.hub.docker/r/jeessy/ddns-go

温馨提示:使用VPS的小伙伴可以不安装这个ddns-go。每次有新的域名要解析,去域名托管商的后台进行操作即可。

ddns-go里,我们会展示一些Docker中相对特殊的用法:

  • PUID和PGID可通过在Shell中输入id进行查询。这个在Linux基础里已经学过了!当然你也可以用root来运行,我也觉得没什么问题。值得注意的是,不是所有的docker应用都有这两个参数。可能Dockerfile之类的方法可以指定,但我还没有尝试过。基于Docker系列 学习Docker之前中的讨论,你应该也知道一般情况下用root运行docker问题也不大的。
  • 我们用Shell命令行来安装ddns-go。其实Shell命令行是我最先接触的方法,对于一些比较简单的Docker应用,用它来安装也是毫无压力的。用docker-compose的方案也行,有兴趣的自己试试看吧!

我展示一下阿里云和cloudflare的使用。应该还是蛮简单的吧 😉

阿里云

# aliyun
mkdir -p ${path_docker}/ddns-go/aliyun
docker run -d \
    --restart=unless-stopped \
    --name ddns-go-aliyun \
    -e PUID=1000 \
    -e PGID=100 \
    -p <aliyun端口>:9876 \
    -v ${path_docker}/ddns-go/aliyun:/root \
    jeessy/ddns-go \
    -f 60 

访问http://<ip>:<aliyun端口>/进行aliyun的域名解析。

Cloudflare

# cloudflare
mkdir -p ${path_docker}/ddns-go/cloudflare
docker run -d \
    -e PUID=1000 \
    -e PGID=100 \
    --name ddns-go-cloudflare \
    --restart=unless-stopped \
    -p <cloudflare端口>:9876 \
    -v ${path_docker}/ddns-go/cloudflare:/root \
    jeessy/ddns-go \
    -f 60

访问http://<ip>:<cloudflare端口>/进行aliyun的域名解析。

ddns-go使用

NPM设置Nginx反代和ssl加密

在进行设置的时候,应该先用NPM进行反向代理和配置https加密。不然,你的所有信息都是明文传播,容易引发安全问题。强烈不推荐在http协议中使用ddns-go,因为它会传送你的DNS服务商的token,这意味着攻击者可以对你的帐号进行任何操作!

设置可以看上文的NPM的举例。

绑定DNS服务商

阿里云的是这样的:

Cloudflare的是这样的:

IPv4设置

用默认的参数,然后在Domains里写上要解析的域名。注意,你不需要专门去域名服务商后台添加记录。

其它配置

我喜欢设置用户名和密码,这样公网访问的时候会比较安全。

设置完成后,就点击页面左上方的Save。这里会自动解析域名。右侧可以看到日志,会有IPv4未改变,将等待 5 次后与DNS服务商进行比对你的IP XXX 没有变化, 域名XXX或者XXX解析成功之类的字样。

参考资料

  • https://nginxproxymanager/advanced-config/#docker-secrets
  • 申请通配符SSL证书,让批量添加网站更省力!
  • B站大佬的教学视频:https://www.bilibili/video/BV1Gg411w7kQ

转至我的个人博客:https://blognas.hwb0307
欢迎关注!

本文标签: 两大神器系列Dockernpm