製作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目錄下