使用Docker搭建Laravel環(huán)境

現(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)用程序的composerartisan.也許還有更好運行環(huán)境的方式(例如瀏覽器).但是這是一個好的基礎(chǔ)整合Dokcer和Laravel.每個進(jìn)程都有一個自己的容器.

下面列出了我們要使用Docker鏡像:

有分離的composerartisan容器對我們來說真是一大優(yōu)勢,我們可以只選擇推送
docker-laravel-data,docker-laravel-nginxdocker-laravel-phpfpm容器
到生產(chǎn)環(huán)境.

我畫了一副流程圖可視化幫助理解,沿著獲取數(shù)據(jù)方向理解如何整合這些容器.

流程圖

你可以看到這些容器都將他們的/data定位到了docker-laravel-data容器.又可以
看到是從主目錄的~/myapp目錄定向到了/data.在~/myapp中我們有兩個目錄
wwwlogs.

  • 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)該很容易改
變一些路徑,就可以用于了LinuxWindows了.

創(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ù)

NginxPHP-FPM是分開的兩個進(jìn)程,因此,我們將分開它們不同容器的原因在這之前解釋清楚.

首先,我們先創(chuàng)建PHP-FPM的容器,注意這里我們使用-d選項,說明進(jìn)程將在后臺運行.PHP-FPM不是運行不成功,以為是像composerartisan那樣退出了,其實它只是在保持運行.我們要把它當(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/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容