![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=1738934732-I3lWsjeoD6dl56siWnuOUODna1rUARNG-0-7dcdc7a436a3b5f3ef83100cdafde470)
2.运行Docker
尝试启动Docker,命令如下:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/007-i.jpg?sign=1738934732-p43GO24Kc9mCgltuFJYU6g5zaCQyk5SO-0-9d9d44ee0618775aa15176f3187ec02d)
如果在未启动Docker的情况下执行Docker命令,则会失败,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/007-2-i.jpg?sign=1738934732-4QVMd9PHU8oqKjGSD9q6d5EQFBeoD5P1-0-4e267f2cac38ce17d489e476767c4cb9)
3.测试Docker
下载并运行一个hello-world环境:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/007-3-i.jpg?sign=1738934732-SsY7x2MgL5ReXC7jotccDRcheaWBRFi2-0-8448f1ae80833a73e5f17e0a2cc69663)
执行上面这条命令以后,运行Docker成功,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/007-4-i.jpg?sign=1738934732-YhqO6gNY3UgzxHJFyTtQf21jJCNSRCMI-0-97f2ad2b4a7549f5f561d3146e2da069)
如果安装运行需要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=1738934732-r8UwC3TbgYnLIMDzUy793dtQpFMI2ZAZ-0-0a223100b64f3165ea4cbfae7d56acb7)
1.启动CentOS 6容器
查看容器ID,命令如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/008-2-i.jpg?sign=1738934732-OHzbIP15vJO79Em7MOkAKgCfMTZx7vE9-0-8adedebe9cd4f729963320fe6ca98da1)
执行以后可以查看容器的ID:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/008-3-i.jpg?sign=1738934732-84k7L7fNje3KbbMZj2SezYiXNcTelToM-0-c3ae4a43a1c78084debaaa9bc478ad3e)
运行Docker,命令如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/008-4-i.jpg?sign=1738934732-SJ9CQjEzjwe4XxGikOQrjTlcATQrV3V3-0-2cf9419d0ac829ace36e8361fe9c2571)
命令说明如下。
●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=1738934732-oD6n12HjaS856697uN5BzNlVXAGZvV1F-0-e634b9b9fbec252578abc6ff9659317c)
图1-6 Apache默认页面
4.安装PHP
安装PHP的命令如下所示。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/009-i.jpg?sign=1738934732-OBbxo23YHbrVFe3FHSXzYyAOGu8jQYMj-0-80d17828ff68e03c9f17b9b0f98f184b)
在/var/www/html目录下新建一个phpinfo.php文件,并且访问,命令如下:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/009-2-i.jpg?sign=1738934732-VB17DoRBupWDFy7tbisMBkn5UaofW66S-0-1434859c8e066789c1e69adb7230a92e)
文件内容如下:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/009-3-i.jpg?sign=1738934732-DtB69T7yfZwj3Tg6QckkETmo332m80AR-0-ac269316485e9a52b8a3b3517251ed9b)
如果不解析PHP文件,那么重启Apache即可。命令如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/009-4-i.jpg?sign=1738934732-AAxHHtcN5snRyyojPTIFWNpGrx7E0gSn-0-3fb02de54c1d5abf22866b582f4b625c)
执行以后,打开浏览器,并在浏览器中访问到该文件的位置,如图1-7所示,说明PHP成功解析。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-7.jpg?sign=1738934732-pibUnTArLTiQysJ0BSnmwcsrnowva2PH-0-646610117387c525c79bc40dd35b84b4)
图1-7 PHP成功解析
5.安装程序
将下载好的CMS文件解压到本地,用docker cp命令复制进去,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/010-i.jpg?sign=1738934732-cSo9GIH5zPRGC7nJMVQI3K1Fv3oKGgdm-0-8aac544ec240aafde876bc8f873a6cc1)
在上面代码的第二条指令中,笔者使用了中文方式让读者更清晰地理解该命令的使用方法。
执行docker ps命令,所显示的NAMES项对应的值就是容器名,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/010-2-i.jpg?sign=1738934732-2ibcEZJG5mhW9jN7gRMi0LHlTaEYhQDc-0-c76fd4ea9ac466246056ef8eba00f8e2)
在浏览器中填入搭建好的容器访问地址(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=1738934732-fLwcHwdNr4l910vXfsaVN1L5hy9gfpn5-0-1f12664b31380f08b3d237b249c5def2)
图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=1738934732-odjEg8xZrciWK0bIoycXuBsZ32NBJL8Z-0-7f481e43a282530fdcbdaad63ecd7254)
查看NAMES,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-2-i.jpg?sign=1738934732-1m06H4oTjCpDpYunAvJnAOvoqlS0qJqD-0-4e07da775b3f9c1a93b2a50e2654e1e6)
恢复运行,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-3-i.jpg?sign=1738934732-THiQ1M7GokS81dfS70KA5OK4YIxssaeR-0-fcc7548e02d9c600abb495b57f0e0b66)
执行docker ps命令查看CONTAINER ID,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-4-i.jpg?sign=1738934732-lqcwKPLSjmtmXnZew28USvUQgOw0rpTl-0-7dae6bff67576cef9ac47409878d1346)
执行docker commit命令,保存刚才创建好的CONTAINER ID(e72189678c20),同时创建并保存与其配套的知识库(test1),如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/011-5-i.jpg?sign=1738934732-EFGsVnVJAzC1SbjgTXbQPhFcEfRbi7TP-0-7ac31c67485850265d6bbb5b93027128)
执行好以后提交新镜像所需要的程序命令docker images,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/012-i.jpg?sign=1738934732-V9y84EB5J9dimOH1HopnYqfOcr5ERs7s-0-dfa0c0240f880aeb998ec2eb7c7b67ef)
将保存的镜像上传到Docker Hub上,可以直接用docker pull命令下载。
首先,注册并且登录Docker Hub。选择Create→Create→Repository(创建知识库),任意命名,如图1-9所示。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-9.jpg?sign=1738934732-RXTGsB7LyYQe0dQ38fzJvl1kfKYOr6wn-0-7270cca1a3316ad766bcb87afa69e8e0)
图1-9 创建知识库
然后用终端登录Docker Hub,命令如下:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/012-2-i.jpg?sign=1738934732-le9qrN8TMl3dt1ZFMX910njvrdthszeT-0-65e0808b6504237ce237de894b54c4ab)
填入账号密码,出现Login Succeeded表示登录成功,如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/012-3-i.jpg?sign=1738934732-0jz6OtHBIJePbZjNdIkpr4p1sZmjDZIL-0-1b302696a1c15c554c8cdc93a8e961e5)
使用Docker push命令上传镜像:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-i.jpg?sign=1738934732-jxfqQYBYnED2Ftji9w9fS8j4aAtoDIPO-0-7812dc90a267b6cfb32b89c3d3438362)
执行以后,上传中途报错:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-2-i.jpg?sign=1738934732-CPNgTtULyRAYR0glY8OOT0QlGhSHIqaE-0-ea1441643fdf158cf89c418ad9ce4157)
如出现以上错误,解决方案如下。
1)更新用户仓库名信息。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-3-i.jpg?sign=1738934732-kLwZQHQd60Iug8sxGHRVdxzkUgwF0TjU-0-4dcf5f587d0be7681539113eac5db07b)
其中,anyingtest是Docker Hub平台的账号,test1是创建的Docker仓库名。
2)重启Docker,在终端登录Docker Hub。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-4-i.jpg?sign=1738934732-bKF8PUFMgzNx1a8PaLMU899mFoB6faLl-0-b30ef0164c3f060b3ce67c732f3353d5)
成功上传后出现如下所示的digest信息,说明容器上传成功。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/013-5-i.jpg?sign=1738934732-LSI1GShjXZ7Ahhg3K3ach0H9xiOfJN2s-0-6c2d806fcc6267bf5103ed393c584000)
登录Docker Hub可以查看刚才上传的Docker镜像,如图1-10所示。镜像简要信息如图1-11所示。
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-10.jpg?sign=1738934732-ieJeliSjQuJTgiGSk0uN0jkFt9II4zM4-0-306d1abf906ace906360f92804c227c7)
图1-10 登录Docker Hub查看镜像
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/1-11.jpg?sign=1738934732-vyhGvrd9iE8kY0iITcVXFG2RER6vCkCX-0-001fea794dfda94241f24bb4890add2d)
图1-11 镜像简要信息
使用docker pull命令查看我们上传的镜像环境是否能正常下载:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/014-i.jpg?sign=1738934732-SN2SuO4tc8L0e0PyoNUvncFp8TW952hK-0-f15c1783e372905dee19d7ba1ee9d0fd)
执行好以后,正常下载的效果如下所示:
![](https://epubservercos.yuewen.com/AAB7B5/21233234301205006/epubprivate/OEBPS/Images/014-2-i.jpg?sign=1738934732-kO8Qi1kMYDUk8AnWXbs2ODJz15iQtSGi-0-1158bbf0d48eb662099b7bf92b6682f3)