一、準備工作:
使用工具:
1.主流版本的docker啡莉,本人使用的是 docker 1.91 版本
2.centos的官方docker鏡像作為基礎(chǔ)鏡像
3.nginx-1.9.12忠怖;php-5.5.34呢堰;supervisor
思路:
眾所周知,docker鏡像的制作有2種方法凡泣,一種是啟動一個容器并在容器里操作枉疼,再將容器提交為一個新的鏡像皮假;一種是寫Dockerfile,然后執(zhí)行dockerfile由docker給我們一步步自動生成新的鏡像骂维;顯然第二種方法更高大上惹资,也更適合容器需要不斷版本更替的場景。本人在安裝nginx和php的時候航闺,更習慣自己下載源碼編譯安裝褪测,所以編譯安裝這里寫Dockerfile實在是繁瑣,而且nginx+php并不是需要頻發(fā)更替版本潦刃,通常在制作容器前侮措,跟開發(fā)確定好版本號,制作好容器可以一直使用乖杠;所以以下我的操作里分扎,前半部分,nginx和php的安裝胧洒,我會在容器里操作畏吓;最后讓nginx和php同時啟動起來,我則是寫了一個Dockerfile略荡。
二庵佣、制作容器
1、啟動一個centos容器作為基礎(chǔ)鏡像
docker pull centos
docker run -it --name nginx centos bash
2汛兜、這樣就創(chuàng)建了一個以centos的官方鏡像為基礎(chǔ)的容器巴粪,并進如容器;在容器里用yum安裝wget命令和編譯安裝需要的命令粥谬,更新國內(nèi)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 https://sourceforge.net/projects/pcre/files/pcre/8.37/pcre-8.37.tar.gz
ps:所有pcre版本文件(https://sourceforge.net/projects/pcre/files/pcre)
wget http://cn2.php.net/distributions/php-5.5.34.tar.gz
3漏策、更新yum源
yum update
4派哲、復(fù)制源碼包到工作目錄下
mv *.gz /usr/local/src
cd /usr/local/src/
5、解壓源碼包后并刪除掺喻,建議刪除芭届,刪除的目的是不要讓最后的鏡像過于的大;tar自帶參數(shù)感耙,解壓同時刪除褂乍,忘記了。即硼。
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)創(chuàng)建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
make && make install
echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf #在nginx的配置文件里加上這一行很關(guān)鍵,這樣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
yum -y install libjpeg-devel
yum -y install libpng-devel
yum -y install freetype-devel
yum install libc-client-devel
2)編譯安裝php呀狼,如果過程中報錯,提示缺少什么安裝包损离,就用yum安裝哥艇。ps:可參考文章(http://www.reibang.com/p/d3d3ede407ce)
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解決依賴關(guān)系僻澎;如果當前的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;這個可以參考各種網(wǎng)上的資料垦藏;下面會給一個例子
/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
到此弟灼,容器基本就已經(jīng)制作完成了级解,接下來就是最重要的地方了,docker奉行的是一個容器跑一個進程的思想田绑,所以啟動容器的時候一般也只能啟動一個進程或者一個腳本勤哗;而nginx跟php要能同時工作,需要再在此基礎(chǔ)上做些工作掩驱!
一般有2個方法芒划,一種是寫腳本,但是我沒有成功欧穴。民逼。所以我用了supervisor,一個可以管理進程的工具苔可。接下來我會使用Dockefile完成最后的工作
三缴挖、讓這個鏡像可以跑起來!
1焚辅、Dockefile如下:在宿主機下創(chuàng)建一個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"]
如果出錯換成這個:
FROM Tom/nginx:v1
# Install supervisor
RUN yum install -y supervisor
ADD supervisor.conf /etc/supervisord.conf
EXPOSE 80 443
CMD ["/usr/bin/supervisord"]
2苟鸯、其中supervisor.conf內(nèi)容為:
[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贬循、創(chuàng)建幾個新的目錄
mkdir /data/nginx/{log,php.conf,data,conf} -p
其中l(wèi)og目錄我打算把nginx的日志映射到這個目錄下咸包,php.cof目錄我打算把php的配置文件映射到這個目錄下,data目錄我打算把網(wǎng)頁文件映射到這個目錄下杖虾,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目錄下