虛擬化容許在同一硬件上運行兩個徹底不一樣的操做系統,每一個客戶操做系統都經歷了引導,加載內核等全部過程。能夠擁有很是嚴格的安全性!git
能夠基於虛擬化方法如何模仿客戶操做系統的硬件並模擬客戶操做環境來對虛擬化方法進行分類。docker
主要有三種類型的虛擬化:shell
- 仿真;
- 半虛擬化;
- 基於容器的虛擬化;
docker不是虛擬化方法,它依賴與實際實現基於容器的虛擬化或操做系統及虛擬化的其餘工具。爲此,docker最初使用LXC驅動程序,而後移動到libcontainer如今重命名爲runc。Docker主要專一於在應用程序容器內自動部署應用程序。應用程序容器旨在打包和運行單個服務,而系統容器則設計爲運行多個進程,如虛擬機。所以,Docker被視爲容器化系統上的容器管理或應用程序部署工具。編程
主要表如今如下幾個方面:安全
- 與虛擬機不一樣,容器不須要引導操做系統內核,所以能夠在不到一秒的時間內建立容器。此功能使基於容器的虛擬化比其餘虛擬化方法更加獨特和可取;
- 因爲基於容器的虛擬化爲主機增長了不多或沒有開銷,所以基於容器的虛擬化具備接近本機的性能;
- 對於基於容器的虛擬化,與其餘虛擬化不一樣,不須要其餘軟件;
- 主機上的全部容器共享主機的調度程序,從而節省了額外資源的需求;
- 與虛擬機映像相比,容器狀態(Docker或LXC映像)的大小很小,所以容器映像很容易分發;
- 容器中的資源管理是經過cgroup實現的。Cgroups不容許容器消耗比分配給它們更多的資源。雖然主機的全部資源都在虛擬機中可見,但沒法使用。這能夠經過在容器和主機上同時運行top或htop來實現。全部環境的輸出看起來都很類似;
CI功能就是在每次提交以後不斷地集成全部提交到存儲庫的代碼,並編譯檢查錯誤。服務器
每一個容器都是在本身的名命空間中運行,但使用與全部其餘容器徹底相同的內核。發生隔離是由於內核知道分配給進程的命名空間,而且在API調用期間確保進程只能訪問其本身的命名空間中的資源。網絡
docker鏡像是docker容器的源代碼,Docker鏡像用於建立容器。架構
Docker容器包括應用程序及其全部依賴項,但與其餘容器共享內核,做爲主機操做系統上用戶空間中的獨立進程運行。Docker容器不依賴於任何特定的基礎架構:它們能夠在任何計算機,任何基礎架構和任何雲中運行。ide
Docker容器能夠有四種狀態:工具
- 運行;
- 已暫停;
- 從新啓動;
- 已退出;
能夠經過運行「docker ps –a」命令來識別Docker容器的狀態,這將依次列出全部可用的docker容器及其在主機上的相應狀態。
- 1)FROM:構建鏡像基於哪一個鏡像;
- 2)MAINTAINER:鏡像維護者姓名或郵箱地址;
- 3)RUN:構建鏡像時運行的shell指令;
- 4)CMD:運行容器時執行的shell環境;
- 5)EXPOSE:聲明容器的服務端口(僅僅是聲明);
- 6)ENV:設置容器環境變量;
- 7)ADD:拷貝文件或目錄到容器中,若是是URL或壓縮包便會自動下載或自動解壓;
- 8)COPY:拷貝文件或目錄到容器中,跟ADD相似,但不具有自動下載或解壓的功能;
- 9)ENTRYPOINT:運行容器時執行的shell命令;
- 10)VOLUME:指定容器掛載點到宿主機自動生成的目錄或其餘容器;
- 11)USER:爲RUN、CMD、和ENTRYPOINT執行命令指定運行用戶;
- 12)WORKDIR:爲RUN、CMD、ENTRYPOINT、COPY和ADD設置工做目錄,意思爲切換目錄;
- 13)HEALTHCHECH:健康檢查;
- 14)ARG:構建時指定的一些參數;
- 15)LABEL:咱們使用LABEL按照項目,模塊,許可等組織咱們的鏡像。咱們也可使用LABEL來幫助實現自動化。在LABEL中,咱們指定一個鍵值對,之後可用於以編程方式處理Dockerfile;
注意:
(1)RUN在building時運行,能夠寫多條;
(2)CMD和ENTRYPOINT在運行container時,只能寫一條,若是寫多條,最後一條生效;
(3)CMD在構建容器時能夠被COMMAND覆蓋,ENTRYPOINT不會被COMMAND覆蓋,但能夠指定——entrypoint覆蓋;
(4)若是在Dockerfile文件中須要往鏡像中導入文件,則該文件必須在Dockerfile所在目錄或子目錄中;
(5)每一個目錄下最好就只有一個Dockerfile,若是有多個Dockerfile文件時,使用Dockerfile生成鏡像時便須要使用「-f」來指定具體的Dockerfile文件;
(6)指令必須所有爲大寫;
(7)使用Dockerfile生成鏡像時,保證Dockerfile中所需的軟件、文件與Dockerfile在同一個目錄下;
當鏡像用做另外一個鏡像構建的基礎是,ONBUILD指令向鏡像添加將在稍後執行的觸發指令。若是要構建其餘鏡像的基礎的鏡像(例如,可使用特定於用戶的配置自定義的應用程序構建環境或守護程序),這將很是有用。
重要的是,每一個層只是與以前一層的一組差別層(相同的就再也不放到鋅層中);
docker swarm是Docker的本機羣集,它將Docker主機池轉變爲單個虛擬Docker主機。Docker swarm提供標準的Docker API,任何已經與Docker守護進程通訊的工具均可以使用Swarm透明地擴展到多個主機。
能夠進行如下更改:
所以,但願定義一個額外的Compose文件,它指定適合生產的配置。此配置文件只須要包含您要從原始Compose文件中進行的更改。
docker默認狀況下,有五種網絡模式:
- host模式:直接使用docker宿主機的I網絡。如IP地址、網卡類型等;
- none模式:不會給容器進行任何網絡配置。也就是說,使用這種模式的容器沒有IP地址(只有一個迴環地址);
- bridge模式:docker默認的網絡配置,此模式會爲每個容器分配名稱空間,能夠設置IP,可是要與docker host主機的虛擬網絡在同一網段;經過虛擬網卡與外界通訊;
- container模式:這種模式與已經存在的容器共有同一個IP地址;
- Network:自定義網絡。能夠自行建立而且能夠註定多種網絡驅動,如bridge、overlay等;
跨主機通訊的兩種解決方案:
overlay網絡:使用這種方法,須要事先建立一個consul服務,將須要跨主機通訊的docker host加入到同一個consul集羣中,而後再建立一個overlay類型的自定義網絡。因爲其網卡做用因而全局的,因此基於此網卡類型建立的容器就能夠正常通訊;
若是使用macvlan網絡的方式,須要如下步驟:
- 首先要保證須要跨主機通訊的docker hos是能夠正常通訊的;
- 兩臺docker host建立的虛擬網卡是在同一網段;
- 而後兩臺docker host基於虛擬網卡建立macvlan類型的網卡;
- 經過macvlan網絡類型建立的容器便可通訊;
docker實現數據持久化的方式:
建立容器時,使用「-v」選項,將本地的目錄掛載到容器中。採用這種方式容器的掛載類型爲bind!
Bind mount的特色:
- Data Volume是目錄或文件,不能是沒有格式化的磁盤(塊設備);
- 容器能夠讀寫volume中的數據;
- 隨源文件變化而變化;
- volume數據能夠永久保存,即便使用它的容器已經被銷燬;
注意:
建立容器時,使用「-v「選項,只指定容器中的目錄便可!採用這種方式容器的掛載類型爲volume;
特色:
採用這種方式,即事先建立一個容器,專用於掛載本地的目錄,而後建立容器時,使用「--volumes-from」指定掛載本地目錄的容器便可(這種模式是將本來容器中掛載的全部目錄都掛載到新建立的容器中)!
這種方式也是提供bind mount模式和manager volume模式!
—————————————————————未完待續!!!—————————————————————