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

一、準備工作:

使用工具:

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市付燥,隨后出現(xiàn)的幾起案子宣谈,更是在濱河造成了極大的恐慌,老刑警劉巖键科,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闻丑,死亡現(xiàn)場離奇詭異,居然都是意外死亡勋颖,警方通過查閱死者的電腦和手機嗦嗡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饭玲,“玉大人侥祭,你說我怎么就攤上這事。” “怎么了矮冬?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵谈宛,是天一觀的道長。 經(jīng)常有香客問我胎署,道長吆录,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任琼牧,我火速辦了婚禮恢筝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巨坊。我一直安慰自己撬槽,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布趾撵。 她就那樣靜靜地躺著恢氯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鼓寺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天勋磕,我揣著相機與錄音妈候,去河邊找鬼。 笑死挂滓,一個胖子當著我的面吹牛苦银,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赶站,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼幔虏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贝椿?” 一聲冷哼從身側(cè)響起想括,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烙博,沒想到半個月后瑟蜈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡渣窜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年铺根,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乔宿。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡位迂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掂林,我是刑警寧澤臣缀,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站党饮,受9級特大地震影響肝陪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刑顺,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一氯窍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蹲堂,春花似錦狼讨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至朽基,卻和暖如春布隔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稼虎。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工衅檀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人霎俩。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓哀军,卻偏偏與公主長得像,于是被迫代替她去往敵國和親打却。 傳聞我的和親對象是個殘疾皇子杉适,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容