View the directory structure of nginx and php:
[root@docker docker_demo]# tree nginx nginx ├── Dockerfile ├── fastcgi_params ├── nginx-1.8.1.tar.gz ├── nginx.conf └── www.conf
[root@docker docker_demo]# tree php php ├── Dockerfile ├── init.d.php-fpm ├── libmcrypt-2.5.7.tar.gz ├── php-5.6.30.tar.bz2 ├── php-fpm.conf.default └── php.ini-production
Here, the construction process of nginx and php will be described in detail, as well as all the toolkits and configuration files used in the construction process
First introduce the construction of nginx, check the Dockerfile of nginx:
[root@docker nginx]# cat Dockerfile FROM centos_init:v2 MAINTAINER json_hc@163.com RUN useradd -M -s /sbin/nologin www ADD nginx-1.8.1.tar.gz /usr/local/src RUN yum install libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel WORKDIR /usr/local/src/nginx-1.8.1 RUN ./configure --user=www --group=www --prefix=/usr/local/nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_spdy_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install COPY nginx.conf /usr/local/nginx/conf/nginx.conf COPY fastcgi_params /usr/local/nginx/conf/fastcgi_params RUN mkdir /usr/local/nginx/conf/vhost COPY www.conf /usr/local/nginx/conf/vhost/www.conf EXPOSE 80 CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
From the base image above, it can be seen that it is centos_init:v2, and the Dockerfile of the image is posted here:
[root@docker nginx]# cat ../init/Dockerfile # base image FROM centos # MAINTAINER MAINTAINER json_hc@163.com # backup CentOS-Base.repo to CentOS-Base.repo.bak RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak # add epel and aliyun repo to /etc/yum.repos.d COPY CentOS7-Base-163.repo /etc/yum.repos.d/CentOS7-Base-163.repo COPY epel-release-latest-7.noarch.rpm /etc/yum.repos.d/ # install epel.repo WORKDIR /etc/yum.repos.d/ RUN yum install -y epel-release-latest-7.noarch.rpm RUN yum clean all # running required command RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel ntpdate crontabs # change timzone to Asia/Shanghai RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
centos_init:v2镜像添加了repo的环境和编译的环境,而centos镜像就是初始的官方镜像
下面回归到nginx的构建文件:
从nginx的Dockerfile文件中可以看出,安装nginx采用的编译安装,创建了用户www和安装了nginx的一些依赖包,copy了一些配置文件到镜像中,这里
用到的配置文件将会全部放置到github上供参考,然后通过Dockerfile进行构建nginx镜像:
# docker build -t nginx:v1 .
这里需要介绍配置文件:
[root@docker nginx]# cat www.conf server { listen 80; root /usr/local/nginx/html; index index.htm index.html index.php; location ~ \.php$ { root /usr/local/nginx/html; fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
可以看见fastcgi_pass php:9000;
这是因为php也是一个容器,和nginx是隔离的,后面nginx将会通过--link的方式与php镜像进行互联访问
查看php的Dockerfile文件:
[root@docker php]# cat Dockerfile FROM centos_init:v2 MAINTAINER json_hc@163.com ADD libmcrypt-2.5.7.tar.gz /usr/local/src WORKDIR /usr/local/src/libmcrypt-2.5.7 RUN ./configure && make && make install ADD php-5.6.30.tar.bz2 /usr/local/src RUN yum -y install libxml2 libxml2-devel bzip2 bzip2-devel libjpeg-turbo libjpeg-turbo-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel libcurl libcurl-devel WORKDIR /usr/local/src/php-5.6.30 RUN ./configure --prefix=/usr/local/php --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd --with-openssl --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-mcrypt --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --enable-fpm --with-config-file-path=/usr/local/php/etc --with-bz2 --with-gd && make && make install COPY php.ini-production /usr/local/php/etc/php.ini COPY php-fpm.conf.default /usr/local/php/etc/php-fpm.conf RUN useradd -M -s /sbin/nologin php RUN sed -i -e 's@;pid = run/php-fpm.pid@pid = run/php-fpm.pid@g' -e 's@nobody@php@g' -e 's@listen = 127.0.0.1:9000@listen = 0.0.0.0:9000@g' /usr/local/php/etc/php-fpm.conf RUN sed -i 's@;daemonize = yes@daemonize = no@g' /usr/local/php/etc/php-fpm.conf EXPOSE 9000 CMD ["/usr/local/php/sbin/php-fpm"]
构建的服务必须运行在前台,而对于nginx来说:
daemon off表示将后台运行关闭了,于是运行在前台
而对于phh:sed -i 's@;daemonize = yes@daemonize = no@g' /usr/local/php/etc/php-fpm.conf
这里也是将daemon模式关闭了,于是/usr/local/php/sbin/php-fpm运行在前台
开始进行构建php:
[root@docker php]# docker build -t php .
查看生成的镜像:
[root@docker php]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE php latest 8902ce599658 5 minutes ago 1.08GB nginx latest c3babfeba09b 22 minutes ago 578MB
利用构建的镜像启动php、nginx服务:
[root@docker php]# docker run -d --name=php -v /www:/usr/local/nginx/html php 538d9866defefe8c818fbebc7109a1cf8d271583f7ce6d14d4483a103a212903 [root@docker php]# docker run -d --name=nginx -p80:80 -v /www:/usr/local/nginx/html --link=php:php nginx c476e0e2b37f5400ea2175b9a3fc61636190727576187f3feb9248fea37ffd81
上面启动php的容器时,使用了-v进行映射,如果这里不进行映射,那么php的程序会启动,但是遇到php结尾的文件将不会解析,出现file not found的错误
查看容器状态:
[root@docker php]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c476e0e2b37f nginx "/usr/local/nginx/..." 11 seconds ago Up 10 seconds 0.0.0.0:80->80/tcp nginx 538d9866defe php "/usr/local/php/sb..." 39 seconds ago Up 38 seconds 9000/tcp php
网站目录结构:
[root@docker www]# tree .
.
├── index.html
└── test.php
进入到php容器查看hosts文件:
[root@docker php]# docker exec -it php /bin/bash [root@538d9866defe php-5.6.30]# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.4 538d9866defe
查看nginx的hosts文件:
[root@docker php]# docker exec -it nginx /bin/bash [root@c476e0e2b37f nginx-1.8.1]# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.4 php 538d9866defe 172.17.0.5 c476e0e2b37f
可以看见有一条php的解析,这就是为什么nginx能够和php进行通信的缘由(通过--link进行指定)
The configuration file is hosted on github: https://github.com/jsonhc/docker_project/tree/master/docker_dockerfile/lnmp