在宝塔面板Docker利用AllinSSL部署证书过程中,按照网络常见教程进行设置却出现了“证书部署失败: 请求BT失败: Post "http://127.0.0.1:X//site?action=SetSSL": dial tcp 127.0.0.1:X: connect: connection refused(X为宝塔面板的端口号)”的错误,感到十分奇怪,因此进行了分析与解决

一、问题分析
从日志及报错中可以看出,问题出现在SSL申请和部署的最后一步,即证书无法顺利地上传到宝塔面板的对应网站中,同时原因也很清楚:无法连接到服务器的宝塔面板上。这就很奇怪了,明明宝塔面板和Docker中的AllinSSL服务妥妥地在一台服务器上,甚至可以直接内网,怎么就无法访问了呢?
经过网络的查找和研究,发现在Docker中,“127.0.0.1”的这一地址的指向已经发生了改变,原来,docker是一个虚拟环境,127.0.0.1和localhost指的是虚拟环境内部,而不是外部宿主机,所以无法这样访问。用简单粗俗的语言来理解,云服务器是一台物理服务器单独划出来的一部分,127.0.0.1在云服务器中是指它自己,而Docker中的一个个容器又相当于把一台云服务器单独划出来了一部分,此时127.0.0.1在Docker中指向了Docker本身,而不再是云服务器,也就是作用的范围缩小了,所以在AllinSSL中,是无法通过“127.0.0.1”这一地址访问到Docker之外的宝塔面板的。
二、解决方案
其实解决方案很简单,也就是创建并利用桥接网络。在创建Docker容器的时候,其实已经自动创建好了这个网络。具体操作步骤如下:
(一)宝塔面板设置
①点击左侧栏中的“Docker”,在右侧依次点击“总览”-“你创建的allinssl容器”-“容器状态”,记住界面中IP的值,这个IP也就是宝塔面板能够获取的AllinSSL容器的IP。

②点击左侧栏中的“面板设置”,在右侧勾选启用“API接口”

③在弹出来的窗口中,复制“接口密钥”的值,在“IP白名单”右侧的框中输入刚刚找到的IP(也就是容器的IP),然后点击“保存”

(二)AllinSSL服务设置
①点击左侧栏中的“授权API管理”,然后点击右侧的“添加授权API”

②添加宝塔面板,填写完成后点击确认(参考下面的数据):
名称:自己随便起个
类型:宝塔面板
宝塔面板-URL:http://172.17.0.1:宝塔面板端口号/(注意:这里与非Docker的部署不同,不能填172.0.0.1!如果数据不太一样以服务器Docker容器上的信息为准)
API密钥:填写刚刚从宝塔面板中复制的密钥

③再按照上面的方法操作后,错误已经解决
Comments NOTHING