Docker學習總結

Docker容器

1、基本概念

Docker是一個開源的應用容器,打包應用到這個可移植的容器中,可遷移到任何流行的虛機上運行,包括服務器、虛擬機、雲平臺、個人電腦從而避免了運行環境不一致導致的各種異常。

Docker優勢:創建、銷燬啓動速度快,體積小佔用系統資源遠遠低於虛擬機;可更快速的交付和部署、集羣管理。可擴展:可以增加並自動分發容器副本。可堆疊:可以垂直和即時堆疊服務。更簡單的管理:使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化並且高效的管理。

Docker的C/S模式(Docker服務端Server與客戶端Client)

 

 

Docker daemon 守護進程

Docker daemon作爲服務端接受來自客戶的請求,並處理這些請求(創建、運行、分發容器)。Docker的 C/S客戶端和服務端既可以運行在一個機器上,也可通過 socket 或者 RESTful API 來進行通信。Docker daemon 一般在宿主主機後臺運行,等待接收來自客戶端的消息。

Docker客戶端則爲用戶提供一系列可執行命令,用戶用這些命令實現跟 Docker daemon 交互。Docker client: Docker 命令行工具,是用戶使用Docker的主要方式,Docker client與Docker daemon通信並將結果返回給用戶,

鏡像倉庫(Repository)

鏡像倉庫扮演了鏡像的存儲和分發角色,並且通過 tag 支持鏡像的版本管理,類似於 Git倉庫在代碼開發過程中所扮演的角色。鏡像倉庫分爲 Docker Hub在公網環境下面向所有容器使用者開放的鏡像服務,如網易蜂巢、阿里雲鏡像,Docker Registry是供開發者或公司在內部環境下搭建鏡像倉庫服務,由於公網下載鏡像的網絡帶寬、延遲限制以及可控性的角度考慮,在私有云環境下通常需要採用 Docker Registry 來搭建自己的鏡像倉庫服務。

鏡像(Image)

Docker鏡像是Docker容器運行的靜態模板,一個鏡像可以運行多個container;鏡像可以通過Dockerfile創建,也可以從Docker hub/registry上下載。每個鏡像都包含一系列的層,Docker使用一種叫做聯合文件系統的東西來將這些層組合爲單個鏡像。聯合文件系統允許單獨的文件系統中的文件和文件夾以分支的形式出現,可以被透明地覆蓋,最終形成一個連續的文件系統。Docker如此輕量的原因之一就是因爲這些層。當你修改一個鏡像時,比如將應用程序更新到一個新版本時,就構建了一個新的層。因此,只有這一層被添加或修改,而不是像操作虛擬機時,替換整個鏡像或整個的重構一遍。現在,你無需分發整個鏡像,只需要更新一下就可以了,讓分發Docker鏡像變得更快更簡單。

接下來,Docker鏡像就可以通過一系列簡單的,描述性的步驟從這些基礎鏡像構建,這些步驟被稱爲指令。每條指令在我們的鏡像中會創建一個新的層,指令一般包括這些行爲:運行一個命令;添加一些文件或文件夾;創建環境變量;從該鏡像啓動一個容器時,運行哪個程序。這些指令放在一個名爲Dockerfile的文本文件中,Dockerfile包含了從基礎鏡像構建一個鏡像的一系列指令和命令。當你請求構建一個鏡像時,Docker讀取該Dockerfile文件,執行裏面的指令,並生成一個最終的鏡像。

容器(Container)

容器是從鏡像創建的應用運行實例,可以將其啓動、開始、停止、刪除,而這些容器都是相互隔離、互不可見的。可以把每個容器看作一個簡易版的Linux系統環境(包括了root用戶權限、進程空間、用戶空間和網絡空間),以及與運行在其中的應用程序打包而成的應用盒子。鏡像自身是隻讀的。容器從鏡像啓動的時候,Docker會在鏡像的最上層創建一個可寫層,然後我們的應用就可以在上邊運行了。

當利用docker run創建並啓動一個容器時,docker在後臺的標準操作包括:

    (1)檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載。

    (2)利用鏡像創建並啓動一個容器。

    (3)分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層。

    (4)從宿主機配置的網橋接口中橋接一個虛擬的接口到容器中。

    (5)從地址池中配置一個IP地址給容器。

    (6)執行用戶指定的應用程序。

(7)執行完畢後容器終止。

深入理解Docker容器和鏡像

這裏的Layers指的就是一個個只讀的文件系統,鏡像就是由這樣一個個文件系統組成的,我們把鏡像運行起來就會成爲一個個容器,當我們在容器中做了修改並commit爲鏡像後,就會不斷在原有的Layers層上新增一個Layer層,就像下面看到的這樣。

 

在容器層面上:

當我們使用docker create [image id]用指定鏡像創建容器時,可以理解爲在鏡像的最上層創建了一個可讀可寫的Layer,當我們修改完,使用commit提交後,這個容器的可讀可寫的Layer層就會轉化爲鏡像的只讀的Layer層。

而當我們使用docker inspect查看容器的時候只能查看到最上層容器的信息而無法查看到像鏡像那樣的Layers,這是因爲在容器的視角中Layer層是這樣的:

 

控制組

控制組是 Linux 內核的特性,主要用來對共享資源進行隔離、限制、審計等。只有能控制分配到容器的資源,才能避免當多個容器同時運行時的對系統資源的競爭。

聯合文件系統UnionFS

聯合文件系統是一種分層、輕量級並且高性能的文件系統,它支持對文件系統的修改作爲一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下,聯合文件系統是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基於基礎鏡像(沒有父鏡像)可以製作各種具體的應用鏡像。另外,不同 Docker容器就可以共享一些基礎的文件系統層,同時再加上自己獨有的改動層,大大提高了存儲的效率。

Linux 上的命名空間(Namespaces)

命名空間是 Linux 內核一個特性。每個容器都有自己的命名空間,運行在其中的應用都像是在獨立的操作系統中運行一樣。命名空間保證了容器之間彼此互不影響。

Docker使用了Linux的命名空間技術來進行資源隔離,如PID Namespace隔離進程,Mount Namespace隔離文件系統,Network Namespace隔離網絡

 

Docker網絡容器互聯

Bridge模式是Docker默認的網絡模式,當Docker進程啓動時,會在主機上創建一個名爲docker0的虛擬網橋,用來連接宿主機和容器,此主機上的Docker容器都會連接到這個虛擬網橋上,虛擬網橋的工作方式和物理交換機類似,這樣所有容器就通過交換機連在了一個二層網絡中。

  1. Host模式直接用主機host端口和容器相連
  2. Bridge橋接模式通過docker0網橋,映射host端口和容器相連
  3. container模式不會創建自己的網卡配置自己的IP,而是和一個指定的容器共享IP
  4. none模式這個Docker容器沒有網卡、IP、路由等信息。需要我們自己爲Docker容器添加網卡、配置IP等

 

Docker端口映射

在使用Bridge模式的時候,會涉及到一個問題,Bridge所使用的網路需要一個獨立的Namespace,這就需要一種技術使容器內的端口可以在主機上訪問,這種技術就是端口映射。Docker可以指定你想把容器內的某個端口可以在容器所在主機上的某一個端口之間進行映射,當你在訪問主機上的端口的時候其實就是訪問容器內的端口進行訪問

端口映射:就是將外網主機的IP地址的一個端口映射到內網中一臺機器,提供相應的服務。當用戶訪問該IP的這個端口時,服務器自動將請求映射到對應局域網內部的機器上。

 

Dockerfile

是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本

構建鏡像步驟:

編寫dockerfile 文件  docker build   docker run

Docker執行Dockerfile的大致流程

  1. docker從基礎鏡像運行一個容器
  2. 執行一條指令並對容器作出修改
  3. 執行類似docker commit的操作提交一個新的鏡像層
  4. docker再基於剛提交的鏡像運行一個新容器
  5. 執行dockerfile中的下一條指令直到所有指令都執行完成

Dockerfile定義了進程需要的一切東西。涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態鏈接庫、操作系統的發行版、服務進程和內核進程(當應用進程需要和系統服務和內核進程打交道,這時需要考慮如何設計namespace的權限控制)等

 

Docker數據卷

卷就是目錄或文件,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合文件系統,因此能夠繞過Union File System提供一些用於持續存儲或共享數據的特性:

數據卷可在容器之間共享或重用數據

  • 卷中的更改可以直接生效
  • 數據卷中的更改不會包含在鏡像的更新中
  • 數據卷的生命週期一直持續到沒有容器使用它爲止
  • 容器的持久化
  • 容器間繼承 + 共享數據
  • 繞過“拷貝寫”系統,以達到本地磁盤IO的性能,(比如運行一個容器,在容器中對數據卷修改內容,會直接改變宿主機上的數據卷中的內容,所以是本地磁盤IO的性能,而不是先在容器中寫一份,最後還要將容器中的修改的內容拷貝出來進行同步。) 
  • 繞過“拷貝寫”系統,有些文件不需要在docker commit打包進鏡像文件。 

Docker基本指令

從倉庫獲取鏡像 $ docker pull

查看所有鏡像 $ docker images

運行鏡像(生成一個容器實例) $ docker run   --name 自定義唯一容器名  --link 容器互聯

查看所有容器 $ docker ps    -a 查看所有的包括停止的容器

啓動容器 $ docker start

終止容器 $ docker stop

docker push 將鏡像推送到倉庫

docker pull 將倉庫中鏡像下載到本地

docker commit -m -a 提交更新後的鏡像

docker build 通過Dockerfile來構建鏡像

 

容器和虛擬化的區別

虛擬化使得許多操作系統可同時在單個系統上運行。

容器只能共享操作系統內核,將應用進程與系統其他部分,隔離開。

啓動時間秒級(沒有開機啓動流程)

容器的生命週期,應該遠遠短於虛擬機,容器出現問題,應該是立即殺掉,而不是試圖恢復。

Docker 持續部署

開發同學通過 git push 上傳代碼,經 Git 和 Jenkins 配合,自動完成程序部署、發佈,全程無需運維人員參與。

這是一種真正的容器級的實現,這個帶來的好處,不僅僅是效率的提升,更是一種變革:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章