1. 程式人生 > >Docker 第一篇 |Docker的介紹和安裝

Docker 第一篇 |Docker的介紹和安裝

Docker :

Docker是一種新興的虛擬化技術,能夠一定程度上的代替傳統虛擬機器,但更準確的說法,其實應該是一個虛擬環境。
Docker簡介參考:《Docker — 從入門到實踐》

  • Docker的思想來自於集裝箱,集裝箱解決了什麼問題?在一艘大船上,可以把貨物規整的擺放起來。並且各種各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那麼我就不需要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱裡封裝的好好的,那我就可以用一艘大船把他們都運走。

  • docker就是類似的理念。現在都流行雲計算了,雲端計算就好比大貨輪。docker就是集裝箱。

    1.不同的應用程式可能會有不同的應用環境,比如.net開發的網站和php開發的網站依賴的軟體就不一樣,如果把他們依賴的軟體都安裝在一個伺服器上就要除錯很久,而且很麻煩,還會造成一些衝突。比如IIS和Apache訪問埠衝突。這個時候你就要隔離.net開發的網站和php開發的網站。常規來講,我們可以在伺服器上建立不同的虛擬機器在不同的虛擬機器上放置不同的應用,但是虛擬機器開銷比較高。docker可以實現虛擬機器隔離應用環境的功能,並且開銷比虛擬機器小,小就意味著省錢了。

    2.你開發軟體的時候用的是Ubuntu,但是運維管理的都是centos,運維在把你的軟體從開發環境轉移到生產環境的時候就會遇到一些Ubuntu轉centos的問題,比如:有個特殊版本的資料庫,只有Ubuntu支援,centos不支援,在轉移的過程當中運維就得想辦法解決這樣的問題。這時候要是有docker你就可以把開發環境直接封裝轉移給運維,運維直接部署你給他的docker就可以了。而且部署速度快。

    3.在伺服器負載方面,如果你單獨開一個虛擬機器,那麼虛擬機器會佔用空閒記憶體的,docker部署的話,這些記憶體就會利用起來。

    總之docker就是集裝箱原理。

Docker的3個重要的概念:


映象(Image)

  • 映象,從認識上簡單的來說,就是面向物件中的類,相當於一個模板。從本質上來說,映象相當於一個檔案系統。 Docker
    映象是一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數(如匿名卷、環境變數、使用者等)。映象不包含任何動態資料,是靜態的、可以被使用者互相分享的檔案系統,其內容在構建之後也不會被改變。

容器(Container)

  • 前面說過,映象是靜態不可操作的,只能被分享和下載,那什麼是能被操作的呢?就是容器。所以容器可以理解為映象的動態狀態。
  • 容器,從認識上來說,就是類建立的例項,就是依據映象這個模板創建出來的實體。容器的實質是程序,但與直接在宿主執行的程序不同,容器程序運行於屬於自己的獨立的名稱空間。因此容器可以擁有自己的root
    檔案系統、自己的網路配置、自己的程序空間,甚至自己的使用者ID
    空間。容器內的程序是執行在一個隔離的環境裡,使用起來,就好像是在一個獨立於宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主執行更加安全。容器一旦被直接推出,之前安裝的gcc,vim等軟體以及配置就會全部gg掉,不會儲存在映象中,但是容器還是存在,未被刪除,所以重新啟動容器,之前對於容器的配置仍然存在。如果要持久的儲存修改,就需要將當前容器封裝成一個新的映象,這樣下次啟動這個新的映象後之前作出的修改還都在。
  • 容器執行在一個獨立空間的程序中,和宿主程序不一樣。內部的程序執行在容器本身這個獨立空間中,使得其更加安全。

倉庫(Repository)

  • 倉庫,從認識上來說,就好像軟體包上傳下載站,有各種軟體的不同版本被上傳供使用者下載。映象構建完成後,可以很容易的在當前宿主機上執行,但是,如果需要在其它伺服器上使用這個映象,我們就需要一個集中的儲存、分發映象的服務,Docker Registry 就是這樣的服務。
  • Docker中的倉庫很像git的程式碼倉庫,你可以pull自己之前push到自己倉庫的映象到本地,也可以pull別人push到公共倉庫的映象到自己本地。

Docker的優勢 :

  • 更高效的利用系統資源:由於容器不需要進行硬體虛擬以及執行完整作業系統等額外開銷,Docker
    對系統資源的利用率更高。無論是應用執行速度、記憶體損耗或者檔案儲存速度,都要比傳統虛擬機器技術更高效。因此,相比虛擬機器技術,一個相同配置的主機,往往可以執行更多數量的應用。

  • 更快速的啟動時間:傳統的虛擬機器技術啟動應用服務往往需要數分鐘,而Docker
    容器應用,由於直接運行於宿主核心,無需啟動完整的作業系統,因此可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間。

  • 一致的執行環境:開發過程中一個常見的問題是環境一致性問題。由於開發環境、測試環境、生產環境不一 致,導致有些bug
    並未在開發過程中被發現。而Docker
    的映象提供了除核心外完整的執行時環境,確保了應用執行環境一致性,從而不會再出現「這段程式碼在我機器上沒問題啊」這類問題。

  • 持續交付和部署:Docker是build once,run everywhere. 使用Docker
    可以通過定製應用映象來實現持續整合、持續交付、部署。開發人員可以通過Dockerfile
    來進行映象構建,並結合持續整合(Continuous Integration)
    系統進行整合測試,而運維人員則可以直接在生產環境中快速部署該映象,甚至結合持續部署(Continuous
    Delivery/Deployment) 系統進行自動部署。

  • 更輕鬆的遷移:Docker
    使用的分層儲存以及映象的技術,使得應用重複部分的複用更為容易,也使得應用的維護更新更加簡單,基於基礎映象進一步擴充套件映象也變得非常簡單。此外,Docker
    團隊同各個開源專案團隊一起維護了一大批高質量的官方映象,既可以直接在生產環境使用,又可以作為基礎進一步定製,大大的降低了應用服務的映象製作成本。使用Dockerfile
    使映象構建透明化,不僅僅開發團隊可以理解應用執行環境,也方便運維團隊理解應用執行所需條件,幫助更好的生產環境中部署該映象。

Docker版本 :
Docker 劃分為CE 和EE。CE 即社群版(免費,支援週期三個月),EE 即企業版,強調安全,付費使用。Docker在1.13 版本之後,從2017年的3月1日開始,版本命名規則變為如下(stable 穩定版 Edge 試用版):
在這裡插入圖片描述

分層儲存 :

  • 因為映象包含作業系統完整的root 檔案系統,其體積往往是龐大的,因此在Docker設計時,就充分利用Union FS
    的技術,將其設計為分層儲存的架構。所以嚴格來說,映象並非是像一個ISO
    那樣的打包檔案,映象只是一個虛擬的概念,其實際體現並非由一個檔案組成,而是由一組檔案系統組成,或者說,由多層檔案系統聯合組成。
  • 映象構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在自己這一層。比如,刪除前一層檔案的操作,實際不是真的刪除前一層的檔案,而是僅在當前層標記為該檔案已刪除。在最終容器執行的時候,雖然不會看到這個檔案,但是實際上該檔案會一直跟隨映象。因此,在構建映象的時候,需要額外小心,每一層儘量只包含該層需要新增的東西,任何額外的東西應該在該層構建結束前清理掉。
  • 分層儲存的特徵還使得映象的複用、定製變的更為容易。甚至可以用之前構建好的映象作為基礎層,然後進一步新增新的層,以定製自己所需的內容,構建新的映象。

Docker的C/S模式
Docker 採用了C/S 架構,包括客戶端和服務端。Docker 守護程序(Daemon)作為服務端,接受來自客戶端的請求,並處理這些請求(建立、執行、分發容器)。
在這裡插入圖片描述

Docker 守護程序一般在宿主主機後臺執行,等待接收來自客戶端的訊息;Docker 客戶端則為使用者提供一系列可執行命令,使用者用這些命令實現跟Docker 守護程序互動。我們之前在Win10的命令列中便是最主要的客戶端:
在這裡插入圖片描述

Docker也為我們提供了Remote API來操作Docker的守護程序,也意味著我們可以通過自己的程式來控制Docker的執行。客戶端和服務端既可以執行在一個機器上,也可通過socket 或者RESTful API 來進行通訊:
在這裡插入圖片描述

至於Docker的客戶端與守護程序之間的通訊,其連線方式為socket連線。主要有三種socket連線方式:

  • unix:///var/run/docker.sock
  • tcp://host:port
  • fd://socketfd
    完整的Docker的C/S連線方式的本質可以一般表示為如下:
    在這裡插入圖片描述

安裝Docker :

  • Docker支援64 位版本的Windows 10 Pro,且必須開啟Hyper-V。開啟方式為:開啟“控制面板”->“程式”->
    “啟動或關閉Windows功能”,找到Hyper-V並勾選,確定重啟電腦。

安裝下載好的Docker for Windows Installer.exe,如下:
在這裡插入圖片描述

鑑於國內網路問題,後續拉取Docker映象十分緩慢,需要配置國內映象加速,在系統右下角托盤Docker 圖示內右鍵選單選擇Settings,開啟配置視窗後左側導航選單選擇Daemon,在Registry mirrors 一欄中填寫加速器地址
https://registry.docker-cn.com ,之後點選Apply儲存後Docker就會重啟並應用配置的映象地址了。
在這裡插入圖片描述

  • 不同版本的DOCKER這個設定不同,有的是:Registry mirrors = [“加速器地址”]

執行Docker的時候有可能出現如下問題:
在這裡插入圖片描述

解決方法:
1,進入控制面板 - > [程式] - > [Windows功能]並完全取消選中所有與Hyper-V相關的元件。重新啟動系統。
再次啟用Hyper-V。重新開始。
2,如果方法1不能解決,那麼可能是電腦的BIOS的設定未開啟虛擬環境,進入電腦系統的BIOS系統,找到這個Intel Virtualization Technology選項,將其設定為ENABLE(開啟狀態),然後重啟電腦即可。

Ubuntu上的安裝 :
在Ubuntu系統中安裝較為簡單,官方提供了指令碼供我們進行安裝。

sudo apt install curl
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

執行這個命令後,指令碼就會自動的將一切準備工作做好,並且把Docker CE 的Edge版本安裝在系統中。

啟動Docker CE

sudo systemctl enable docker
sudo systemctl start docker

建立docker 使用者組
預設情況下,docker 命令會使用Unix socket 與Docker 引擎通訊。而只有root 使用者和docker 組的使用者才可以訪問Docker 引擎的Unix socket。出於安全考慮,一般Ubuntu系統上不會直接使用root 使用者。因此,更好地做法是將需要使用docker 的使用者加入docker使用者組。

# 建立docker組
sudo groupadd docker
# 將當前使用者加入docker組
sudo usermod -aG docker $USER

登出當前使用者,重新登入Ubuntu,輸入docker info,此時可以直接出現資訊。
在這裡插入圖片描述

配置國內映象加速
在/etc/docker/daemon.json 中寫入如下內容(如果檔案不存在請新建該檔案)

{
    "registry-mirrors": [
        "https://registry.docker-cn.com"
    ]
}

重新啟動服務

sudo systemctl daemon-reload
sudo systemctl restart docker

註冊Docker Hub的賬戶用於建立自己的倉庫
建立Docker Hub賬戶

驗證安裝是否成功 :
docker --version 檢視docker的版本資訊,是否存在,存在即安裝成功。