上一篇简单介绍了Docker的安装,运行,这一篇来构建一个基于Nginx和PHP-FPM的Phalcon镜像。在官方找了以下,单独的Nginx和PHP镜像更加流行,混合的反倒不是很受欢迎。其实官方并不提倡在一个容器里面运行多个服务,最好是一个容器只对外提供一个服务:一个容器启动时仅仅运行一个命令(其实里面可以包含多个),也方便部署扩展升级。多个服务之间可以使用Docker Compose来管理。但是Docker并不阻止创建包含多个服务器的镜像,为了方便,所以我们仍然可以自己构建。
构建镜像可以有好几种方式,比如基于Alpine Linux或phusion/baseimage-docker构建,或者基于Ubuntu,CentOS等构建,又或者在PHP,Nginx的基础镜像上构建。注意:如果要采用Ubuntu或者CentOS构建,可能需要一些额外的工作,以便保持镜像轻量稳定运行。
这里采用已有的richarvey/nginx-php-fpm来构建,它是一个基于Nginx官方镜像来构建的。
从Github上拉取相关文件从Dockerfile构建:
1 2 | $ sudo git clone https: //github .com /ngineered/nginx-php-fpm $ sudo docker build -t nginx-php-fpm:latest . |
关于Dockerfile的相关解释,可以参考这里。当然也可以直接拉取镜像使用
1 2 3 | $ sudo docker pull richarvey /nginx-php-fpm # 也可以直接运行,会自动拉取 #$ sudo docker run -d richarvey/nginx-php-fpm |
查看本地的镜像,连单独的nginx也来了:
1 2 3 4 | root@thinkpad:~ # docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx-php-fpm latest 4fc9ac9f2945 7 hours ago 228.5 MB nginx mainline-alpine 00bc1e841a8f 5 days ago 54.21 MB |
这里的mainline-alpine是指基于Alpine Linux构建的。Alpine Linux是一个仅有5M大小的linux系统,采用apk add/search来安装/查找相应软件,有许多镜像都是基于它构建的,官方PHP镜像也有基于它构建的Docker镜像。
然后运行nginx-php-fpm:
1 | root@thinkpad:~ # docker run --name web -d richarvey/nginx-php-fpm |
docker inspect命令用来查看容器的相关信息,查看下分配的IP:
1 2 3 4 | root@thinkpad:~ # docker inspect web | grep IPAddress "SecondaryIPAddresses" : null, "IPAddress" : "172.17.0.2" , "IPAddress" : "172.17.0.2" , |
然后在浏览器里面访问:http://172.17.0.2/就可以看到phpinfo的页面。到这里,Nginx + PHP的web容器就已经运行起来了,对应的Nginx和PHP进程可以在宿主机器上直接查看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | root@thinkpad:~ # ps aux | grep nginx root 18167 0.0 0.0 13696 4300 pts /6 S 01:47 0:00 nginx: master process /usr/sbin/nginx systemd+ 18168 0.0 0.0 14144 1868 pts /6 S 01:47 0:00 nginx: worker process systemd+ 18169 0.0 0.0 14144 1868 pts /6 S 01:47 0:00 nginx: worker process systemd+ 18170 0.0 0.0 14144 1868 pts /6 S 01:47 0:00 nginx: worker process systemd+ 18171 0.0 0.0 14144 1868 pts /6 S 01:47 0:00 nginx: worker process systemd+ 18172 0.0 0.0 14144 1868 pts /6 S 01:47 0:00 nginx: worker process root 18190 0.0 0.0 21292 1012 pts /18 S+ 01:47 0:00 grep --color=auto nginx root@thinkpad:~ # ps aux | grep php-fpm root 18166 0.0 0.2 167880 23364 pts /6 S 01:47 0:00 php-fpm: master process ( /etc/php5/php-fpm .conf) systemd+ 18173 0.0 0.1 167880 8620 pts /6 S 01:47 0:00 php-fpm: pool www systemd+ 18174 0.0 0.1 167880 8620 pts /6 S 01:47 0:00 php-fpm: pool www systemd+ 18175 0.0 0.1 167880 8620 pts /6 S 01:47 0:00 php-fpm: pool www root 18192 0.0 0.0 21292 1032 pts /18 S+ 01:47 0:00 grep --color=auto php-fpm |
接下来要为这个容器添加Phalcon扩展。首先要进入容器里面,使用docker attach命令进入:
1 | root@thinkpad:~ # docker attach web |
结果在这里等了半天进不去。。。。查看下当前镜像入口程序:
1 2 3 | root@thinkpad:~ # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 94176348a939 nginx-php-fpm "/start.sh" 6 seconds ago Up 5 seconds 80 /tcp , 443 /tcp web |
这个容器启动的时候运行的是start.sh这个脚本,这个脚本运行了Supervisor工具。于是重新启动容器,运行/bin/bash
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #终止容器运行 root@thinkpad:~ # docker stop web web #删除容器 root@thinkpad:~ # docker rm web web #重新运行 root@thinkpad:~ # docker run --name web -d -t -i nginx-php-fpm /bin/bash ea21e10df702644a83ed75930b30c7764a786c4feabdf17cd868f86640137c47 root@thinkpad:~ # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ea21e10df702 nginx-php-fpm "/bin/bash" 6 seconds ago Up 5 seconds 80 /tcp , 443 /tcp web root@thinkpad:~ # docker attach web #进来了 bash -4.3 # ls bin etc lib media proc run srv sys usr dev home linuxrc mnt root sbin start.sh tmp var |
就可以进去了。
先安装编译相关工具包:
1 2 3 4 5 6 7 8 9 10 | bash -4.3 # apk --no-cache add php5-dev bash -4.3 # apk --no-cache add gcc bash -4.3 # apk --no-cache add make bash -4.3 # apk --no-cache add autoconf bash -4.3 # apk --no-cache add libc-dev fetch http: //dl-cdn .alpinelinux.org /alpine/v3 .4 /main/x86_64/APKINDEX . tar .gz fetch http: //dl-cdn .alpinelinux.org /alpine/v3 .4 /community/x86_64/APKINDEX . tar .gz (1 /2 ) Installing musl-dev (1.1.14-r12) (2 /2 ) Installing libc-dev (0.7-r0) OK: 334 MiB in 106 packages |
编译安装Phalcon:
1 2 3 4 5 6 | bash -4.3 # cd /home bash -4.3 # git clone --depth=1 git://github.com/phalcon/cphalcon.git bash -4.3 # cd cphalcon/build bash -4.3 # ./install bash -4.3 # ls -la /usr/lib/php5/modules/ | grep phalcon -rwxr-xr-x 1 root root 5045264 Sep 28 17:34 phalcon.so |
更改PHP扩展的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | bash -4.3 # cd /etc/php5/conf.d/ bash -4.3 # vi phalcon.ini #添加以下内容 #extension=phalcon.so #检查扩展是否加载成功 bash -4.3 # php -i | grep phalcon /etc/php5/conf .d /phalcon .ini, phalcon phalcon => enabled phalcon.db.escape_identifiers => On => On phalcon.db.force_casting => Off => Off phalcon.orm.cast_on_hydrate => Off => Off phalcon.orm.column_renaming => On => On phalcon.orm.enable_implicit_joins => On => On phalcon.orm.enable_literals => On => On phalcon.orm.events => On => On phalcon.orm.exception_on_failed_save => Off => Off phalcon.orm.ignore_unknown_columns => Off => Off phalcon.orm.late_state_binding => Off => Off phalcon.orm.not_null_validations => On => On phalcon.orm.virtual_foreign_keys => On => On OLDPWD => /home/cphalcon/build _SERVER[ "OLDPWD" ] => /home/cphalcon/build _ENV[ "OLDPWD" ] => /home/cphalcon/build |
加载成功了,需要保持本次镜像变更。首先退出容器:
1 2 3 4 5 | bash -4.3 # cd /home #删除各种不必要的东西,比如gcc bash -4.3 # rm -rf cphalcon/ bash -4.3 # exit exit |
然后查看版本并提交变更:
1 2 3 4 5 | root@thinkpad:~ # docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ea21e10df702 nginx-php-fpm "/bin/bash" 31 minutes ago Exited (0) 6 seconds ago web root@thinkpad:~ # docker commit ea2 nginx-php-fpm:phalcon sha256:bb388df328ecc33fac02dba69759d5c992a145f650a0e5b20ca29a4b122fa933 |
docker commit命令可以用来提交变更,ea2是container id的前三位,也可以写全;然后跟的是要提交的镜像。这里提交到phalcon这个标签下,以便与原来的区分开。查看所有镜像,发现有两个不同的标签:
1 2 3 4 | root@thinkpad:~ # docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx-php-fpm phalcon bb388df328ec 11 seconds ago 364.4 MB nginx-php-fpm latest 4fc9ac9f2945 4 hours ago 228.5 MB |
采用新镜像来运行,这里要讲程序运行入口改回/start.sh,以便能正常启动Nginx和PHP-FPM:
1 2 3 4 5 6 7 | root@thinkpad:~ # docker rm web web root@thinkpad:~ # docker run --name web -d -t -i nginx-php-fpm:phalcon /start.sh deecb19467cda2676b24248e3f55970a2481255c6022a80ffbf5087792ccb559 root@thinkpad:~ # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES deecb19467cd nginx-php-fpm:phalcon "/start.sh" 4 seconds ago Up 3 seconds 80 /tcp , 443 /tcp web |
入口程序改变了,需要再提交一次变更:
1 2 3 4 5 6 7 | root@thinkpad:~ # docker stop web web root@thinkpad:~ # docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c7600e62733d nginx-php-fpm:phalcon "/start.sh" 34 seconds ago Exited (137) 8 seconds ago web root@thinkpad:~ # docker commit c76 nginx-php-fpm:phalcon sha256:1c97ee169a551dd8441f42b40beafd102c71f3e887e2317dc11ce0ef136ceaf0 |
运行最终的镜像:
1 2 3 4 5 6 7 | root@thinkpad:~ # docker rm web web root@thinkpad:~ # docker run --name web -d -t -i nginx-php-fpm:phalcon cb5b0c9e55913a538539e46c53ac7905b21def84a05eb00ef81c4b500853576c root@thinkpad:~ # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cb5b0c9e5591 nginx-php-fpm:phalcon "/start.sh" 4 seconds ago Up 3 seconds 80 /tcp , 443 /tcp web |
访问http://172.17.0.2/,便可以在页面找到phalcon扩展。
通常我们会将程序和数据分开,挂载外部文件目录到容器里面去:
1 2 3 4 5 6 | root@thinkpad:~ # docker stop web web root@thinkpad:~ # docker rm web web root@thinkpad:~ # docker run --name web -d -t -i -v /home/docker/nginx-php-fpm/src:/var/www/html/ nginx-php-fpm:phalcon ffd64793fe8e7a2a95b68f514e221b7ec3b6cadfe668c016f55a7bb6d48bc702 |
-v参数可以用来挂载目录或者文件,可以又多个-v参数。
刚才容器里面做的那些已经添加到Dockerfile里面去,你直接使用它来构建。
至此Nginx + PHP-FPM + Phalcon镜像构建完成,介绍绍了如何进入容器,提交变更,网络访问和文件挂载。
参考链接:
A minimal Ubuntu base image modified for Docker-friendliness
eboraas/phalcon
基于Docker的PHP开发环境
Docker for PHP Developers
Docker在PHP项目开发环境中的应用
使用 Supervisor 来管理进程
PHP C扩展框架Phalcon
Alpine Linux,一个只有5M的Docker镜像
Pingback引用通告: 使用Docker Compose管理Docker容器 | 勇气
为什么我安装完后不管是用
[root@localhost html]# docker inspect web | grep IPAddress
“IPAddress”: “172.17.0.59”,
“SecondaryIPAddresses”: null,
这个ip 还是宿主机的ip 都是访问不了啊
请问怎么回事
172.17.0.1段的IP是docker预设置的,如果您的ip与其冲突,建议更该docker配置使用其他IP段,参考:http://stackoverflow.com/questions/20771269/change-docker-containers-ip-address。
Pingback引用通告: 基于Docker的Nginx + PHP-FPM + Phalcon镜像 - 未分类 - Adocker