給 PHP 開發者的 Docker 文件(一)
(本文譯自〈Docker for PHP Developers〉)
數年以來我都用 Vagarant 管理本地的開發伺服器,根據 Vagrant 網站所述,Vagrant 是用於創建、組態輕量的(light-weight)、可重製的(reproducible)、可移植的(portable)開發環境的工具。基本上,我的每個專案所需的特有的軟體組合都靠 Vagrant 幫忙創建(create)與腳本化實現(provision)。有 Vagrant,可以幫我們達成下面三件事:
- Vagrant 隔離每個專案的環境避免軟體衝突。
- Vagrant 讓專案的每個成員都擁有相同的軟體版本。
- Vagrant 建構的本地開發環境可相當於實際上線的環境。
不過咧!Vagrant 有個比較大的缺點,它依賴硬體層的虛擬化能力,這表示每個專案都是跑在完整的虛擬機內,而每個虛擬機內都是跑一個完完整整的作業系統,這吃掉了許多的系統資源(像是處理器、記憶體與以 gigabytes 計的磁碟空間),當數個專案同時一起跑起來時我最常見到的警告訊息就是:
您的啟動磁碟快滿了。Your startup disk is almost full.
邏輯上的解決方法是把數個專案跑在同一台 Vagrant 虛擬機內,著名的 Laravel Homestead 就是走這套策略,不過你的專案就再也無法彼此隔離了,也無法再為每個專案建構特有的伺服軟體架構(server software stack),然而好處是這節省了系統資源,並且簡化了基礎架構(infrastructure)的安裝與管理功夫。如果你想利用 Vagrant 管理本地專案的話,本人強力建議採用 Laravel Homestead 的單一虛擬機、多專案的架構。
不過本文要談的是另一種解決方案,先別說 Vagrant 了,你聽過 Docker 嗎?我是在一年前才首次聽說過這玩意,依我說啊,Docker 的精髓在於容器(container)。什麼是容器??老夫深入了解並閱讀了許許多多什麼容器化(containerization)、程序隔離(process isolation)、union filesystems 的文件後。那一大堆的專有名詞和概念開始繞著我的腦袋繞圈圈,在那天結束之時,我還在抓著我的頭疑惑著 Docker 是啥?以及 Docker 能幫我幹嘛?不過自此之後我學到很多,並且我想讓你知道,身為一個開發者,Docker 是如何地改變我的生涯。
(待續…)