當下的問題
開發、測試、生產等環境的不同可能導致應用程序運行的結果有所不同,甚至會出現錯誤:
- 如:各環境中的JDK、Tomcat、MySQL等版本各有不同;
- 在JDK1.6中寫的代碼可能在JDK1.8中已經Deprecated了;
- 在JDK1.8中寫的代碼可能在JDK1.6中還不支持。
需要在一個項目的多個版本中進行切換時很不方便,項目轉移服務器時很不方便:
- 如有一個博客,在1.0這個版本中不允許網友發博文,在2.0這個版本中允許網友發博文,在運行了2.0版本一段時間後需要切換到1.0時就相對較麻煩(除非在服務器上存有多個版本);
- 當需要將此博客網站移到其他服務器是顯得有些麻煩,特別是轉移後還有可能需要在多個版本中切換使用,轉移過程也可能會導致數據丟失或操作錯誤等問題。
多人使用同一臺服務器時的尷尬問題難以解決:
- 多人使用同一服務器的問題最爲嚴重,因爲每個人的開發環境都有可能不同,各種服務工具的版本不統一問題、各種配置習慣不統一的問題等;
- 在服務器運維過程中很難同時滿足諸多開發者的不同需求;
- 也很難在同一服務器上安裝多個不同版本的JDK、Tomcat、MySQL等
- ……
Docker概述
Docker的誕生可以很輕鬆的解決上述的各種問題,並且Docker的作用遠不止這些。
先來看一下在Docker中的幾個比較關鍵的組件:
- 容器 - Docker運行的最小單位:
- 每個容器都是一個輕量級的虛擬機;
- 每個容器都擁有獨立的root文件系統、網絡服務、進程服務等
- 容器與容器之間可以互不干擾,容器不會關心其他容器內部運行的是什麼東西,所以通過容器可以讓一臺服務器內安裝不同版本的JDK、Tomcat等(只要運行在不同的容器內部即可);
- 一般一個容器只幹一件事情,如:一個容器內只運行Tomcat,另一容器內只運行MySQL。
- 鏡像 - 用於產生容器:
- 一個鏡像可以產生很多容器;
- 鏡像可以在本地創建,創建成功後即可啓動容器運行;
- 可以將鏡像推送(push)到Registry(倉庫)中;
- 可以將Registry(倉庫)中的鏡像拉取(pull)到本地。
- Registry(倉庫)- 用於存放鏡像:
- Registry可以是官方的,也可以是國內知名的(如阿里雲的),也可以是私有的;
- 由於倉庫在遠程,所以爲應用程序的移植提供的便利。
Docker的原理及各個重要組件間的關係可以通過下圖有所認識: