天天看點

Docker Workflow(二):存儲問題

本文講的是<b>Docker Workflow(二):存儲問題</b>,【編者的話】作者繼續講述他們的Docker遷移之旅。這次他們的對手是Drupal及其檔案存儲,且看GlusterFS和Docker是如何配合輕松解決這個原本很棘手的問題。解決了這個問題,我們在開發環境與生産環境一緻的目标上又前進了一大步。

上一篇文章沒提及太多能幫你了解為什麼我們要這麼做的背景,如果你還在閱讀,請聽我慢慢道來。

在開始規劃遷移和制定新工作流時,我們建立了一個願望清單,其中包括了:100%的網站複制,以便将伺服器維護期間的當機時間減到最小,即便是流量很小的HTML網站也要運作至少2個執行個體在不同VM上。擁有一個彈性雲是願望清單裡的另一項,因為我們會時不時碰到流量高峰。

由于很多網站是使用Drupal制作的,在測試遷移時,這給我們提出了許多挑戰,其中最大的是存儲問題。

不過Drupal有時會帶來大麻煩。Drupal無法與S3順利對接,是以就算是我們想用S3,也需要花費數月時間來優化Drupal,而我們沒有時間和耐心去做這件事。

在使用GlusterFS之前,我們用的是NFS,但幾年前在配置的時候我們犯了個錯誤,隻配置了一台NFS VM。後來我們又犯了個錯誤,沒有将主機作業系統更新到下一個主版本,以至于在我們想這麼做時已經太遲了。我們聽聞了不少GlusterFS的贊譽,是以在需要重新安裝NFS時,我們決定先試試GlusterFS。

讓人意外的是,GlusterFS非常容易配置。我們建立了2台GlusterFS VM,它們互為備份,在一台發生當機時,另一台立即透明地開始提供檔案服務。如果未來需要擴充存儲方案,隻要建立擁有更大空間的新副本并關閉舊VM即可。

配置好GlusterFS,存儲層就搞定了,我們隻需要将每個Web節點連接配接上,這相當簡單。然後,我們隻需要将Docker引入這些節點。

Drupal會在<code>sites/default/files</code>目錄下寫入各種檔案。問題是,這些檔案是在Web應用裡面的。Drupal的首頁面檔案是<code>/var/www/index.php</code>,而其它檔案在<code>/var/www/sites/default/files</code>裡,如你所見,沒有任何關注點分離(separation of concerns),檔案和代碼通過這種方式混雜在幾個目錄中。就連Drupal自帶的.gitignore都包括了這個目錄,以免将這些檔案送出上去。

将<code>sites/default/files</code>移出<code>/var/www</code>也不可行,因為Drupal會給你制造障礙,如果你這麼做了,準備花時間來面對這些問題吧。

是以我們不得不使用共享。

我說過每個應用都有一個Dockerfile,而且這個Dockerfile使用了一個基礎鏡像。在開發一個應用時,我們會共享應用目錄讓代碼出現在<code>/var/www</code>裡,而當Jenkins建構鏡像時,它會将相同的應用目錄複制到<code>/var/www</code>中。從容器的角度來看,不論是共享還是複制,代碼是相同的;從開發人員角度來看,環境是與生産機一緻的。

要解決<code>/var/sites/default/files</code>的問題,我們就隻要将它共享給宿主,是以我們在Dockerfile中增加了一行:

同時,確定項目中不包含files目錄。Docker會建立這個目錄并将其映射到我們指定的地方。由于Maestro-NG可以很容易完成這件事(我會在下一篇文章講述),剩下的就非常簡單了。

為了讓事情更簡單,并進一步規範我們的工作流程,GlusterFS卷擁有如下結構:

然後,每個容器這樣映射<code>files</code>目錄:

每個Web節點會對這個目錄進行讀寫,正因為每個應用有一個單獨的目錄進行檔案讀寫,備份将更簡單。所有這些都把Drupal蒙騙了,因為它認為它讀寫的是<code>/var/www/sites/default/files</code>,但實際上它讀寫的是<code>/storage/files/subdomain.domain.com</code>。就是這樣!

Docker 1 比 Drupal 0。

開發這些網站時,我們并不需要下載下傳<code>files</code>目錄,因為我們将它們視為内容存儲在伺服器上,不過在啟動容器時,我們還是需要重建這個結構。我會在另外的文章中說一下我們是如何處理資料庫的。我們的實作方式是在項目根目錄包含一個<code>files</code>目錄,并将其添加到.gitignore檔案中,以免将其送出。

使用docker-compose(或fig)看起來是這樣的:

這樣,我們的應用映射到<code>/var/www</code>,同時Drupal有地方可以愉快地寫入檔案了。

感謝您的閱讀,有什麼想法或問題請留言。下一篇文章我将講述我們如何配置Maestro-NG,以及如何讓Jenkins處理繁重的工作。在最後一篇文章中,我将讨論我們使用的服務發現方案,以及我們碰到的負載均衡器的問題。

原文釋出時間為:2015-03-30 

本文作者:sean

本文來自雲栖社群合作夥伴DockerOne,了解相關資訊可以關注DockerOne。

原文标題:Docker Workflow(二):存儲問題