上面已经构建了一个基本的docker镜像centos7。在构建docker镜像时,首先要有基础镜像,然后是中间件镜像,最后生成应用镜像。现在centos7作为基础镜像,我们来构建两个中间件镜像:DB镜像,具有PHP和Nginx能力的镜像。php-fpm文件目录如下[root@Optimusdocker-training]#lscentos7mysqlphp-fpmREADME.mdwordpress[root@Optimusdocker-training]#cdphp-fpm/[root@Optimusphp-fpm]#lsDockerfilenginx_default.confnginx_nginx.confphp_www.confsupervisor_nginx.confsupervisor_php-fpm.conf[supervisor_php-fpm.conf]用于启动php-fpm。[supervisor_nginx.conf]用于启动Nginx服务。Dockerfile[root@Optimusphp-fpm]#vimDockerfile##MAINTAINERCarson,C.J.Zeong#DOCKER-VERSION1.6.2##Dockerizingphp-fpm:Dockerfileforbuildingphp-fpmimages#FROMcsphere/centos:7.1MAINTAINERCarson,C.J.Zeong#设置环境变量ENVAPP_DIR/appRUNyum-yswap--removefakesystemd--installsystemdsystemd-libs&&\yum-yinstallnginxphp-cliphp-mysqlphp-pearphp-ldapphp-mbstringphp-soapphp-domphp-gdphp-xmlrpcphp-fpmphp-mcrypt&&\yumcleanallADDnginx_nginx.conf/etc/nginx/nginx.confADDnginx_default.conf/etc/nginx/conf.d/default.confADDphp_www.conf/etc/php-fpm.d/www.confRUNsed-i's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/'/etc/php.iniRUNmkdir-p/app&&echo“”>${APP_DIR}/info.phpEXPOSE80443ADDsupervisor_nginx.conf/etc/supervisor.conf.d/nginx.confADDsupervisor_php-fpm.conf/etc/supervisor.conf.d/php-fpm.confONBUILDADD./appONBUILDRUNchown-Rnginx:nginx/app[FROMcsphere/centos:7.1]基于cento:7.1为基础镜像(parentimage)[MAINTAINER]说明谁来维护dockerfile[ENVAPP_DIR/app]设置一个APP_DIR变量,文件目录为/app。(因为后来对Nginx做了一些修改,把Nginx官网的根目录改成了/app,同时把默认的配置文件/etc/nginx/conf.d/default.conf改成nginx_default.conf文件)。【RUNyum-yinstallnginxphp-cliphp-mysqlphp-pearphp-ldapphp-mbstringphp-soapphp-domphp-gdphp-xmlrpcphp-fpmphp-mcrypt】主要安装了Nginx、php-mysql、php-fpm和其他php扩展包。[ADDphp_www.conf/etc/php-fpm.d/www.conf]之前安装php和Apache的时候,里面的用户是Apache,今天用的是Nginx,所以需要把Apache用户换成Nginx。RUNmkdir-p/app&&echo"">${APP_DIR}/info.php]创建/app目录。phpinfo用于测试Nginx和php-fpm之间创建是否成功,所以创建了info.php文件,放在/app目录下。[EXPOSE80443]Nginx默认的端口号是80,https是443,这个命令可以省略,但是建议写成让人一看就知道要暴露80和443端口。[ADDsupervisor_nginx.conf/etc/supervisor.conf.d/nginx.conf]添加启动Nginx和启动php-pfm的配置文件[ADDsupervisor_php-fpm.conf/etc/supervisor.conf.d/php-fpm.conf]添加启动Nginx的配置和启动php-pfm文件[ONBUILDADD./app]onbuild是dockerfile中一个很重要的命令。构建此镜像时onbuild不生效。什么时候生效?比如现在生成一个php-pfm镜像,就会在下一个镜像生效。使用onbuild发布产品非常快,开发人员需要做的工作很少。[ONBUILDRUNchown-Rnginx:nginx/app]构建php-fpm镜像dockerbuild-tcsphere/php-fpm:5.4。查看镜像dockerimages上面的镜像已经做好了。我们来测试一下它是否可以提供php和Nginx的功能。测试PHP和Nginx功能创建一个docker容器[root@Optimusphp-fpm]#dockerrun-d-p8080:80--namewebsitecsphere/php-fpm:5.4e274049db704780a4742103afbf206a9a924eb2f9982dbc18432b94008f8a032创建一个Ngin映射080端口的docker容器docker容器名称为website,docker镜像为csphere/php-fpm:5.4。查看docker容器的状态dockerps-a[root@Optimusphp-fpm]#dockerps-aCONTAINERIDIMAGECOMMANDSTATUSPORTSNAMESe274049db704csphere/php-fpm:5.4"/usr/bin/supervisor58秒前Up55秒22/tcp,443/tcp,0.0.0.0:8080->80/tcpwebsite2d36dbfc72a0csphere/centos:7.1"/usr/bin/supervisor23小时前Up23小时0.0.0.0:2222->22/tcpbase0d1f6225836bcentos"/bin/bash"2天前Exited(127)2天前naughty_engelbart[root@Optimusphp-fpm]#查看公网IPifconfigeth1eth1这个网卡是公网IP。公网IP地址为inetaddr:10.10.4.182。浏览器访问http://inetaddr:8080/info.php例如:http://10.10.4.182:8080/info.php映射到主机的8080端口。Nginx默认加载index.html或者index.php,刚才创建的时候并没有添加这些文件。这里访问的是info.php。看到如下界面说明Nginx启动成功,可以结合php-fpm解析PHP代码进入容器查看Nginx和PHP是否启动dockerexec-itwebsite/bin/bash进入交互模式,进入网站容器/bin/bashinterface[root@Optimus/]#dockerexec-itwebsite/bin/bash[root@e274049db704/]#查看带有多个服务的containersupervisorctl因为它是基于php-fpm构建的dockercentos基础镜像镜像,所以它已经具备了基础镜像的所有功能。[root@e274049db704/]#supervisorctlnginxRUNNINGpid7,uptime0:34:43php-fpmRUNNINGpid8,uptime0:34:43supervisor>可以看到docker容器中php-fpm和Nginx已经完全启动。exitExitsupervisor>exit[root@e274049db704/]#exitexit退出后检查容器状态(仍处于UP状态)dockerps-a