首先還是從一個PHP在Docker容器下的Hello World實例開始。我們準備這樣一個PHP文件index.php
:
echo "PHP in Docker";
然后在同目錄下創(chuàng)建文本文件并命名為Dockerfile
,內(nèi)容為:
# 從官方PHP鏡像構(gòu)建
FROM php
# 將index.php復(fù)制到容器內(nèi)的/var/www目錄下
ADD index.php /var/www
# 對外暴露8080端口
EXPOSE 8080
# 設(shè)置容器默認工作目錄為/var/www
WORKDIR /var/www
# 容器運行后默認執(zhí)行的指令
ENTRYPOINT ["php", "-S", "0.0.0.0:8080"]
構(gòu)建這個容器:
docker build -t allovince/php-helloworld .
運行這個容器
docker run -d -p 8080:8080 allovince/php-helloworld
查看結(jié)果:
curl localhost:8080
PHP in Docker
這樣我們就創(chuàng)建了一個用于演示PHP程序的Docker容器,任何安裝過Docker的機器都可以運行這個容器獲得同樣的結(jié)果。而任何有上面的php文件和Dockerfile的人都可以構(gòu)建出相同的容器,從而完全消除了不同環(huán)境,不同版本可能引起的各種問題。
想象一下程序進一步復(fù)雜,我們應(yīng)該如何擴展呢,很直接的想法是繼續(xù)在容器內(nèi)安裝其他用到的服務(wù),并將所有服務(wù)運行起來,那么我們的Dockerfile很可能發(fā)展成這個樣子:
FROM php
ADD index.php /var/www
# 安裝更多服務(wù)
RUN apt-get install -y \
mysql-server \
nginx \
php5-fpm \
php5-mysql
# 編寫一個啟動腳本啟動所有服務(wù)
ENTRYPOINT ["/opt/bin/php-nginx-mysql-start.sh"]
雖然我們通過Docker構(gòu)建了一個開發(fā)環(huán)境,但覺不覺得有些似曾相識呢。沒錯,其實這種做法和制作一個虛擬機鏡像是差不多的,這種方式存在幾個問題:
更多建議: