制作nginx+php的docker鏡像及其使用技巧


一、准備工作:

使用工具:

  1.主流版本的docker,本人使用的是 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目錄下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM