1. 程式人生 > >製作nginx+php的docker映象及其使用技巧

製作nginx+php的docker映象及其使用技巧

一、準備工作:

使用工具:

  1. docker 1.91 版本

  2.centos的官方docker映象作為基礎映象

  3.nginx-1.9.12;php-5.5.34;supervisor

思路:

  docker映象的製作有2種方法,一種是啟動一個容器並在容器裡操作,再將容器提交為一個新的映象;一種是寫Dockerfile,然後執行dockerfile由docker給我們一步步自動生成新的映象;顯然第二種方法更高大上,也更適合容器需要不斷版本更替的場景。本人在安裝nginx和php的時候,更習慣自己下載原始碼編譯安裝,所以編譯安裝這裡寫Dockerfile實在是繁瑣,而且nginx+php並不是需要頻發更替版本,通常在製作容器前,跟開發確定好版本號,製作好容器可以一直使用;所以以下的操作,前半部分,nginx和php的安裝在容器裡操作;最後讓nginx和php同時啟動起來則是寫了一個Dockerfile。

二、製作容器

1、啟動一個centos容器作為基礎映象

  docker pull centos 

  docker run -it --name nginx centos bash

2、這樣就建立了一個以centos的官方映象為基礎的容器,並進如容器;在容器裡用yum安裝wget命令和編譯安裝需要的命令,更新國內yum源,下載Nginx,php原始碼

  yum install -y wget gcc gcc-c++ make openssl-devel

  wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

  wget http://nginx.org/download/nginx-1.9.12.tar.gz

  wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.37.tar.gz

  wget http://cn2.php.net/distributions/php-5.5.34.tar.gz

3、更新yum源

  yum update

4、複製原始碼包到工作目錄下

  mv *.gz /usr/local/src

  cd /usr/local/src/

5、解壓原始碼包後並刪除,建議刪除,刪除的目的是不要讓最後的映象過於的大;tar自帶引數,解壓同時刪除,忘記了。。

  tar xf nginx-1.9.12.tar.gz

  tar xf pcre-8.37.tar.gz

  tar xf php-5.5.34.tar.gz

  rm -f nginx-1.9.12.tar.gz pcre-8.37.tar.gz php-5.5.34.tar.gz

6、編譯安裝nginx:

  1)建立nginx使用者

    groupadd -r nginx

    useradd -r -g nginx nginx

  2)編譯安裝nginx

    cd nginx-1.9.12/

    ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-pcre=/usr/local/src/pcre-8.37

    echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf    #在nginx的配置檔案里加上這一行很關鍵,這樣nginx可以在docker啟動的時候在後臺執行!

7、編譯安裝php

  1)準備php的依賴包

    yum install -y bison bison-devel zlib-devel libmcrypt-devel mcrypt mhash-devel libxml2-devel libcurl-devel bzip2-devel readline-devel libedit-devel sqlite-devel 

  2)編譯安裝php,如果過程中報錯,提示缺少什麼安裝包,就用yum安裝。

    cd php-5.5.34/

    ./configure --prefix=/usr/local/php --with-zlib-dir --with-freetype-dir --enable-mbstring --with-libxml-dir=/usr/local/libxml --enable-soap --enable-calendar --with-curl --with-mcrypt --with-zlib --with-gd  --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --enable-exif --enable-bcmath --with-mhash --enable-zip --with-pcre-regex --with-mysql --with-pdo-mysql --with-mysqli --with-jpeg-dir=/usr/local/libjpeg --with-png-dir=/usr/local/libpng --enable-gd-native-ttf --with-openssl --with-fpm-user=www --with-fpm-group=www --with-libdir=lib64 --enable-ftp --with-imap --with-imap-ssl --with-kerberos --with-gettext --with-xmlrpc --with-xsl --enable-opcache --enable-fpm --enable-xml --enable-shmop --enable-session --enable-ctype --with-iconv-dir --with-iconv

    make && make install

  3)如果編譯安裝過程中報錯,按照報錯提示的去用yum解決依賴關係;如果當前的yum源解決不了,那麼可以試試:

    wget http://www.atomicorp.com/installers/atomic

    chmod +x atomic

    ./atomic 

    yum install -y XXX XXX

  4)準備php配置檔案

    cp php.ini-production /etc/php.ini

    cd /usr/local/php/etc

    cp php-fpm.conf.default php-fpm.conf

  5)修改php配置檔案,跟nginx里加一行的效果一樣,為了啟動docker時,php可以在後臺執行

    ;daemonize = yes的註釋去掉,並把yes改為no

  6)安裝php擴充套件,php的擴充套件很多,安裝方法也都大同小異,一下以memcached擴充套件為例

    wget https://pecl.php.net/get/memcache-2.2.7.tgz

    tar xf memcache-2.2.7.tgz

    cd memcache-2.2.7

    /usr/local/php/bin/phpize

    ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config --with-zlib-dir

    在php.ini裡新增一行extension=/usr/local/php/lib/php/extensions/memcache.so

  7)測試php-fpm啟動

    /usr/local/php/sbin/php-fpm -c /etc/php.ini -y /usr/local/php/etc/php-fpm.conf

    ps -ef | grep php-fpm

8、整合nginx跟php

  修改nginx.conf;這個可以參考各種網上的資料;下面會給一個例子

  /usr/local/nginx/sbin/nginx -t     #檢查沒配置檔案

  /usr/local/nginx/sbin/nginx         #啟動nginx

9、整理,刪除,清理yum快取,退出容器

  cd /usr/local/src/

  rm -fr *

  make clean

  yum clean all

  exit

10、提交容器

  docker commit -m “nginx-php” nginx Tom/nginx:v1

  到此,容器基本就已經制作完成了,接下來就是最重要的地方了,docker奉行的是一個容器跑一個程序的思想,所以啟動容器的時候一般也只能啟動一個程序或者一個指令碼;而nginx跟php要能同時工作,需要再在此基礎上做些工作!

  一般有2個方法,一種是寫指令碼,但是沒有成功。。所以用了supervisor,一個可以管理程序的工具。接下來會使用Dockefile完成最後的工作

三、讓這個映象可以跑起來!

1、Dockefile如下:在宿主機下建立一個nginx目錄,併到目錄下vim Dockefile

  FROM Tom/nginx:v1

  # Install supervisor   RUN yum install -y python-setuptools   RUN easy_install supervisor

  ADD supervisor.conf /etc/supervisord.conf

  EXPOSE 80 443

  CMD ["/usr/bin/supervisord"]

2、其中supervisor.conf內容為:

  [supervisord]   nodaemon=true

  [program:nginx]   command=/usr/local/nginx/sbin/nginx

  [program:php-fpm]   command=/usr/local/php/sbin/php-fpm -c /etc/php.ini -y /usr/local/php/etc/php-fpm.conf

3、執行Dockerfile

  docker build -t Tom/nginx-php .

  到這裡,這個映象就完成了,可以簡單的測試一下:

  docker run -d --name nginx-php -p 80:80 Tom/nginx-php

  然後用命令docker ps -a 檢視下這個容器是否正常啟動,如果有問題,可以docker logs -f nginx-php 檢視下這個容器啟動在哪裡出了問題。

三、nginx-php容器的使用技巧

1、建立幾個新的目錄

  mkdir /data/nginx/{log,php.conf,data,conf} -p

  其中log目錄我打算把nginx的日誌對映到這個目錄下,php.cof目錄我打算把php的配置檔案對映到這個目錄下,data目錄我打算把網頁檔案對映到這個目錄下,conf我打算把nginx的配置檔案對映到這個目錄下

2、nginx.conf示例

  worker_processes 1;

  events {     worker_connections 1024;   }

  http {

    server {       listen 80 default_server ;       server_name test.lala.com ;

      location / {         root /usr/share/nginx/web;         index index.html index.htm index.php api/login.php;       }

      error_page 500 502 503 504 /50x.html;       location = /50x.html {         root /usr/share/nginx/web;       }

      location ~ \.php$ {         root html;         fastcgi_pass 127.0.0.1:9000;         fastcgi_index index.php;         fastcgi_param SCRIPT_FILENAME /usr/share/nginx/web/$fastcgi_script_name;         include fastcgi_params;       }

    }

  }

  daemon off;

3、在/data/nginx/conf下準備好nginx.conf 在/data/nginx/php.conf 目錄下準備好php.ini和php-fpm.conf ;之後啟動容器的時候可以用命令:

  docker run -d --name nginx-php -v /etc/localtime:/etc/localtime:ro --restart=always -p 80:80 -v /data/nginx/log:/usr/local/nginx/logs/ -v /data/nginx/php.conf/php.ini:/etc/php.ini -v /data/nginx/php.conf/php-fpm.conf:/usr/local/php/etc/php-fpm.conf -v /data/nginx/data:/usr/share/nginx/web -v /data/nginx/conf:/usr/local/nginx/conf/  Tom/nginx-php

4、更新nginx下的web檔案,直接更新宿主機上/data/nginx/data/目錄下的檔案

5、如果要修改nginx的配置檔案,直接在宿主機上的/data/nginx/conf目錄下修改nginx.conf ;修改完成後,你可以使用下面命令:

  docker exec nginx-php /usr/local/nginx/sbin/nginx -t                              #檢查配置檔案是否正確

  docker exec nginx-php /usr/local/nginx/sbin/nginx -s reload        #讓容器裡的nginx重新讀取nginx配置檔案

6、如果要修改php的配置檔案,直接在宿主機上的/data/nginx/php.conf目錄下修改php.ini或者修改php-fpm.conf ;修改完成後要重啟容器才能生效

  docker restart nginx-php

7、容器裡的nginx日誌輸出對映到了宿主機上的/data/nginx/log目錄下