Docker Hello World

2018-07-24 15:26 更新

首先還是從一個(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è)問題:

  • 如果需要驗(yàn)證某個(gè)服務(wù)的不同版本,比如測試PHP5.3/5.4/5.5/5.6,就必須準(zhǔn)備4個(gè)鏡像,但其實(shí)每個(gè)鏡像只有很小的差異。
  • 如果開始新的項(xiàng)目,那么容器內(nèi)安裝的服務(wù)會(huì)不斷膨脹,最終無法弄清楚哪個(gè)服務(wù)是屬于哪個(gè)項(xiàng)目的。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)