最开始接触docker,是为了部署一个叫做ShareLaTeX的东西。因为啥都不懂,故跟着网上许多博客教程一通瞎操作,就把ShareLaTeX部署在了服务器的80端口上;后又用docker搭建了WordPress博客,部署在了2333端口。

刚开始用着倒还舒服,但强迫症日益发作,我心想,作为一个个人博客,怎么能部署在奇奇怪怪的2333端口呢,就老想着能不能把这俩容器的端口换一下。

说干就干,但个人当时对docker以及WordPress的运行机制也并非特别熟悉,因此在搬家路上踩了不少坑。

后来发现其实修改docker-compose.yml文件然后更新一下容器即可(前提是容器数据已单独挂载)

我上网搜索了一下,找到了两种方法,第一种方法简单粗暴,直接删除容器新建一个,并重新指定端口即可,但似乎docker容器被删除后,存在里面的数据就没了(当时还不了解docker容器的本地挂载),我也没有试过储存并转移已有容器的数据,万一玩崩了就不太好,因此我试了下看上去比较稳妥的方法二:修改容器配置文件,重启docker服务。

文中提到docker会将所有容器的配置信息存放在/var/lib/docker/containers/{container_hash_value}/hostconfig.json文件里,于是我一路cd带ls终于摸到了/var/lib/docker/containers目录下,再一个ls发现下面果然有一堆名字又臭又长的文件夹,似乎是一些hash值,可以用命令

sudo docker ps -a

查看容器对应的id,正是hash值的前几位,据此分别找到了ShareLaTeX容器和WordPress容器对应的文件夹,进入文件夹分别打开其中hostconfig.json,找到类似80,2333等数字(一看就是端口号),将其修改以后保存退出,(若要修改容器端口,则还需要去config.vi.json文件中进行修改)并重启docker。

# 重启docker
sudo systemctl restart docker

做完以上工作,待docker重启完毕,我重新打开网站,发现端口号还是没有改过来,再docker ps命令查看一下,发现容器的端口号仍然没有改变,hostconfig.json文件里刚被我改掉的端口号又变回去了。

刚开始以为自己忘了保存文件,但试了几次都还是老样子。我相当郁闷,但立马想到可能需要先把容器先停了。于是将ShareLaTeX和WordPress对应的容器全stop了,再按照前文的操作改了端口号,重启docker后,再把两个容器start起来,这回容器的端口终于成功交换,接下来就是处理一些琐碎的后事了,ShareLaTeX应该是没什么问题,打开看了一下能够正常使用,但直觉告诉我WordPress应该会炸。

于是我尝试访问网站的80端口,果然浏览器加载了一会,给我自动跳转到了2333端口,第一感觉是可能浏览器缓存了网址浏览记录,但在清空了缓存之后,仍然自动跳转到2333端口。简单查了一下这个情况后,我了解到首次安装WordPress时,网站首页的地址会被存入数据库wp-options表中option_name字段值为siteurlhome的2条记录下,且记录的字段为option_value,以后访问网站时以数据库首页地址为准,仅仅改变web服务器映射地址仍会跳转到数据库存储的首页地址。因此只需登入数据库进行修改。

现在访问80端口,已经可以正常进入主页了。但还有很多问题需要解决,这些问题与docker、WordPress都没有关系,大部分都是主题文件中或多或少出现了一些文件的绝对路径的问题,所以能不用绝对路径就不要用。

对文件一通遍历以后,我把所有的绝对路径都改成相对路径,这下感觉应该没有问题了。但一会又出来一个新的问题:

即之前网站里放的图片全加载失败,查看以后发现它们的src保留了原来的2333端口,没有自动进行修改,一通字符串替换就解决了这个问题。

目前看来WordPress已经成功搬家了,暂时还没有遇到其他的问题。