![Web代码安全漏洞深度剖析](https://wfqqreader-1252317822.image.myqcloud.com/cover/20/40868020/b_40868020.jpg)
1.3 在Linux下利用Docker搭建PHP环境
在Linux下使用Docker也是目前非常主流的一种方式,因为Docker使用起来较为轻巧,在Linux系统内运行也较其他操作系统稳定一些,Docker支持的功能也非常人性化。信息安全人员经常使用Docker做很多事情,如漏洞环境搭建、CTF题目测试等,在任意操作平台下搭建Docker,我们就可以下载和使用别人共享的或自己上传的镜像文件。下面介绍如何在Linux下利用Docker搭建PHP的环境。
1.3.1 在Linux下安装并启动Docker
Docker是一款开源的应用容器引擎,开发者可以打包自己的应用以及依赖包到一个可移植的容器中,可以将其任意部署在Docker平台上,也可以实现虚拟化。Docker的沙箱环境可以实现轻型隔离,多个容器间不会相互影响。Docker容器本身几乎没有什么性能开销,可以很容易地在机器和数据中心中运行。最重要的是,Docker不依赖于任何语言、框架和系统。
这里使用的Linux系统是CentOS 7 X64位,如果读者已安装Docker,可跳过此部分。
1.安装Docker
执行以下命令:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/006-i.jpg?sign=1739313752-AWfo30HTnKnOH1moPVkgIWjMzaOwmGYB-0-ba6ba5558dfd7ed179fba19dd97ec119)
2.运行Docker
尝试启动Docker,命令如下:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/007-i.jpg?sign=1739313752-Nv8JGR0tYwr9G5qb70tcZz5I1OMhDotb-0-f4c9475f55a77eaf3d560474b196e532)
如果在未启动Docker的情况下执行Docker命令,则会失败,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/007-2-i.jpg?sign=1739313752-XTfejkjWkgggnLBAYzZUDLi42bJQLWAn-0-9ae382f92b6458e091b11f2091345b11)
3.测试Docker
下载并运行一个hello-world环境:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/007-3-i.jpg?sign=1739313752-FPp7m8r35RO16qt7i5rRBGXT3Uv2GXOG-0-54381dfe544beb1476bc6f6aee2ce88e)
执行上面这条命令以后,运行Docker成功,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/007-4-i.jpg?sign=1739313752-gFXejT72OxUHtrBxFJDJHP3FUjZQhecW-0-fe1e9ae5c1654715c595557ad0212bac)
如果安装运行需要root权限,可以用su命令切换root,或者在每条命令前都加sudo。
1.3.2 在Docker下搭建PHP运行环境
首先需要搭建一个CentOS 6的环境来安装Apache+PHP+MySQL,并且将搭建Apache+PHP+MySQL的Docker容器打包,方便以后使用。请注意,这里是使用CentOS 7系统来运行Docker,但我们要在Docker里下载一个CentOS 6的系统作为支撑来搭建网站环境。
使用以下命令下载CentOS 6镜像的Docker容器。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/008-i.jpg?sign=1739313752-EN6GGf7opWdkPpbPxh6gd7SJzoWNvd8F-0-c601c0d88897a1e3085e2438624c9626)
1.启动CentOS 6容器
查看容器ID,命令如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/008-2-i.jpg?sign=1739313752-GR16Pfl3uhu3IzaM4XHyDR0QYq0fiRtC-0-9a22e16f06a90dbb9e7999005d389575)
执行以后可以查看容器的ID:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/008-3-i.jpg?sign=1739313752-jsFLAODLDZGKJWceKmwAligI6BzPoMMW-0-3b9131d10d6da5a394224aa617160cd5)
运行Docker,命令如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/008-4-i.jpg?sign=1739313752-1cIpo1S7pTso68xtK2k5e7Jv6L0QlMIG-0-0437e9fb4fce34f81c85e5f407089e40)
命令说明如下。
●Docker run:创建一个新的容器。
●-it:终端模式运行容器。
●-p 8888:80:将容器中的80端口映射到主机的8888端口。
●b5e5ffb5cdea:镜像ID。
●/bin/bash:镜像运行之后要执行的程序。
2.安装MySQL
安装MySQL数据库的命令如下所示。
●yum install mysql:安装MySQL。
●yum install mysql-server:安装MySQL服务器。
●chkconfig mysqld on:设置开机启动。
●service mysqld start:启动MySQL服务。
●mysql_secure_installation:初始化MySQL的配置。
3.安装Apache
安装Apache中间件的命令如下所示。
●yum install httpd:安装Apache。
●chkconfig httpd on:设置开机启动。
●service httpd start:启动Apache服务。
在浏览器中访问http://127.0.0.1:8888就可以看到如图1-6所示的Apache默认页面。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-6.jpg?sign=1739313752-BjNzcC1yt6eqSNZMuGtRRx7CcIfg54zN-0-0ac8d6c42cc3258b001b609d4eb29640)
图1-6 Apache默认页面
4.安装PHP
安装PHP的命令如下所示。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/009-i.jpg?sign=1739313752-wEzW3DTx4IhShwt2QuC67fniVB2lNjnP-0-ad22889dc18362cda5864ea3d0165381)
在/var/www/html目录下新建一个phpinfo.php文件,并且访问,命令如下:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/009-2-i.jpg?sign=1739313752-qPkYPzyocLscn96496zjVpbg5mwomcqo-0-c3ed5cdf4639a69d9f91d9eecc65e1eb)
文件内容如下:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/009-3-i.jpg?sign=1739313752-1F5llOhzi76PxfIMC0roPd8vyz5OyGXg-0-29a48515f7582125ec60bed26ee8a970)
如果不解析PHP文件,那么重启Apache即可。命令如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/009-4-i.jpg?sign=1739313752-w9c7d6eCgUmO6W6VQljlifV7Lq62IAWL-0-bb7e58a45c0f4e0e8d5fa4f13df5775c)
执行以后,打开浏览器,并在浏览器中访问到该文件的位置,如图1-7所示,说明PHP成功解析。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-7.jpg?sign=1739313752-8xAx3K7ys6ncIDZj8i1PjdJyMgj9Z9K9-0-c6182e51278bf65546c1fbc7f4fff645)
图1-7 PHP成功解析
5.安装程序
将下载好的CMS文件解压到本地,用docker cp命令复制进去,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/010-i.jpg?sign=1739313752-h9MBGI1lJ4QTglnEC9tnFvlRUGD0Hqp1-0-feda00173e3255aa0d34805fc5bf8478)
在上面代码的第二条指令中,笔者使用了中文方式让读者更清晰地理解该命令的使用方法。
执行docker ps命令,所显示的NAMES项对应的值就是容器名,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/010-2-i.jpg?sign=1739313752-ixCkdWpDefBJxXLKWcTcKC8IKchdYXec-0-77231580852e66fb6c66bea1f483843b)
在浏览器中填入搭建好的容器访问地址(http://127.0.0.1:8888),安装AppCMS网站程序。
如果文件不可写入,可在容器里执行命令chmod -R 777 /var/www/html,添加html目录下全部文件的可写和可读权限。修改好以后打开浏览器访问AppCMS所在的根目录处,会默认出现如图1-8所示的AppCMS安装完成界面。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-8.jpg?sign=1739313752-JRnnEp8vja45qnyEj8RYuNlNAX6bOl6Q-0-a2ba38db076c7228c36ef8f6c0692b7a)
图1-8 AppCMS安装完成界面
1.3.3 上传镜像至Docker Hub
依次使用Ctrl+P和Ctrl+Q快捷键退出容器并保持容器运行来挂起镜像(如没有此操作,关闭Docker后镜像会默认恢复到之前刚下载的场景和内容。也可以新开终端,跳过这步看下面的docker commit命令的执行),命令如下所示。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-i.jpg?sign=1739313752-9yOItYrA8RfPrJj4SEsc34tHTyMQjePx-0-0e898283cd82010f31c62f23a38065ca)
查看NAMES,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-2-i.jpg?sign=1739313752-64suLjCXa1NYGbKJYiXpkXsWzRzr7UOf-0-18b141abcfc6da37a6f1681c2e48f5d5)
恢复运行,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-3-i.jpg?sign=1739313752-yzYj1hNzUkTwu4MaeRltnKd0uwkAc21j-0-a32db89fe05d3f0b285ec775db44b900)
执行docker ps命令查看CONTAINER ID,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-4-i.jpg?sign=1739313752-rgBD0Y2JkG65cRN6EnO8JhlCsaXae8GZ-0-2dd04a1ce530584efff430f486bbcf56)
执行docker commit命令,保存刚才创建好的CONTAINER ID(e72189678c20),同时创建并保存与其配套的知识库(test1),如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-5-i.jpg?sign=1739313752-gckXpCT8AkpgfEi3ow6ZiE5PI95WBaEB-0-448aba6d3a3095288a22472ce745944b)
执行好以后提交新镜像所需要的程序命令docker images,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/012-i.jpg?sign=1739313752-4qviLqq2VCTPZm5ehFrdFCEgZzXCAJRV-0-e556afcfc1024e24db903dd58034e0f7)
将保存的镜像上传到Docker Hub上,可以直接用docker pull命令下载。
首先,注册并且登录Docker Hub。选择Create→Create→Repository(创建知识库),任意命名,如图1-9所示。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-9.jpg?sign=1739313752-JErKfVt35qUmmZ5AlBsZM32D6r7gjFLL-0-f519f3e0a2af519ebd07d78951166dc7)
图1-9 创建知识库
然后用终端登录Docker Hub,命令如下:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/012-2-i.jpg?sign=1739313752-gUebzfYaXZnoZQt9QTPYk8abXnuvqxxT-0-9e1d266ee262446ff30dcce6e0b1520e)
填入账号密码,出现Login Succeeded表示登录成功,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/012-3-i.jpg?sign=1739313752-Ajus05pbifZsvoWwOQGy35AAYow55dE4-0-c769eecddd49427c1e97c29521f9d8a3)
使用Docker push命令上传镜像:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-i.jpg?sign=1739313752-Y2evwJHaeQrrQRiphc10oh8sWaqy1U0F-0-86b3775414895397e9bcda4ab72f786d)
执行以后,上传中途报错:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-2-i.jpg?sign=1739313752-ahXzW7E9c9dv05J1IrZXWa3q2HrjQqGS-0-bfbfbf6d636ac49c3fe21a9a13e0d060)
如出现以上错误,解决方案如下。
1)更新用户仓库名信息。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-3-i.jpg?sign=1739313752-oi1G4uXfuvOUHXgBTTW1ExlMYiaBf0es-0-502bed7be530e4092762010910aea3b6)
其中,anyingtest是Docker Hub平台的账号,test1是创建的Docker仓库名。
2)重启Docker,在终端登录Docker Hub。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-4-i.jpg?sign=1739313752-MwFXH9hVf0d8F9Wo3lGxKNSFA5zT3hq5-0-0d3797964632e4c3b31960ddfa320119)
成功上传后出现如下所示的digest信息,说明容器上传成功。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-5-i.jpg?sign=1739313752-kvzRzyqBtmobWrS9IzF13itteHiLVKJh-0-dd53db51e339ce02f5d11e94fb919bba)
登录Docker Hub可以查看刚才上传的Docker镜像,如图1-10所示。镜像简要信息如图1-11所示。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-10.jpg?sign=1739313752-gWOYiJJLX0SHUdwgNYSBO28v7scT2Fbf-0-7915e6758e5133340be95620d010a40c)
图1-10 登录Docker Hub查看镜像
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-11.jpg?sign=1739313752-fD0hOk278JC0S6SrhUVYJIU1ri8PmYaa-0-69d725e91d94882ea44ff847f7ae9797)
图1-11 镜像简要信息
使用docker pull命令查看我们上传的镜像环境是否能正常下载:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/014-i.jpg?sign=1739313752-JsHrst0GTSADXEjXEvYy0ieXycwGznZK-0-5833496c80da1f86583ad44b97d4a48e)
执行好以后,正常下载的效果如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/014-2-i.jpg?sign=1739313752-rfibnWrp6q5qKBX2vFiHalbeHE8RLW3A-0-5f29b4c34b4ea772d2a8f80a9613467f)