![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=1738944773-8QntFEtbD1W0Xi63eFjx3J1JUb0Nyj7S-0-8e65da97c205b86f4b04fddae1473e47)
2.运行Docker
尝试启动Docker,命令如下:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/007-i.jpg?sign=1738944773-zviKy1vDxiJceIA5wlg4LoD8rZ57G9V7-0-35021783e76932ffd01e3f4f6e52dd15)
如果在未启动Docker的情况下执行Docker命令,则会失败,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/007-2-i.jpg?sign=1738944773-Yb7Aov43v2RawtARvwsesIBYkkC2w1We-0-4107ecdc92fad787e788ff4d2139d0c9)
3.测试Docker
下载并运行一个hello-world环境:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/007-3-i.jpg?sign=1738944773-bbDwCc6MA6gr0JeP71Sr9XJ73SVeon9T-0-d88a33d989eb47f25949b74ad910000d)
执行上面这条命令以后,运行Docker成功,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/007-4-i.jpg?sign=1738944773-HKaEoQS48B9O4F7CrSAXWyCFQUhOZ4MQ-0-890c3a270250dba98df8c03b2424470f)
如果安装运行需要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=1738944773-w9chptwttS1QE2PjZusdcVKzjZ8Nt6WR-0-e435f23f03381ad1a62556eacd71e5e6)
1.启动CentOS 6容器
查看容器ID,命令如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/008-2-i.jpg?sign=1738944773-psbngllivzSbx66DYrKYyxzV5IMUUMDs-0-6aec728f4d049ff5a47deca9c8f8142c)
执行以后可以查看容器的ID:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/008-3-i.jpg?sign=1738944773-0f93ValoUL7DTHJomq8pF0KJIlN8ahhn-0-7211e1ca58ab5872958bc9272aa7c9fe)
运行Docker,命令如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/008-4-i.jpg?sign=1738944773-nzGSU1YfaHkRKzZHyi0vHDULGpxZUasj-0-5f4c2092aa98a709ffab11021f9ec7c9)
命令说明如下。
●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=1738944773-byDRtWb3m7IoLd7aylsJhedvZv5xioKX-0-286b3fe2c7ff1ce47bc7ef1a87cf525e)
图1-6 Apache默认页面
4.安装PHP
安装PHP的命令如下所示。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/009-i.jpg?sign=1738944773-YajaRAgj48ELm5c9Q1IE14tVXriHmfkE-0-3c36786ecba83256f85fe1c4be6e230a)
在/var/www/html目录下新建一个phpinfo.php文件,并且访问,命令如下:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/009-2-i.jpg?sign=1738944773-hbg6SbL81pMHdyvl78KFWV5Rc7G5pG77-0-8d557e15ec9df44ed7f06184fbfc4141)
文件内容如下:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/009-3-i.jpg?sign=1738944773-IdJmWWb8UxfmLi5ra7TyW90po5iRrQcP-0-4ae7eacdbe508649d8a47fa71affd831)
如果不解析PHP文件,那么重启Apache即可。命令如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/009-4-i.jpg?sign=1738944773-s9WSIqVN4QmTzeoP26OaNcW2xpcm9qip-0-5933460460432581593d55cd8bbc868b)
执行以后,打开浏览器,并在浏览器中访问到该文件的位置,如图1-7所示,说明PHP成功解析。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-7.jpg?sign=1738944773-fmB0NuBCZgG4vzsZHAI3O5JQ9ejbtTdO-0-d13f5e20d21658e38f943d766704ce9f)
图1-7 PHP成功解析
5.安装程序
将下载好的CMS文件解压到本地,用docker cp命令复制进去,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/010-i.jpg?sign=1738944773-01HbBqldsJv0SL6hhe9CvPo0e0VYDVgx-0-1037e85fd098cbc66d83113f0e99b768)
在上面代码的第二条指令中,笔者使用了中文方式让读者更清晰地理解该命令的使用方法。
执行docker ps命令,所显示的NAMES项对应的值就是容器名,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/010-2-i.jpg?sign=1738944773-95ooiT0YxmAOgenFpquH3mkKAA8g88m6-0-b3e3cafd36982e66667cba0290297ab9)
在浏览器中填入搭建好的容器访问地址(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=1738944773-0VPxzeoMevWJSpOAf8HgXAdq4cYopLxX-0-87630ade9227195aa26092d8e708e6ba)
图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=1738944773-l5FI67msBqcYApePJHsV8kv4NMjdU3Rj-0-d49ffb4dd68dc1472fa85c8453e3ea2f)
查看NAMES,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-2-i.jpg?sign=1738944773-ZyGDkf7LrErvCr0qzscx8DukIhLisIWf-0-0fbae97162dad100361ef5b2e6359bec)
恢复运行,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-3-i.jpg?sign=1738944773-5C8PTADlxo64hLtrtuOB0KOZKcaziLgD-0-1698f3706290d470d571460ce81e617e)
执行docker ps命令查看CONTAINER ID,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-4-i.jpg?sign=1738944773-d3GMq2QgZaUQgXBSLRKsPvIPnFlP2eiR-0-8dede4e9785d2e1ec352f82d2f700272)
执行docker commit命令,保存刚才创建好的CONTAINER ID(e72189678c20),同时创建并保存与其配套的知识库(test1),如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-5-i.jpg?sign=1738944773-HBXDiP5mSjNZRKfnV1T1GJeHJCXcpDhL-0-afcc706e2f210e080f7435e215f3cdfa)
执行好以后提交新镜像所需要的程序命令docker images,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/012-i.jpg?sign=1738944773-IsePbDQaUvkd46ZS1zWtqrdY6XGmBFUO-0-f2c1636ba2407d7d0af32e40ce76874e)
将保存的镜像上传到Docker Hub上,可以直接用docker pull命令下载。
首先,注册并且登录Docker Hub。选择Create→Create→Repository(创建知识库),任意命名,如图1-9所示。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-9.jpg?sign=1738944773-TQmGDFrm1irUsR3yiGKceZx4BqGOlA4n-0-ca995491d31b677414e8332d3841731b)
图1-9 创建知识库
然后用终端登录Docker Hub,命令如下:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/012-2-i.jpg?sign=1738944773-irMapGoWKEv5MXdPAzUZM6B0RjpPcW64-0-ec1a48f7b22dcc03a3d5f62ec457b35f)
填入账号密码,出现Login Succeeded表示登录成功,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/012-3-i.jpg?sign=1738944773-tyDGuCXNryjBRdYbr7s6CCKfz0KzZGR3-0-391cd6699f8771b1168748a641247f82)
使用Docker push命令上传镜像:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-i.jpg?sign=1738944773-Oa2Nh3x9lNdBQgCbgZGIgiLkAYkLnHgN-0-8143386352a872c7ee77720502f88f56)
执行以后,上传中途报错:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-2-i.jpg?sign=1738944773-PV9B324jRktVAZeRijpvryNeUc1zFPVV-0-05322e6fd47ce4add8751483b9cb73d3)
如出现以上错误,解决方案如下。
1)更新用户仓库名信息。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-3-i.jpg?sign=1738944773-eqb22Gjkyo3d7cljY5sPW2aLV4qBuMpt-0-0c04b473f3ffc9e4ba01ee9ab9c0c49f)
其中,anyingtest是Docker Hub平台的账号,test1是创建的Docker仓库名。
2)重启Docker,在终端登录Docker Hub。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-4-i.jpg?sign=1738944773-nBCpGGzVZrBRKEgBAQDNZshPsIem2VTT-0-6863c015e90d3949907529c0934845b2)
成功上传后出现如下所示的digest信息,说明容器上传成功。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-5-i.jpg?sign=1738944773-u1ItipAHrX1muRLAjqvvdMI0ggUtzqLO-0-c3e46bad47299450c96f2dfb958dc869)
登录Docker Hub可以查看刚才上传的Docker镜像,如图1-10所示。镜像简要信息如图1-11所示。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-10.jpg?sign=1738944773-3vXsjsXkbqAhQJ26G0NbghLgGIfgXold-0-addc8d8f3cc020d95339c3c23b3815d0)
图1-10 登录Docker Hub查看镜像
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-11.jpg?sign=1738944773-TEAykKyNETzfILJ8Vq2CqJ3qjGLwgNBb-0-d4113d3b80c07f57d10157ce5a4fe0ab)
图1-11 镜像简要信息
使用docker pull命令查看我们上传的镜像环境是否能正常下载:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/014-i.jpg?sign=1738944773-bMfPym6yBpIqZvkPjc8DUuJEjzZ5YMln-0-500f4fb6fb558028ddcf12534369e400)
执行好以后,正常下载的效果如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/014-2-i.jpg?sign=1738944773-0sa78A1Bai8fJkDr08kjNaT01EjqLf3E-0-1d2c4723b5c7e880ef253c3c27404012)