Docker 构建网站镜像坑点记录

如果大家使用 Docker 封装网站的话一定会遇到数据库 URL 网址写死的情况,比如著名的 WordPerss 就是如此,这样导致其他人使用你的镜像的时候体验很差,本文主要是针对这种现象的问题解答。

问题复现

下面是一个 Docker 部署的 WordPress,但是引用的 css 与 js 的地址是不存在的,这是因为在构建镜像的是数据库的 IP 信息是写死固定的:

如果对方网站是 WordPress 的话那么修改起来还算比较简单,如果是其他冷门的 CMS 的话,也有其他的修改方法。下面就来介绍一下国光的修改方法。

WordPress

WordPress 的话修改就比较简单,编辑根目录下的 wp-config.php 文件,添加以下代码:

$home = 'http://'.$_SERVER['HTTP_HOST'];
$siteurl = 'http://'.$_SERVER['HTTP_HOST'];
define('WP_HOME', $home);
define('WP_SITEURL', $siteurl);

这样 WordPress 就会动态地根据实际客户端请求的 URL 来动态调整资源情况了,这个时候再构建封装 Docker 镜像就不会出现上面那种问题了,另外这种方法也可以实现 WordPress 多域名绑定。

通用方法

场景分析

发现目标的网站里面出现了写死的 URL 了,这个 10.20.24.244 肯定是安装网站的时候固定写死在数据库中的:

验证数据库

接下来准备去数据库验证一下是否上面的猜想是否正确:

# 导出数据库
mysqldump -uroot -proot --databases bigtree >/user.sql

# 查询数据库是否还有特征字符串
grep -r "10.20.24.244" /user.sql

果然存在问题,那么下面是思路就是在 Docker 创建的时候将真实的 IP 替换掉原有的 IP

验证网站源码

出来数据库中可能写死之外,有些坑爹的 CMS 还可能将 URL 写死到网站的源码中,就比如国光这次用的这个案例就存在这个问题:

 grep -r "10.20.24.244" /var/www/html/

所以后面替换的时候还需要替换源码中的这些字符串。

查找 COMMAND

docker ps -a --no-trunc

这个 start.sh 为开机启动脚本,里面包含容器开启后要启动的命令,所以思路就是获取到用户传入的新的 IP 地址后然后将 sql 文件中的 IP 替换,接着再导入到数据库中。

传入 IP 值

使用 docker-compose 可以很方便地自定义变量值,这样在容器内部也可以获取到我们设置的变量信息,下面是国光写的一个简单的 docker-compose.yml:

version: '2'
services:
 web:
   image: bigtree:v2
   environment: 
    - SITE_HOST=localhost
   ports:
    - "9081:80"

这样在容器内部就存在 SITE_HOST 变量信息了,那么接下来尝试将 Docker 容器里面的 10.20.24.244 替换为 localhost 试试看。

替换 SQL 文件

使用 sed 命令可以批量查找并替换指定文件里的内容:

 # 查找并替换根目录下的 SQL 文件中的字符串
 sed -i 's/10.20.24.244/$SITE_HOST/g' /user.sql

 # 导入 SQL 文件
 mysql -uroot -proot < /user.sql

替换源码文件

sed -i "s/10.20.24.244/$SITE_HOST/g" `grep "10.20.24.244" -rl /var/www/html/`

修改 start.sh

最后根目录下的 start.sh 的内容如下:

#!/bin/bash
/etc/init.d/mysql restart
/etc/init.d/apache2 restart
/etc/init.d/exim4 start
sed -i 's/10.20.24.244/$SITE_HOST/g' /user.sql
mysql -uroot -proot < /user.sql
sed -i "s/10.20.24.244/$SITE_HOST/g" `grep "10.20.24.244" -rl /var/www/html/`
/usr/bin/tail -f /dev/null

验证操作是否成功

# 打包镜像
docker commit -a "国光" -m "bigtree" 03732a71a76a bigtree:v2

# 启动容器
docker-compose up -d

Bingo!成功,同理如果想要动态更换 Docker 容器端口的话也可以使用这样的思路。

保存离线镜像

既然测试成功的话,就将自己打包的镜像保存出来吧:

docker save -o bigtree.tar bigtree:v2

支持一下

总的来说这种情况是开发者的代码写的烂的问题,网站的源码中将 URL 写死或者数据库中将 URL 写死都是很不优雅的行为,受害者就是我们这些网站搭建者了。

另外如果本文对你有帮助的话,而且你又恰巧财力雄厚,可以考虑打赏一下本文,用以维持高昂的服务器运营费用(域名费用、服务器费用、CDN费用等)。

请随意打赏吧:

微信 支付宝

没想到文章加入打赏列表没几天 就有热心网友打赏了 于是国光我用 Bootstrap 重写了一个页面 用以感谢 支持我的朋友,详情请看 打赏列表 | 国光

对了点击下方的广告也可以表示心意哦,广告商说 0.3 元一个 IP 点击,虽然有点少,但是数量多的话,也还算不错的啦~


文章作者: 国光
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 国光 !
 上一篇
BurpSuite Pro 2020.9.2 For Windows BurpSuite Pro 2020.9.2 For Windows
国光之前一直使用但是 BurpSuite 2.1.6 后面由于需要高版本的 JAVA 了就没有再折腾下去,但是最近圈子里一直传着 2020.9.1 的版本,国光安装了一下,发现同时也封装好 JDK 了,这样可以再不动现在 JAVA 环境的
2020-10-12
下一篇 
为 Cobalt Strike exe 木马添加图标 为 Cobalt Strike exe 木马添加图标
Cobalt Strike 生成的 exe 木马的结构和普通的 exe 不太相同,Windows 下使用一些资源编译工具来给 exe 添加图标发现都不很顺利,所以本文就此诞生了。 失败经验尝试给 CS 生成的 exe 添加自定义图标发现
2020-10-10
  目录