您在這裡

用Docker來打造Drupal多樣化彈性環境

前言

Docker為一個從2013年起,短短一兩年間,迅速爆紅的輕量級虛擬化技術,不僅提供了開發與生產環境的迅速部署,更提供了前所未有的彈性,因此,也掀起了產業界內,一個更改系統架構的風潮。Drupal則是CMS專案當中,享負盛名數年,版本一直到了D7之後,更是成為眾多大型平台開發的選擇。如何整合Docker+Drupal,打造更多樣且彈性的環境,為本篇文章的目的。

網站公司現況是

  1. 無數網站丟在同一台伺服器

    VirtualHost絕對是伺服器公司最常用的一個服務,最常用的做法是,租一台好一點的實體主機或虛擬主機,接下來全部網站都塞進去,只要用Virtualhost,即可一個ip、一台伺服器多用,畢竟可以節省不少成本,也帶來了不少的便利。但是相對的,今天只要某一個服務掛了,大家當然也就一起拜拜了,所有客戶全部同進退:)

  2. 開發環境跟生產環境不同

    既然VirtualHost這麼好用,當然不會放過測試環境與開發環境,測試環境與開發環境雖然當初說的很好聽,為了要模擬實際伺服器的狀況,但是現況卻是不斷的安裝不一樣的東西,不斷的測試新的東西放在開發與測試環境上面,真的要上線的時候真的只能阿彌陀佛,祈禱不會出事。

  3. 版本不同不可能,插件要安裝就一起安裝

    總會遇到客戶的網站,有稍微特殊的功能,需要有版本的support或者需要伺服器額外安裝一些伺服器的插件時,就只能夠要裝,就讓整台伺服器的全部網站都有吧!這種狀況也是MIS心理的一個不確定因子。

  4. 如果要一個網站一個環境,那成本好高,備份好麻煩。

    為了避免上述問題,乾脆每一個客戶,我們都租一台獨立的虛擬機器吧!後來發現怎麼每一台利用率都好低,而且每年的伺服器費用,卻好高好高,到底該如何呢?

Docker輕量級虛擬化技術,快速提供想要的版本環境、開發環境、生產環境

自從2013年開始,Docker開始爆紅,再加上台灣在國際上Docker競賽得獎之後,各個網路產業都投入了這個方面的研究,而我們也不例外,想要利用這種輕量級的虛擬技術,來提供多元化的伺服器部署。畢竟小公司,不是像大公司擁有如此龐大的伺服器支援,但是為了要提供多元化的開發環境,總不能每個虛擬機都只提供給一個客戶造成資源的浪費,也不能所有的客戶都共用同一台伺服器,就連環境配置都也完全一樣,這些都是麻煩的問題。

Docker主要提供我們幾個優勢

  1. 任何一個我們想要的伺服器版本或軟體版本

    沒有錯,任何的版本。而且絕對是「乾淨」的版本。舉例來說,我們想要的環境為最新的「php7」+「mysql5.7」,完全沒有問題,還可以安裝任何你想要的插件在你的容器(container)中。環境不會再因為曾經安裝或做過什麼事情,而導致問題。

  2. 跟主機完全隔離

    因為Docker的容器其實為提供一個輕量級虛擬化技術,所以所有的行為其實都是在容器上面進行,所以基本上可以讓主機處於乾淨狀態,而又不影響到容器本身的彈性。

  3. 備份方便

    這個是一件很酷的事情,我們全部的服務都在容器上面進行,但是重要的檔案(php、media files、mysql lib)全部都跟Host主機Mount在一起,也就是說,環境交給容器,重要的檔案存在Host。

  4. 效能掌控

    每一個容器,我們都可以控制其效能,與任何一個服務。舉例來說:A容器php的檔案最大上傳量為2MB、記憶體為128MB。容器B可以最大上傳量為10MB、記憶體為256MB。這些都是很容易的事情呢。

Drupal Multisite 功能,共用Code真方便

Drupal是目前功能最多元也最強大的CMS,這篇就不多說了,而Drupal的Multisite,提供了共用code的功能,因此對於網路公司來說,是一大福音,在維護上面能夠節省不少時間,詳細的設定方式可以參考 Multi-site - Sharing the same code base,可以更進一步了解。

以下爲我們的實作方式

  1. 所有服務都分開,交給Container

    我們將webserver、MySql、Memcache等等各項服務,全部都用各自的容器來跑,並且將各項服務用link串連起來,並且將webserver的www資料夾、Mysql的/var/lib/mysql跟Host進行host,如此一來,就可以做到不同用容器控制環境,但是將web檔案與mysql資料庫備份出來的特性了。

  2. 將Drupal的Docker容器指到同一個Drupal目錄下

    由於Drupal Multisite的功能,會根據Drupal資料夾裡面的配置來達到共用核心模組的MultiSite效果,因此我們將眾多Container指到同一個Drupal資料夾,方便未來做更進一步的維護。

  3. 使用Nginx Reverse Proxy將不同的Domain分別導到不同的Container

    為了要同樣打到Virtual Host的效果,要在主機上面放多個乾淨的網站於不同容器上面是很必要的,因此要再加入Nginx的Reverse Proxy的設定才有辦法達到這樣的效果。

上圖算是做個簡單的例子說明,我們可以同時在Domain1、Domain2、Domain3用Drupal做出MultiSite,但是分別環境卻完全不同,有Nginx、有Apache、有些使用PHP7,甚至有些使用了Memcache,都完全不影響主機的環境,想要有什麼環境,都可以在幾分鐘甚至幾秒鐘間完成,開始享受Docker的強大吧。

結論:

對於網站公司來說,常常必須要面臨不同客戶不同環境的需求測試,並且又希望降低成本,讓伺服器最大化,有了Docker的特性,再加上Drupal MultiSite的特性,所有的問題,都可以解決了,不僅成功的降低成本,並且也將客戶所有未來可能的需求,都考慮進去了,是個非常非常好的方法。