docker簡介學習
一、環境配置的難題
軟體開發最大的麻煩事之一,就是環境配置。使用者計算機的環境都不相同,你怎麼知道自家的軟體,能在那些機器跑起來?
使用者必須保證兩件事:作業系統的設定,各種庫和元件的安裝。只有它們都正確,軟體才能執行。舉例來說,安裝一個 Python 應用,計算機必須有 Python 引擎,還必須有各種依賴,可能還要配置環境變數。
如果某些老舊的模組與當前環境不相容,那就麻煩了。開發者常常會說:"它在我的機器可以跑了"(It works on my machine),言下之意就是,其他機器很可能跑不了。
環境配置如此麻煩,換一臺機器,就要重來一次,曠日費時。很多人想到,能不能從根本上解決問題,軟體可以帶環境安裝
二、虛擬機器
虛擬機器(virtual machine)就是帶環境安裝的一種解決方案。它可以在一種作業系統裡面執行另一種作業系統,比如在 Windows 系統裡面執行 Linux 系統。應用程式對此毫無感知,因為虛擬機器看上去跟真實系統一模一樣,而對於底層系統來說,虛擬機器就是一個普通檔案,不需要了就刪掉,對其他部分毫無影響。
雖然使用者可以通過虛擬機器還原軟體的原始環境。但是,這個方案有幾個缺點。
1、資源佔用多
虛擬機器會獨佔一部分記憶體和硬碟空間。它執行的時候,其他程式就不能使用這些資源了。哪怕虛擬機器裡面的應用程式,真正使用的記憶體只有 1MB,虛擬機器依然需要幾百 MB 的記憶體才能執行。
2、冗餘步驟多
虛擬機器是完整的作業系統,一些系統級別的操作步驟,往往無法跳過,比如使用者登入。
3、啟動慢
啟動作業系統需要多久,啟動虛擬機器就需要多久。可能要等幾分鐘,應用程式才能真正執行。
三、Linux 容器
由於虛擬機器存在這些缺點,Linux 發展出了另一種虛擬化技術:Linux 容器(Linux Containers,縮寫為 LXC)。
Linux 容器不是模擬一個完整的作業系統,而是對程序進行隔離。或者說,在正常程序的外面套了一個保護層。對於容器裡面的程序來說,它接觸到的各種資源都是虛擬的,從而實現與底層系統的隔離。
由於容器是程序級別的,相比虛擬機器有很多優勢。
1、啟動快
容器裡面的應用,直接就是底層系統的一個程序,而不是虛擬機器內部的程序。所以,啟動容器相當於啟動本機的一個程序,而不是啟動一個作業系統,速度就快很多。
2、資源佔用少
容器只佔用需要的資源,不佔用那些沒有用到的資源;虛擬機器由於是完整的作業系統,不可避免要佔用所有資源。另外,多個容器可以共享資源,虛擬機器都是獨享資源。
3、體積小
容器只要包含用到的元件即可,而虛擬機器是整個作業系統的打包,所以容器檔案比虛擬機器檔案要小很多。
總之,容器有點像輕量級的虛擬機器,能夠提供虛擬化的環境,但是成本開銷小得多。
四、Docker 是什麼?
Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用介面。它是目前最流行的 Linux 容器解決方案。
Docker 將應用程式與該程式的依賴,打包在一個檔案裡面。執行這個檔案,就會生成一個虛擬容器。程式在這個虛擬容器裡執行,就好像在真實的物理機上執行一樣。有了 Docker,就不用擔心環境問題。
總體來說,Docker 的介面相當簡單,使用者可以方便地建立和使用容器,把自己的應用放入容器。容器還可以進行版本管理、複製、分享、修改,就像管理普通的程式碼一樣。
五、Docker 的用途
Docker 的主要用途,目前有三大類。
1、提供一次性的環境。比如,本地測試他人的軟體、持續整合的時候提供單元測試和構建的環境。
2、提供彈性的雲服務。因為 Docker 容器可以隨開隨關,很適合動態擴容和縮容。
3、組建微服務架構。通過多個容器,一臺機器可以跑多個服務,因此在本機就可以模擬出微服務架構。
六、Docker 的安裝
Docker 是一個開源的商業產品,有兩個版本:社群版(Community Edition,縮寫為 CE)和企業版(Enterprise Edition,縮寫為 EE)。企業版包含了一些收費服務,個人開發者一般用不到。下面的介紹都針對社群版。
Docker CE 的安裝請參考官方文件。
安裝完成後,執行下面的命令,驗證是否安裝成功。
$ docker version
# 或者
$ docker info
Docker 需要使用者具有 sudo 許可權,為了避免每次命令都輸入sudo
,可以把使用者加入 Docker 使用者組(官方文件)。
$ sudo usermod -aG docker $USER
Docker 是伺服器----客戶端架構。命令列執行docker
命令的時候,需要本機有 Docker 服務。如果這項服務沒有啟動,可以用下面的命令啟動(官方文件)。
# service 命令的用法
$ sudo service docker start
# systemctl 命令的用法
$ sudo systemctl start docker