
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
执行以下命令:

2.运行Docker
尝试启动Docker,命令如下:

如果在未启动Docker的情况下执行Docker命令,则会失败,如下所示:

3.测试Docker
下载并运行一个hello-world环境:

执行上面这条命令以后,运行Docker成功,如下所示:

如果安装运行需要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容器。

1.启动CentOS 6容器
查看容器ID,命令如下所示:

执行以后可以查看容器的ID:

运行Docker,命令如下所示:

命令说明如下。
●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默认页面。

图1-6 Apache默认页面
4.安装PHP
安装PHP的命令如下所示。

在/var/www/html目录下新建一个phpinfo.php文件,并且访问,命令如下:

文件内容如下:

如果不解析PHP文件,那么重启Apache即可。命令如下所示:

执行以后,打开浏览器,并在浏览器中访问到该文件的位置,如图1-7所示,说明PHP成功解析。

图1-7 PHP成功解析
5.安装程序
将下载好的CMS文件解压到本地,用docker cp命令复制进去,如下所示:

在上面代码的第二条指令中,笔者使用了中文方式让读者更清晰地理解该命令的使用方法。
执行docker ps命令,所显示的NAMES项对应的值就是容器名,如下所示:

在浏览器中填入搭建好的容器访问地址(http://127.0.0.1:8888),安装AppCMS网站程序。
如果文件不可写入,可在容器里执行命令chmod -R 777 /var/www/html,添加html目录下全部文件的可写和可读权限。修改好以后打开浏览器访问AppCMS所在的根目录处,会默认出现如图1-8所示的AppCMS安装完成界面。

图1-8 AppCMS安装完成界面
1.3.3 上传镜像至Docker Hub
依次使用Ctrl+P和Ctrl+Q快捷键退出容器并保持容器运行来挂起镜像(如没有此操作,关闭Docker后镜像会默认恢复到之前刚下载的场景和内容。也可以新开终端,跳过这步看下面的docker commit命令的执行),命令如下所示。

查看NAMES,如下所示:

恢复运行,如下所示:

执行docker ps命令查看CONTAINER ID,如下所示:

执行docker commit命令,保存刚才创建好的CONTAINER ID(e72189678c20),同时创建并保存与其配套的知识库(test1),如下所示:

执行好以后提交新镜像所需要的程序命令docker images,如下所示:

将保存的镜像上传到Docker Hub上,可以直接用docker pull命令下载。
首先,注册并且登录Docker Hub。选择Create→Create→Repository(创建知识库),任意命名,如图1-9所示。

图1-9 创建知识库
然后用终端登录Docker Hub,命令如下:

填入账号密码,出现Login Succeeded表示登录成功,如下所示:

使用Docker push命令上传镜像:

执行以后,上传中途报错:

如出现以上错误,解决方案如下。
1)更新用户仓库名信息。

其中,anyingtest是Docker Hub平台的账号,test1是创建的Docker仓库名。
2)重启Docker,在终端登录Docker Hub。

成功上传后出现如下所示的digest信息,说明容器上传成功。

登录Docker Hub可以查看刚才上传的Docker镜像,如图1-10所示。镜像简要信息如图1-11所示。

图1-10 登录Docker Hub查看镜像

图1-11 镜像简要信息
使用docker pull命令查看我们上传的镜像环境是否能正常下载:

执行好以后,正常下载的效果如下所示:
