現(xiàn)在有很多關(guān)于Docker的爭吵,這是正常的。因為Docker帶來了一個重大飛躍,app的集裝箱化活用,將搭建例如google和facebook那樣強大的數(shù)據(jù)中心的能力帶到了普通的開發(fā)者或系統(tǒng)管理員的手中。
Docker使用源生Linux內(nèi)核集裝成一個進(jìn)程,類似于將它們放入一個獨立的小倉庫里面,使得它們不會影響到系統(tǒng)的其他進(jìn)程。Docker常被用于部署,管理,和自動化構(gòu)建容器。集裝箱化,帶來和虛擬機相似等級的隔離,卻只耗費運行虛擬機管理程序的10%-15%的性能。看下面這部Docker創(chuàng)始人兼Docker的CTO的訪談,可以幫助你快速了解Docker。(油管鏈接,我就不貼了)。如果你想要了解更多背景,你可以訪問Dokcer的官網(wǎng)。
我開發(fā)的大多數(shù)應(yīng)用程序都是基于Laravel,所以我想看看使用Docker搭建一個本地開發(fā)環(huán)境,作為我的生產(chǎn)環(huán)境的一個鏡像。當(dāng)你僅僅部署應(yīng)用程序本身和它的依賴(像Nginx),與部署在傳統(tǒng)的虛擬機上相比,安全和穩(wěn)定的風(fēng)險將大大降低。而你仍然可以節(jié)省從開發(fā)環(huán)境到生產(chǎn)環(huán)境的時間.
網(wǎng)上很少文章是結(jié)合Larvel和Docker來講的.所有我們閱讀到的要使用Vagrant的概念,都可以直接使用Dokcer,本文中所有的進(jìn)程將運行在一個容器中.因為一些原因,這意味著你將錯過了一些Dokcer的真正優(yōu)點.我們想要一個進(jìn)程運行在一個容器中,我們將每個容器(即進(jìn)程)鏈接一個數(shù)據(jù)容器上,所有的應(yīng)用程序文件都保存在這個數(shù)據(jù)容器上.讓我們開始吧.
準(zhǔn)備你的開發(fā)環(huán)境
Docker使用集裝箱化技術(shù)專用于Linux, 所以如果你使用OS X或者Windows,則需要虛擬機.非linux的Docker包被稱之為Boot2Docker.
(注:Docker已經(jīng)宣布支持OS X和Windows了)
關(guān)于不同系統(tǒng)版本的安裝方式,參見Dokcer的官方文檔.Docker documentation
概述
獲取和啟動運行Lavavel應(yīng)用程序,我們不僅僅需要一個可以運行PHP的web服務(wù)器,我們也需要能夠運行PHP命令行應(yīng)用程序的composer和artisan.也許還有更好運行環(huán)境的方式(例如瀏覽器).但是這是一個好的基礎(chǔ)整合Dokcer和Laravel.每個進(jìn)程都有一個自己的容器.
下面列出了我們要使用Docker鏡像:
[dylanlindgren/docker-laravel-data](https://github.com/dylanlindgren/doc
ker-laravel-data) - 這個鏡像是用來創(chuàng)建我們的數(shù)據(jù)容器的.這個容器將提供我們的應(yīng)
用程序文件給其他容器訪問.dylanlindgren/docker-laravel-composer - 這個鏡像將創(chuàng)建一個允許我們使用
composer命令行的
容器.dylanlindgren/docker-laravel-artisan - 這個鏡像將創(chuàng)建一個允許我們使用
artisan命令行的容器.dylanlindgren/docker-laravel-phpfpm - PHP-FPM處理PHP文件.
dylanlindgren/docker-laravel-nginx - 一個Nginx服務(wù)器.這個容器將鏈接到我們的PHP-FPM容器上.
dylanlindgren/docker-laravel-bower - 瀏覽器.(可有可不有)
有分離的composer和artisan容器對我們來說真是一大優(yōu)勢,我們可以只選擇推送
docker-laravel-data,docker-laravel-nginx和docker-laravel-phpfpm容器
到生產(chǎn)環(huán)境.
我畫了一副流程圖可視化幫助理解,沿著獲取數(shù)據(jù)方向理解如何整合這些容器.

你可以看到這些容器都將他們的/data定位到了docker-laravel-data容器.又可以
看到是從主目錄的~/myapp目錄定向到了/data.在~/myapp中我們有兩個目錄
www和logs.
-
www- 包含我們的應(yīng)用程序文件(例如:public/index.php) -
logs- 存放Nginx的錯誤日志文件.
從Docker Hub上拉取這些鏡像非常容易,只需要在命令行(或boot2docker虛擬機)中運行
下面的命令:
$ docker pull dylanlindgren/docker-laravel-data && \
docker pull dylanlindgren/docker-laravel-composer && \
docker pull dylanlindgren/docker-laravel-artisan && \
docker pull dylanlindgren/docker-laravel-phpfpm && \
docker pull dylanlindgren/docker-laravel-nginx && \
docker pull dylanlindgren/docker-laravel-bower
這些鏡像也可以通過獲取上面GitHub上的Dockerfile,使用docker build命令來構(gòu)建.
不過那已經(jīng)是本教程之外的內(nèi)容了.
Docker&Laravel實踐
我使用2013年的MackBook Pro開發(fā),因此下面說明都是針對OS X環(huán)境的.應(yīng)該很容易改
變一些路徑,就可以用于了Linux和Windows了.
創(chuàng)建數(shù)據(jù)容器
創(chuàng)建兩個目錄在你的系統(tǒng)中~/myapp/www和~/myapp/logs.這個~/myapp/目錄映射
到數(shù)據(jù)容器中,提供給其他容器訪問應(yīng)用程序文件.
如果你已經(jīng)有了一Laravel app,將它的所有文件放入~/myapp/www目錄中.否則我們將
創(chuàng)建一個.
讓我們來創(chuàng)建我們的數(shù)據(jù)容器,并且將~/myapp/映射到這個容器的/data目錄上.
$ docker run --name myapp-data -v /Users/dylan/myapp:/data:rw dylanlindgren/docker-laravel-data
運行composer命令行
通過如下的命令執(zhí)行composer命令行:
$ docker run --privileged=true --volumes-from myapp-data --rm dylanlindgren/docker-laravel-composer
*your composer commands here*
哇!這真是一個好長的命令.誰想輸入這么長的命令只是為了簡單的運行composer dump-autoload?可以靈活的使用Bash的aliases使命令簡短.在.bashrc文件中添加下面的代碼.
alias myapp-composer="docker run --privileged=true --volumes-from myapp-data --rm dylanlindgren/docker-laravel-composer"
重新啟動終端的會話.你就可以通過myapp-composer命令行來運行composer了.
如果你想要創(chuàng)建一個新的Laravel app,執(zhí)行下面的命令,使用composer下載Laravel和它的依賴:
myapp-composer create-project laravel/laravel /data/www --prefer-dist
不要忘記適當(dāng)?shù)慕oapp/storage目錄權(quán)限,不然你可能會看到運行錯誤.
運行artisan命令行
artisan命令行的運行方式和運行composer命令行的方法相似:
$ docker run --privileged=true --volumes-from myapp-data --rm dylanlindgren/docker-laravel-artisan
*your artisan commands here*
同樣的,讓我們增加另一條配置到.bashrc中:
alias myapp-artisan="docker run --privileged=true --volumes-from myapp-data --rm dylanlindgren/docker-laravel-artisan"
重啟終端,你就可以通過myapp-artisan來運行artisan了.
Laravel服務(wù)
Nginx和PHP-FPM是分開的兩個進(jìn)程,因此,我們將分開它們不同容器的原因在這之前解釋清楚.
首先,我們先創(chuàng)建PHP-FPM的容器,注意這里我們使用-d選項,說明進(jìn)程將在后臺運行.PHP-FPM不是運行不成功,以為是像composer和artisan那樣退出了,其實它只是在保持運行.我們要把它當(dāng)做守護進(jìn)程那樣運行,這樣我們就可以做其他的事情,例如加載Nginx的容器.
如下運行PHP-FPM:
$ docker run --privileged=true --name myapp-php --volumes-from myapp-data -d dylanlindgren/docker-laravel-phpfpm
我們使用--link選項,當(dāng)我們創(chuàng)建Nginx容器的時候,鏈接到這個PHP-FPM容器,通過它們的ip來溝通數(shù)據(jù).(準(zhǔn)確來說是9000端口)
讓我們運行Nginx:
$ docker run --privileged=true --name myapp-web --volumes-from myapp-data -p 80:80 --link myapp-php:fpm -d dylanlindgren/docker-laravel-nginx
最后通過瀏覽器訪問http://localhost就可以看見Laravel的歡迎界面.

總結(jié)
希望通過運行本教程的案例,不僅僅只看到了Dokcer,更應(yīng)該明白Laravel開發(fā)是一個巨大的游戲規(guī)則.
原文地址:http://dylanlindgren.com/docker-for-the-laravel-framework/