一、准備工作:
使用工具:
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目錄下
