根据实际使用发现,Office 的 Docker 容器每次重启后,都会丢失 hosts 文件的内容,这一点有些棘手。
先前的 Office 文档里面说过,这个服务器有个很奇怪的问题,那就是自己无法用公网 ip 访问到自己。由于我们不能为了 office 这一个功能而改变 Seafile 里面的 URL 配置,因此我们必须通过某种方法,直接把域名解析为内网地址,或者干脆就是主机地址。
一开始确实通过修改 hosts 文件解决了问题,但是发现重启容器以后会丢失 hosts 修改,这就有些麻烦了,我们在这里把解决方法记录一下,方便以后可以直接部署。
步骤1 获取 docker 主机的 ip 地址
这一步我们参考了一些资料:https://cloud.tencent.com/developer/ask/109551
在Linux上本机运行Docker时,可以使用docker0接口的IP地址访问主机服务。从容器内部,这将是您的默认路线。
例如,在我的系统上:
$ ip addr show docker0
7: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::f4d2:49ff:fedd:28a0/64 scope link
valid_lft forever preferred_lft forever
在容器内部:
# ip route show
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 src 172.17.0.4
使用简单的shell脚本来提取这个IP地址是相当容易的:
#!/bin/sh
hostip=$(ip route show | awk '/default/ {print $3}')
echo $hostip
您可能需要修改iptables主机上的规则以允许来自Docker容器的连接。像这样的事情会做的伎俩:
# iptables -A INPUT -i docker0 -j ACCEPT
这将允许从Docker容器访问主机上的任何端口。注意:
iptables规则是有序的,这个规则可能会也可能不会做正确的事情,这取决于其他规则。
您将只能访问以下主机服务:(a)监听INADDR_ANY(又名0.0.0.0)或明确监听docker0接口。
总之,这样可以获取到主机的访问 ip 地址。
步骤2 开机自动修改 hosts 文件
hosts 文件是即时生效的,那么我们可以通过一个开机脚本来直接修改 hosts 文件。不过这一步感觉好难,这个 office 容器不是使用 systemctl 管理开机服务的,导致所有网上查到的开机脚本全部无法使用。。。最后用了一个很不优雅的方式:直接将 echo 语句放在 nginx 的启动脚本里,这样应该就没问题了。。。
hostip="$(ip route show | awk '/default/ {print $3}') <HOST TO REDIRECT>" >> /etc/hosts
被编辑的文件地址:/etc/init.d/nginx
虽然知道这样很不优雅而且可能出现其他问题,但这是我目前能想到的最好办法了。如果哪位大佬有其他建议的话,欢迎指出,感谢!
然后重启 docker 容器,就好了。
关于遇到的一些其他问题
Q:为什么不将动作注册为系统脚本?
A:我尝试过了,但是 OnlyOffice 容器很奇怪,报告这样的错误:
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
而网上说的各种启动脚本位置没一个能用的,如果有大佬知道的话,麻烦给指条明路,谢谢!
Q:为什么不直接把 OnlyOffice 部署在外面,而是要用 Docker 呢?
A:这里我必须吐槽 OnlyOffice,这玩意外部部署脚本直接删除了我的生产数据库程序 MariaDB,还删除了一堆必须的系统环境组件,可以说我花 10 秒打上去的命令直接让我多忙活 2 小时去恢复环境,脚本的这些行为既没有对它要进行的操作进行任何确认,也没有在文档中得到任何体现,而且后面删除它还一直 dpkg 报错,真的很烦。再也不在生产服务器上瞎搞了,5555555