![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=1738860993-iQ33sAOoGMGMOSdptkI8L50HPr7LqtEG-0-451445340143e97ba236d18664b332de)
2.运行Docker
尝试启动Docker,命令如下:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/007-i.jpg?sign=1738860993-fM0WTfsM6BNxXcEtM21w6b2MT0oOtp5v-0-5365f798bfe9425038269fa31822e209)
如果在未启动Docker的情况下执行Docker命令,则会失败,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/007-2-i.jpg?sign=1738860993-HzPNOSvaZnekZgBRTkEdkPMTe7Dbm1NB-0-0b26b52c8edadf59f9416eed5984723b)
3.测试Docker
下载并运行一个hello-world环境:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/007-3-i.jpg?sign=1738860993-vvaKUn7ds8AjTmnm39CrQZyOoCyKK32x-0-86197fdbfd6d92b651bddaa143be852a)
执行上面这条命令以后,运行Docker成功,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/007-4-i.jpg?sign=1738860993-WdKWO2oot8i7wIYsezJ7oGicqvwB7f1T-0-f0b61cbcc29dfcf8fc475c8398ab8295)
如果安装运行需要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=1738860993-c1kw2xx4FXpXm7WtTZ7RKFJ0YCDCWqfk-0-ec1dbed95efdac815af8752b8932ff21)
1.启动CentOS 6容器
查看容器ID,命令如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/008-2-i.jpg?sign=1738860993-VQnfhscRzHIAehSVSNViTo5HtfCuufuz-0-f3c748050ad568882919131bcd2db88d)
执行以后可以查看容器的ID:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/008-3-i.jpg?sign=1738860993-EfbkVqcucgdGImdfCMfXpR4RTctvPlox-0-d3e718f610c7195837d57535ba9e05ce)
运行Docker,命令如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/008-4-i.jpg?sign=1738860993-mRi7UEfo2D4vfIMuZ0KlHsKFcnhvLsO1-0-97781d2c3bbba318666d852c821b9fa2)
命令说明如下。
●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=1738860993-IWUOuhWIA33LXRo4R4v2q8uZyNVSOfp8-0-577243d449239103ba43f4c9493a3b21)
图1-6 Apache默认页面
4.安装PHP
安装PHP的命令如下所示。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/009-i.jpg?sign=1738860993-F00TbKXpzUJHLZmWugG92WwQuBY5Xr1R-0-330fcb6b893125d56ac0c70884138c75)
在/var/www/html目录下新建一个phpinfo.php文件,并且访问,命令如下:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/009-2-i.jpg?sign=1738860993-kN4PEtVL8BId4zlMuLdVjlxFkwTveT17-0-cffc9f4be559d3c685bc174c260014fb)
文件内容如下:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/009-3-i.jpg?sign=1738860993-OjsJnIfBk4ncC3sAaJBCGkEHUAp0YWND-0-21a55fec8652dbc2a0fc97a7076e08bc)
如果不解析PHP文件,那么重启Apache即可。命令如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/009-4-i.jpg?sign=1738860993-zqO5fiL9gbsQ2O2UiZdvH7u0Rz3kad1g-0-6c922620f65bf02ad28c2f1bd9508a20)
执行以后,打开浏览器,并在浏览器中访问到该文件的位置,如图1-7所示,说明PHP成功解析。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-7.jpg?sign=1738860993-G0ruWFIma3mPe1N2Bp2fZcY7M9xqXJoV-0-5d669a15dd0de3e02ef7d5ab2f177a35)
图1-7 PHP成功解析
5.安装程序
将下载好的CMS文件解压到本地,用docker cp命令复制进去,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/010-i.jpg?sign=1738860993-6l17MIGMj9eSmNW5A4t0PpIvjFyUroP7-0-9aae70c4eff7fa8b8d6675d805abd23c)
在上面代码的第二条指令中,笔者使用了中文方式让读者更清晰地理解该命令的使用方法。
执行docker ps命令,所显示的NAMES项对应的值就是容器名,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/010-2-i.jpg?sign=1738860993-hUQuURyHMZAzuBD3XkPJMNoKl1RPVAUv-0-3278d57eda8fa71d7c06a3e9283d5df1)
在浏览器中填入搭建好的容器访问地址(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=1738860993-T27LAa6Ji3bfjmHCGgn083sGlO9vuzwE-0-ebb658b36cb083d2450675be613c367c)
图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=1738860993-YWiqtI1SIVAaumrFIGZbn9QiX82bsRsh-0-41a1332796aa3773928c11e4255adf9d)
查看NAMES,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-2-i.jpg?sign=1738860993-9hC4XlsQVo89pxZNEzdJsxtq3EnpSjE1-0-3375139bdcc86d562150b525171f0165)
恢复运行,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-3-i.jpg?sign=1738860993-pFAWrqfgEwgnQwvyFEPNDILHFMTUzLm6-0-3a98a056e2283450c713ceec49c80689)
执行docker ps命令查看CONTAINER ID,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-4-i.jpg?sign=1738860993-tuU7ROyfDCB9yjEbKXoIcWbF7GuyZdB4-0-fe3fbc4af8bffaab2987cf23f8433da4)
执行docker commit命令,保存刚才创建好的CONTAINER ID(e72189678c20),同时创建并保存与其配套的知识库(test1),如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-5-i.jpg?sign=1738860993-qV2Xt7sALoVbS1OisrQRS5sQJfRElDAV-0-c51cb25636e323ad08586dbf90575ddf)
执行好以后提交新镜像所需要的程序命令docker images,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/012-i.jpg?sign=1738860993-6T4EpbDY2TtU1GYfCl9EgwDMK4RoKA2K-0-1c8b9ff4659e680a91259150e75a7fa3)
将保存的镜像上传到Docker Hub上,可以直接用docker pull命令下载。
首先,注册并且登录Docker Hub。选择Create→Create→Repository(创建知识库),任意命名,如图1-9所示。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-9.jpg?sign=1738860993-26lhNeFMw12gH89DAWFpW3pwDLic67c5-0-ac50ecaa9596434becd86692fc425d74)
图1-9 创建知识库
然后用终端登录Docker Hub,命令如下:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/012-2-i.jpg?sign=1738860993-v6BLdeVKUK1OKqcuqST5tblExgOY9UHF-0-1cbef95eeb6f6c5cf7c921149f19b662)
填入账号密码,出现Login Succeeded表示登录成功,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/012-3-i.jpg?sign=1738860993-rVHWFqhfZnhNyndINe5ujBDqhefiAbXi-0-b72ce52549b3d13abefc7285eb09b455)
使用Docker push命令上传镜像:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-i.jpg?sign=1738860993-nMm6R9QMz31WarHMCE73SL0H72FvxdwO-0-677073076511d2278946dc8a87a463a1)
执行以后,上传中途报错:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-2-i.jpg?sign=1738860993-9XNMA7BQMyG01fUTz1gry2SbjjTallrp-0-feffef9ec9cd91257cd155a4a41fb582)
如出现以上错误,解决方案如下。
1)更新用户仓库名信息。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-3-i.jpg?sign=1738860993-wr1x1qmi2FIw4GgzpQwFcMHigk6NVob1-0-0f5affe29faf34c21b87de4fc456807f)
其中,anyingtest是Docker Hub平台的账号,test1是创建的Docker仓库名。
2)重启Docker,在终端登录Docker Hub。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-4-i.jpg?sign=1738860993-9Oyvfc930FKWycYirdncyI10o58USvub-0-5b1e64991f8cbe8aed81e2f736c6a93a)
成功上传后出现如下所示的digest信息,说明容器上传成功。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-5-i.jpg?sign=1738860993-TI7B5LmqFMHcUxHNroNriCGlnK9tEnZw-0-79ae881a746df35e7f07159f238e4247)
登录Docker Hub可以查看刚才上传的Docker镜像,如图1-10所示。镜像简要信息如图1-11所示。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-10.jpg?sign=1738860993-ShJMWaJ8gwfPTWBwqkDCzdS3Du6tUhSp-0-c3f7784d5934ed5c5d822478462b1559)
图1-10 登录Docker Hub查看镜像
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-11.jpg?sign=1738860993-1RRdxdLPcGP1n8htsBdmcMSLNMGavm3A-0-09ef54159d3dd4f75e67912d1998f4c2)
图1-11 镜像简要信息
使用docker pull命令查看我们上传的镜像环境是否能正常下载:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/014-i.jpg?sign=1738860993-TD2rS4Zwjs1PjjGA4PQ6VzAVkndTzrEh-0-5ce4e24e040ff60426d7d602a000672e)
执行好以后,正常下载的效果如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/014-2-i.jpg?sign=1738860993-xvi48r3wpj2KCjQkH3aAm2VVecaXABWi-0-44e1e5e35b0aaedec1cf01a80d3928b4)