Docker容器一次更新多个动态域名

动态域名的地址更新要用到客户端,试过多种形式的客户端发现都不好用,总结起来,常用的客户端有以下几个:

1、Linux等系统下的脚本

2、某些系统自带的专有工具、插件等

3、桌面系统的应用程序

这些工具表现的问题主要j :

有的是一次只能更新一个域名,多个域名需要设置多个任务,或者有的工具仅内置了较少的几个DDNS服务商,自己的服务可能不在其中,或者要安装专门的程序,手动运行不方便,自动运行耗资源。特别是多数客户端没有配置的详细说明,设置好运行不起来,无法正常更新。

经过多次比较,采用Docker容器方式能较好地解决以上问题,几乎不需要太多额外的设置,容器以极低的资源消耗常驻后台运行,可以任意设置地址检查和更新时间间隔。

1、从DockerHub中下载镜像

2、创建一个配置文件,按文档说明填入域名更新的配置信息

每个镜像关于配置都有详细的说明和示例,只要认真阅读,非常容易就能正确配置好。

3、启动容器,映射以上配置文件,系统即自动运行,其他参数可以全部默认,如果有需要可以研究一下镜像的说明文档,按要求进行修改即可。

用CNAME记录解决多端口服务访问

我们可能需要部署多个服务,特别是在一些条件限制下,只能用域名后跟端口号来作为服务的入口,如果购买多个域名费用也不少,而且维护起来非常繁琐,其实比较好的是在二级域名下配置多个子域名,这样一个端口就可以接入多个服务,避免一堆端口,怎么也记不住。

子域名可以用A记录,也可以用CNAME记录。A记录指向IP地址,所以需要针对每个地址配置DDNS,这样要配置很多的动态解释,而且有些客户端很不好,不容易连接成功,有些甚至对一个DDNS服务商限制多个动态解释,如群晖。而CNAME是指向域名,只要被指向的域名不变,永远能保证CNAME记录解释到正确的IP,不用进行解释记录的动态更新。

这样利用已有的域名和反向代理,不做DDNS和泛解释,一次性使用多个三级域名代替原来的多端口连接,简单方便且稳定。

一、申请域名

注册域名服务商,申请购买二级域名,如 xxx.com

申请方法网络上很多,有些还比较便宜

二、注册域名解释服务商

在网络找一家比较靠谱的免费域名解释服务商,完成注册,并添加第一步注册的域名。查找到该服务商的域名解释服务器地址,并复制下来。

三、设置域名服务器

登录购买域名的服务商,在相关设置页面,设置Name Server为解释服务商的域名解释服务器地址,将xxx.com域名的解释服务指向域名解释服务商。

以上设置有一个生效时间,有的甚至需要24小时,可能需要等待。

四、在域名解释服务商设置CNAME记录

进入服务商的DNS设置页面,添加CNAME解释,域名如aa.xxx.com bb.xxx.com cc.xxx.com等。

Name填以上aa等,将Hostname填写为你已有的域名,TTL改为600秒,提交。

五、验证以上三级域名的解释

在任意浏览器输入以上aa.xxx.com:1234 bb.xxx.com:1234 cc.xxx.com:1234等地址,应该能正确访问并指向同一个服务。

六、为以上三级域名设置反向代理,将域名指向不同的服务

反向代理的设置需要修改服务器上的网络门户,网络上有大量的教程,通过设置以后,以相同的端口号访问以上不同的域名,将进入不同的服务。

七、为以上域名申请免费SSL证书

用以上域名直接访问,浏览器会提示不安全,因为此时用的是http访问,而浏览器认可的安全访问需要经过认证的https访问。

现在证书的申请可以用acme标准的客户端进行连接,并自动续期,客户端有各证书机构自己开发的,也有第三方开发,第三方客户端有的可以适应多个机构的申请。

1、准备一个linux环境,安装必要的依赖

apt install cron -y && apt install socat -y && apt-get install curl -y

2、下载并安装一个第三方客户端

curl https://get.acme.sh | sh

3、向环境变量中加入申请证书需要的ID和密码

export ID=””
export Secret=””

以上的ID和密码,是以API方式进行域名服务器的登录,用以上方式登录后才能在证书申请中获得DNS的认证,每个DNS解释服务商的ID和密码都不一样,可以在服务商的文档中找到或向客服咨询。

4、申请免费的SSL证书

~/.acme.sh/acme.sh –issue –dns dns_ali -d aa.xxx.com -d bb.xxx.com -d cc.xxx.com –server letsencrypt

–dns dns_ali表示域名解释服务商是阿里,每个服务商的简称不一样,可以在相关文档中查找。–server letsencrypt表示向letsencrypt申请免费的证书,该第三方客户端默认的是向ZeroSSL 申请证书,需要注册和收费。

运行成功后系统会提示证书和密钥存放位置,将两个文件复制并保存。

八、为反向代理使用证书

将证书和密钥导入系统,并为反向代理使用证书,再次在浏览器访问将不再提示安全问题。

参考文献

群晖反代服务器实现外网访问内网服务无需端口号

Let’sEncrypt 免费通配符/泛域名SSL证书添加使用教程

Chevereto图床Docker安装中要注意的问题

想用MarkDown写文章,插入图片不好解决,注册一个网络图床太麻烦,以后总是多一个帐号去维护,考虑自己在NAS中建立图床,先在网络上找了一下关于Docker条件下安装的方法,然后选择Chevereto进行安装配置,结果踩了一个大坑,浪费了半天时间。

为图方便按网络教程做好了images文件、.htaccess配置文件的映射,同时考虑以后直接在NAS修改docker中的内容,不用SSH,把整个/var/www/html中的app文件夹也映射出来了,启动容器运行,直接出现以下错误:

没有办法,再去网络上找答案,绝大多数人都说是apache2.conf文件的配置问题,按照方法做了多次修改根本没有用,只看到一遍文章讲到是该站点下缺少.htaccess文件,打开映射好的.htaccess配置文件,发现是空文件,照道理容器运行成功应该自动生成该文件,显然该文件出了问题,在网络上找了一个配置文件写入,错误成功克服,再次运行容器,另一个错误又来了。

网络上找不到类似问题,回过头看官方文档,发现文档中只有images卷的映射建议,因此把app的映射删除了,成功解决问题。

第二天为搞清问题的根源,仔细查看了网站下的各种php文件,并做了故障复现,虽然不会apache编程,但思路还是知道了大概,软件的作者不允许将app等文件及相关文件夹映射出来,有专门的检查语句,一旦查到问题会给出相应的错误提示,如将/var/www/html/整个文件夹映射出来的错误是:

经验教训:

1、尽量不要先入为主,遵从官方文档比较好

以前建各种应用的容器,基本都可以随便映射各种文件,但这次不行,作者专门设置了映射禁止,可能是为了保护站点下的文件完整性吧,防止意外错误。

2、网络上的教程要善于辨别不同的情况,少走弯路

以前的版本不知道,但新的1.3版肯定是不宜进行其他文件和文件夹的映射,按照官方文档建立容器,几分钟就可以完好运行,又说回第1 点了,后台查看.htaccess文件自动成功改写。因为一旦出现错误,解决起来是非常耗时耗力的。

另外,容器运行的日志显示有错误, AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 172.17.0.x. Set the ‘ServerName’ directiv ,服务器域名问题,内网使用,不用修复,错误可以在运行一段时间后自动消失。