導(dǎo)語(yǔ)
下面內(nèi)容將介紹如何把容器當(dāng)作一個(gè)命令來(lái)使用以及搭建一套php+nginx的 web 服務(wù),這里需要兩個(gè)鏡像,用兩個(gè)鏡像的主要目的是學(xué)習(xí)如何讓 Docker 容器之間相互通信。閱讀完下面的內(nèi)容就可以搭建自己的 Docker 服務(wù)了。
把 php 容器當(dāng)作命令行使用
鏡像下載:
docker pull php:7.0-fpm-alpine php
這里的鏡像是基于 alpine 系統(tǒng)的,因?yàn)榛赼lpine系統(tǒng)的鏡像文件會(huì)比較小,下載速度更快。由于國(guó)內(nèi)下載鏡像文件較慢,推薦使用鏡像加速器DaoCloud。

下載鏡像是為了搭建一個(gè) web 服務(wù),如果只想簡(jiǎn)單的使用 php 命令行,怎么辦?我們知道從鏡像啟動(dòng)的容器中肯定是可以使用命令行,如果每次使用 php 命令行都進(jìn)入容器,顯得特別麻煩,其實(shí) Docker 可以這樣用:
docker run -it --rm php:7.0-fpm-alpine php --version

命令比較長(zhǎng),給它設(shè)置個(gè)別名就好多了。下面介紹下相關(guān)參數(shù):
-i:以交互模式運(yùn)行容器,通常與 -t 同時(shí)使用;
-t: 為容器重新分配一個(gè)偽輸入終端,通常與 -i 同時(shí)使用;
--rm:容器退出時(shí)自動(dòng)刪除,如果不加這個(gè)參數(shù),當(dāng)你執(zhí)行完上面的命令,php容器會(huì)退出,變?yōu)橐粋€(gè)暫停狀態(tài)的容器,通過(guò)
docker ps -a 可以查詢到;php --version:在容器名后面的字符會(huì)被當(dāng)作容器的shell命令來(lái)處理;
*注:關(guān)于參數(shù) -i -t ,這里上面的命令可以不加,因?yàn)闆](méi)有交互操作,在使用node容器的命令行時(shí)會(huì)有交互,需要加上,兩個(gè)參數(shù)同時(shí)使用就好:
docker run -i -t --rm node:alpine node

想用容器同時(shí)執(zhí)行多個(gè)命令,不能直接在后面加 &&,需要使用 sh -c來(lái)實(shí)現(xiàn),:
docker run --rm php:7.0-fpm-alpine sh -c ' echo "123" && echo "456" '
啟動(dòng)php服務(wù)
執(zhí)行命令:
docker run \
-d \
--name php \
-v /root/docker/etc/php/php.ini:/usr/local/etc/php/conf.d/php.ini:ro \
-v /root/docker/html:/var/www/html \
php:7.0-fpm-alpine
-d:后臺(tái)運(yùn)行容器,并且返回容器 ID;
--name:給容器命名,容器名是唯一的,操作容器時(shí)可以使用名稱代替容器 ID;
:ro:表示掛載的文件或者文件夾為只讀模式;
從命令可以知道容器是后臺(tái)運(yùn)行,名字是 php,它掛載了主機(jī)的一個(gè)文件 php.ini 和一個(gè)目錄 /root/docker/html,并且 php.ini 是只讀的,所以在容器內(nèi)不可以對(duì)這個(gè)文件做修改。/usr/local/etc/php/conf.d 這個(gè)目錄是容器中的 php 讀取用戶自定義配置文件的目錄,正常情況下都可以在 Docker Hub 上有說(shuō)明,如果沒(méi)有可以自己運(yùn)行 phpinfo(); 來(lái)查看。之前介紹過(guò),只要掛載,那么本地主機(jī)目錄就會(huì)和容器內(nèi)的目錄同步。需要修改容器的 php 配置時(shí),只要在主機(jī)本地編輯保存這個(gè) php.ini 文件,然后執(zhí)行:
docker restart php (php是容器名字)
php 容器和 nginx 容器通信
首先下載nginx鏡像:
docker pull nginx:stable-alpine
啟動(dòng) nginx 服務(wù):
docker run \
-d \
--link php \
--name nginx \
-v /root/docker/etc/nginx/conf.d/:/etc/nginx/conf.d/ \
-v /root/docker/html:/var/www/html \
-v /var/log/nginx:/var/log/nginx \
-p 8088:80 \
nginx:stable-alpine
--link:確保 nginx 可以與 php 之間通信,在 nginx 容器中直接 ping php 是可以通的,實(shí)際上加上這個(gè)參數(shù)后,會(huì)在 nginx 容器增加 host 解析,如圖:

增加 nginx 虛擬主機(jī)配置,放到主機(jī)目錄 /root/docker/etc/nginx/conf.d 下:
server {
listen 80;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log debug;
}
fastcgi_pass 后面使用的 php 就是 --link 參數(shù)增加的host解析,直接用別名代替ip地址,更加方便。然后重啟 nginx 服務(wù):
docker restart nginx
在 主機(jī)本地的 /root/docker/html 目錄新建 index.php:
echo "<?php\nphpinfo();" | tee /root/docker/html/index.php
現(xiàn)在一個(gè) web 服務(wù)搭建好了,如圖:

查看 nginx 日志
容器內(nèi) nginx 的日志會(huì)寫入容器內(nèi)的 /var/log/nginx 目錄下,由于這個(gè)目錄和主機(jī)的 /var/log/nginx 目錄是同步的,所以,想看容器內(nèi) nginx 的日志,查看主機(jī)的文件 /var/log/nginx/access.log 就可以:
tail -f /var/log/nginx/access.log

結(jié)語(yǔ)
基本的啟動(dòng)配置服務(wù)的命令上面都有介紹,自己可以嘗試給這個(gè) web 服務(wù)增加個(gè) mysql
存儲(chǔ)功能。