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