天天看點

[ docker ] 一篇文章讓你掌握 docker一、docker 簡介二、docker優缺點介紹三、Dorcker原理(傳送門)四、Dorcker核心概念五、Dockerfile、Docker鏡像和Docker容器的關系六、Docker的四種網絡模式七、docker安裝八、docker常用指令九、專欄分享

 相信大家對docker都不陌生,這篇文章來分享一下個人對docker的了解。

在此之前,我翻閱了很多的資料,也看了不少的文章。

總結來說,就是每個人都會有自己獨特的見解,有的是為了跟進先進主流技術,有的由于面試需要,有的由于項目要用等等的。

我總結的也不一定就是最準确的,隻能能對大家更好的去了解docker有一些幫助,可以對docker有一個自己的認知。

目錄

一、docker 簡介

1. 什麼是docker

2. 了解docker

3. docker有什麼特點

1. 傳遞标準化

2. 資源輕量化

3. 遷移成本降低

4. 廉價

5. 速度快

6. 資源使用率高

二、docker優缺點介紹

1. docker與虛拟機有什麼差別

1. 兩者對比圖:​

2. 容器與虛拟機(VM)總結

3. 容器與虛拟機(VM)兩者共存:

2. docker優點

3. docker局限和缺點

1. 局限

2. 缺點

三、Dorcker原理(傳送門)

四、Dorcker核心概念

1. 鏡像(image)

2. 容器(container)

3. 倉庫(repository)

五、Dockerfile、Docker鏡像和Docker容器的關系

六、Docker的四種網絡模式

1. host模式

2. container模式

3. none模式

4. bridge模式

七、docker安裝

1. docker安裝

3. 國内鏡像配置

八、docker常用指令

1. 容器

2. 服務

3. 鏡像

九、專欄分享

一、docker 簡介

docker官方介紹是這樣的:“Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.”
百度百科是這樣說的:Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的linux或Windows作業系統的機器上,也可以實作虛拟化,容器是完全使用沙箱機制,互相之間不會有任何接口。

1. 什麼是docker

1. Docker 是一個開放源代碼軟體,是一個開放平台,用于開發應用、傳遞(shipping)應用、運作應用。

2. Docker使用Google公司推出的Go語言進行開發實作,基于Linux核心的cgroup,namespace,以及AUFS類的UnionFS等技術,對程序進行封裝隔離,屬于作業系統層面的虛拟化技術。

3. 由于隔離的程序獨立于宿主和其它的隔離的程序,是以也稱其為容器。

4. 容器鏡像是輕量的、可執行的獨立軟體包 ,包含軟體運作所需的所有内容:代碼、運作時環境、系統工具、系統庫和設定。

5. 容器化軟體适用于基于Linux和Windows的應用,在任何環境中都能夠始終如一地運作。

6. 容器賦予了軟體獨立性,使其免受外在環境差異(例如,開發和預演環境的差異)的影響,進而有助于減少團隊間在相同基礎設施上運作不同軟體時的沖突。

7. Docker容器與虛拟機類似,但二者在原理上不同。容器是将作業系統層虛拟化,虛拟機則是虛拟化硬體,是以容器更具有便攜性、高效地利用伺服器。

8. Docker也為容器提供更強的業界的隔離相容,Docker 利用Linux核心中的資源分離機制,這可以在單一Linux實體下運作,避免啟動一個虛拟機造成的額外負擔。Linux核心對名字空間的支援完全隔離了工作環境中應用程式的視野,包括行程樹、網絡、使用者ID與挂載檔案系統,而核心的cgroup提供資源隔離,包括CPU、存儲器、block I/O與網絡。

簡單來說:docker是一個Go語言實作的基于LXC的用于開發應用、傳遞應用、運作應用的容器。
除了Docker以外,還有其它很多種容器,例如Linux上的LXC、OpenVZ,FreeBSD的Jail,Solaris的Zones等等。

2. 了解docker

docker是不太好了解的,這裡通俗易懂的解釋一下:

Docker的思想是來自于集裝箱 :

在一艘大船上,可以把貨物規整的擺放起來。

并且各種各樣的貨物被集裝箱标準化了,集裝箱和集裝箱之間不會互相影響。

那麼我就不需要專門運送水果的船和專門運送化學品的船了。

隻要這些貨物在集裝箱裡封裝的好好的,那我就可以用一艘大船把他們都運走。

docker就是類似的理念。雲計算可以了解為大貨輪,docker可以了解為集裝箱。

3. docker有什麼特點

1. 傳遞标準化

專業點的說法就是持續內建和持續傳遞。

自從容器技術發展起來之後,Devops的發展也是如火如荼。究其原因,就是因為Docker提供了标準化傳遞的創新途徑,使開發、測試、部署過程通過流水線工具可見可控可信。

是以總結起來就是:Docker解決了運作環境和配置問題,建構過程标準化,也就友善做持續內建和持續傳遞。

2. 資源輕量化

Docker 容器是在作業系統層面上實作虛化,直接複用本地主機的作業系統,是以更加輕量級。

3. 遷移成本降低

一次打包,到處運作的特點,使遷移成本直線下降。比如要将資料從公有雲遷至私有雲,隻需要遷移資料,遷移容器就可以完成了。

4. 廉價

docker可以實作虛拟機隔離應用環境的功能,開銷小,就意味着省錢了。

不同的應用程式可能會有不同的應用環境,如:.net開發的網站和php開發的網站依賴的軟體就不一樣,如果把他們依賴的軟體都安裝在一個伺服器上可能會出現很多的問題,如:IIS和Apache通路端口沖突。

這個時候就需要隔離.net開發的網站和php開發的網站,正常來講,我們可以在伺服器上建立不同的虛拟機在不同的虛拟機上放置不同的應用,但是虛拟機開銷比較高。而利用docker就很完美。

5. 速度快

你開發軟體的時候用的是Ubuntu,但是運維管理的都是centos,運維在把你的軟體從開發環境轉移到生産環境的時候就會遇到一些Ubuntu轉centos的問題

比如:有個特殊版本的資料庫,隻有Ubuntu支援,centos不支援,在轉移的過程當中運維就得想辦法解決這樣的問題。

這時候要是有docker你就可以把開發環境直接封裝轉移給運維,運維直接部署你給他的docker就可以了。而且部署速度快。

6. 資源使用率高

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

二、docker優缺點介紹

1. docker與虛拟機有什麼差別

Docker類似虛拟機的概念,但是與虛拟化技術的不同點在于下面幾點:

1.  虛拟化技術依賴實體CPU和記憶體,是硬體級别的;而docker建構在作業系統上,利用作業系統的containerization技術,是以docker甚至可以在虛拟機上運作   

2.  虛拟化系統一般都是指作業系統鏡像,比較複雜,稱為“系統”;而docker開源而且輕量,稱為“容器”,單個容器适合部署少量應用,比如部署一個redis、一個memcached。   

3.  虛拟化技術使用快照來儲存狀态;而docker在儲存狀态上不僅更為輕便和低成本,而且引入了類似源代碼管理機制,将容器的快照曆史版本一一記錄,切換成本很低。   

4.  虛拟化技術在建構系統的時候較為複雜,需要大量的人力;而docker可以通過Dockfile來建構整個容器,重新開機和建構速度很快。更重要的是Dockfile可以手動編寫,這樣應用程式開發人員可以通過釋出Dockfile來指導系統環境和依賴,這樣對于持續傳遞十分有利。   

5.  Dockerfile可以基于已經建構好的容器鏡像,建立新容器。Dockerfile可以通過社群分享和下載下傳,有利于該技術的推廣。Docker會像一個可移植的容器引擎那樣工作。它把應用程式及所有程式的依賴環境打包到一個虛拟容器中,這個虛拟容器可以運作在任何一種 Linux伺服器上。這大大地提高了程式運作的靈活性和可移植性,無論需不需要許可、是在公共雲還是私密雲、是不是裸機環境等等。

簡單來說: 容器和虛拟機具有相似的資源隔離和配置設定優勢,但功能有所不同,因為容器虛拟化的是作業系統,而不是硬體,是以容器更容易移植,效率也更高。

傳統虛拟機技術是虛拟出一套硬體後,在其上運作一個完整作業系統,在該系統上再運作所需應用程序。

而容器内的應用程序直接運作于宿主的核心,容器内沒有自己的核心,而且也沒有進行硬體虛拟。是以容器要比傳統虛拟機更為輕便。

1. 兩者對比圖:
[ docker ] 一篇文章讓你掌握 docker一、docker 簡介二、docker優缺點介紹三、Dorcker原理(傳送門)四、Dorcker核心概念五、Dockerfile、Docker鏡像和Docker容器的關系六、Docker的四種網絡模式七、docker安裝八、docker常用指令九、專欄分享

2. 容器與虛拟機(VM)總結

特性 容器 虛拟機
啟動 秒級 分鐘級
硬碟使用 一般為MB 一般為GB
性能 接近原生 弱于
系統支援量 單機支援上千個容器 一般幾十個

容器是一個應用層抽象,用于将代碼和依賴資源打包在一起。 多個容器可以在同一台機器上運作,共享作業系統核心,但各自作為獨立的程序在使用者空間中運作 。與虛拟機相比, 容器占用的空間較少(容器鏡像大小通常隻有幾十兆),瞬間就能完成啟動 。

虛拟機(VM)是一個實體硬體層抽象,用于将一台伺服器變成多台伺服器。 管理程式允許多個VM在一台機器上運作。每個VM都包含一整套作業系統、一個或多個應用、必要的二進制檔案和庫資源,是以占用大量空間。而且VM啟動也十分緩慢 。 

通過Docker官網,我們知道了這麼多Docker的優勢,但是大家也沒有必要完全否定虛拟機技術,因為兩者有不同的使用場景。虛拟機更擅長于徹底隔離整個運作環境。例如,雲服務提供商通常采用虛拟機技術隔離不同的使用者。而Docker通常用于隔離不同的應用 ,例如前端,後端以及資料庫。就我目前項目而言,對于兩者無所謂誰會取代誰,而是兩者可以和諧共存。

3. 容器與虛拟機(VM)兩者共存:

[ docker ] 一篇文章讓你掌握 docker一、docker 簡介二、docker優缺點介紹三、Dorcker原理(傳送門)四、Dorcker核心概念五、Dockerfile、Docker鏡像和Docker容器的關系六、Docker的四種網絡模式七、docker安裝八、docker常用指令九、專欄分享

2. docker優點

其實優點在上面已經基本上提到了,在這個位置做一個總結

輕量級:Docker 容器主要利用并共享主機核心,它并不是完整的作業系統,是以它更加輕量化。

靈活:它可以将複雜的應用程式容器化,是以它非常靈活和友善。

可移植:可以在本地建構 Docker容器,并把它部署到雲伺服器或任何地方進行使用。

互相隔離,友善更新:容器是高度自給自足并互相隔離的容器,這樣就可以在不影響其他容器的情況下更換或更新你的 Docker 容器了。

可擴充:可以在資料中心内增加并自動分發容器副本。 安全:Docker 容器可以很好地限制和隔離應用程式,并且無須使用者做任何配置。

更快速的傳遞和部署:Docker在整個開發周期都可以完美的輔助你實作快速傳遞。Docker允許開發者在裝有應用和服務本地容器做開發。可以直接內建到可持續開發流程中。

高效的部署和擴容:Docker 容器幾乎可以在任意的平台上運作,包括實體機、虛拟機、公有雲、私有雲、個人電腦、伺服器等。 

更高的資源使用率:Docker 對系統資源的使用率很高,一台主機上可以同時運作數千個 Docker 容器。

更簡單的管理:使用 Docker,隻需要小小的修改,就可以替代以往大量的更新工作。

3. docker局限和缺點

1. 局限

1. Docker并不是全能的,設計之初也不是KVM之類虛拟化手段的替代品,簡單總結幾點:

2. Docker是基于Linux 64bit的,無法在32bit的linux/Windows/unix環境下使用

3. LXC是基于cgroup等linux kernel功能的,是以container的guest系統隻能是linux base的

4. 隔離性相比KVM之類的虛拟化方案還是有些欠缺,所有container公用一部分的運作庫

5. 網絡管理相對簡單,主要是基于namespace隔離

6. cgroup的cpu和cpuset提供的cpu功能相比KVM的等虛拟化方案相比難以度量(是以dotcloud主要是按記憶體收費)

7. Docker對disk的管理比較有限

8. container随着使用者程序的停止而銷毀,container中的log等使用者資料不便收集

2. 缺點

1.核心漏洞

Docker核心攻擊對于容器化環境來說可能是緻命性的,因為容器與主機共享相同的系統核心,是以單獨信任容器内置保護機制是不夠的。

容器的隔離性使得某個應用程式的漏洞不會直接影響到其他容器的應用程式,但是漏洞可能會破壞與其他容器所共享的單一的作業系統,進而影響機器上的其他容器。

如果漏洞允許代碼執行,那麼它将在主機作業系統上執行,而不是在容器内執行;如果此漏洞允許任意記憶體通路,則攻擊者可以更改或讀取任何其他容器的任何資料。

2.資料分離

在docker容器上,有一些非命名空間的資源:
1. SELinux
2. Cgroups
3. file systems under /sys, /proc/sys,
4. /proc/sysrq-trigger, /proc/irq, /proc/bus
5. /dev/mem, /dev/sd* file system
6. Kernel Modules
           
如果攻擊者可以利用當中的任意一個元素,都将擁有主機系統的操作權限。

3.資源開銷

Docker由于主控端上的所有容器是共享相同的核心和相同的資源,如果對某些資源(CPU、記憶體、磁盤等)的通路不受限制,那麼異常的容器将占用整個主控端的資源,進而影響其他容器的運作,影響應用程式。

4.套接字問題

容器在預設情況下都安裝了docker Unix套接字(/var/run/docker.sock),此套接字,可以關閉、啟動或者建立新的鏡像。

當你的容器啟動并共享套接字的時候,你就給了容器操控主控端的權限,它将可以啟動或終止其它容器,在主控端拖入或建立鏡像,甚至寫入到主控端的檔案系統。

正确配置和保護,可以使用docker容器實作進階别的安全性,但它的安全性還是低于正确配置的VM。

雖然,Docker容器還不算完美,但是瑕不掩瑜,它使得業務的上雲部署更快,資源利用更高。并且雲服務商也在不斷完善Docker容器技術在雲服務平台的應用。

三、Dorcker原理(傳送門)

Docker核心解決的問題是利用LXC來實作類似VM的功能,進而利用更加節省的硬體資源提供給使用者更多的計算資源。同VM的方式不同, LXC其并不是一套硬體虛拟化方法 - 無法歸屬到全虛拟化、部分虛拟化和半虛拟化中的任意一個,而是一個作業系統級虛拟化方法, 了解起來可能并不像VM那樣直覺。是以我們從虛拟化到docker要解決的問題出發,看看他是怎麼滿足使用者虛拟化需求的。

使用者需要考慮虛拟化方法,尤其是硬體虛拟化方法,需要借助其解決的主要是以下4個問題:

1. 隔離性 - 每個使用者執行個體之間互相隔離, 互不影響。 硬體虛拟化方法給出的方法是VM, LXC給出的方法是container,更細一點是kernel namespace

2. 可配額/可度量 - 每個使用者執行個體可以按需提供其計算資源,所使用的資源可以被計量。硬體虛拟化方法因為虛拟了CPU, memory可以友善實作, LXC則主要是利用cgroups來控制資源

3. 移動性 - 使用者的執行個體可以很友善地複制、移動和重建。硬體虛拟化方法提供snapshot和image來實作,docker(主要)利用AUFS實作

4. 安全性 - 這個話題比較大,這裡強調是host主機的角度盡量保護container。硬體虛拟化的方法因為虛拟化的水準比較高,使用者程序都是在KVM等虛拟機容器中翻譯運作的, 然而對于LXC, 使用者的程序是lxc-start程序的子程序, 隻是在Kernel的namespace中隔離的, 是以需要一些kernel的patch來保證使用者的運作環境不會受到來自host主機的惡意入侵, dotcloud(主要是)利用kernel grsec patch解決的。

四、Dorcker核心概念

1. 鏡像(image)

Docker 鏡像(Image)就是一個隻讀的模闆。鏡像可以用來建立 Docker 容器,一個鏡像可以建立很多容器。Docker 提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,使用者甚至可以直接從其他人那裡下載下傳一個已經做好的鏡像來直接使用。

2. 容器(container)

Docker 利用容器(Container)獨立運作的一個或一組應用。容器是從鏡像建立的運作執行個體。它可以被啟動、開始、停止、删除。每個容器都是互相隔離的、保證安全的平台。可以把容器看做是一個簡易版的 Linux 環境(包括root使用者權限、程序空間、使用者空間和網絡空間等)和運作在其中的應用程式。容器的定義和鏡像幾乎一模一樣,也是一堆層的統一視角,唯一差別在于容器的最上面那一層是可讀可寫的。

3. 倉庫(repository)

倉庫(Repository)是集中存放鏡像檔案的場所。有時候會把倉庫和倉庫注冊伺服器(Registry)混為一談,并不嚴格區分。實際上,倉庫注冊伺服器上往往存放着多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的标簽(tag)。

倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供使用者下載下傳。國内的公開倉庫包括 時速雲 、網易雲 等,可以提供大陸使用者更穩定快速的通路。當然,使用者也可以在本地網絡内建立一個私有倉庫。

當使用者建立了自己的鏡像之後就可以使用 push 指令将它上傳到公有或者私有倉庫,這樣下次在另外一台機器上使用這個鏡像時候,隻需要從倉庫上 pull 下來就可以了。

Docker 倉庫的概念跟 Git 類似,注冊伺服器可以了解為 GitHub 這樣的托管服務。

五、Dockerfile、Docker鏡像和Docker容器的關系

Dockerfile 是軟體的原材料,Docker 鏡像是軟體的傳遞品,而 Docker 容器則可以認為是軟體的運作态。從應用軟體的角度來看,Dockerfile、Docker 鏡像與 Docker 容器分别代表軟體的三個不同階段,Dockerfile 面向開發,Docker 鏡像成為傳遞标準,Docker 容器則涉及部署與運維,三者缺一不可,合力充當 Docker 體系的基石。

簡單來講,Dockerfile建構出Docker鏡像,通過Docker鏡像運作Docker容器。

六、Docker的四種網絡模式

1. host模式

docker run -it --rm --net=host centos_with_net bash指定

如果啟動容器的時候使用host模式,那麼這個容器将不會獲得一個獨立的Network Namespace,而是和主控端共用一個Network Namespace。容器将不會虛拟出自己的網卡,配置自己的IP等,而是使用主控端的IP和端口。

但是,容器的其他方面,如檔案系統、程序清單等還是和主控端隔離的。

2. container模式

docker run -it --rm --net=container :container_id/container_name,多個容器使用共同的網絡看到的ip是一樣。

Container模式指定新建立的容器和已經存在的一個容器共享一個Network Namespace,而不是和主控端共享。新建立的容器不會建立自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、端口範圍等。同樣,兩個容器除了網絡方面,其他的如檔案系統、程序清單等還是隔離的。兩個容器的程序可以通過lo網卡裝置通信。

3. none模式

docker run -it --rm --net=none ,這種模式下不會配置任何網絡。

使用none模式,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進行任何網絡配置。也就是說,這個Docker容器沒有網卡、IP、路由等資訊。需要我們自己為Docker容器添加網卡、配置IP等。

4. bridge模式

docker run -it --rm --net=bridge ,不用指定預設就是這種網絡模式。這種模式會為每個容器配置設定一個獨立的Network Namespace。類似于Vmware的nat網絡模式。同一個主控端上的所有容器會在同一個網段下,互相之間是可以通信的。

bridge模式是Docker預設的網絡設定,此模式會為每一個容器配置設定Network Namespace、設定IP等,并将一個主機上的Docker容器連接配接到一個虛拟網橋上。

七、docker安裝

1. docker安裝

我用的是centos7環境

第一步:安裝工具包

$ sudo yum install -y yum-utils         #安裝工具包,缺少這些依賴将無法完成

第二步:設定遠端倉庫

$sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

第三步:安裝

$ sudo yum install docker-ce

第四步:啟動

$ sudo systemctl start docker

第五步:檢視版本

$ sudo docker version

第六步:校驗

$ sudo docker run hello-world

3. 國内鏡像配置

打開配置檔案:
vi /etc/docker/daemon.json
           
添加以下内容:
{
    "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
           
可以換的源:
當然可以從下面的替換
Docker中國官方鏡像加速
--registry-mirror=https://registry.docker-cn.com

網易163鏡像加速
--registry-mirror=http://hub-mirror.c.163.com

中科大鏡像加速
--registry-mirror=https://docker.mirrors.ustc.edu.cn

阿裡雲鏡像加速
--registry-mirror=https://{your_id}.mirror.aliyuncs.com

daocloud鏡像加速
--registry-mirror=http://{your_id}.m.daocloud.io
           

八、docker常用指令

1. 容器

docker run           建立并啟動容器
docker start         啟動容器
docker ps            檢視容器
docker stop          終止容器
docker restart       重新開機容器
docker attach        進入容器
docker exec          進入容器
docker export        導出容器
docker import        導入容器快照
docker rm            删除容器
docker logs          檢視日志
           

2. 服務

docker version              檢視docker版本詳細資訊
docker -v                   檢視docker簡要資訊
systemctl start docker      啟動docker
systemctl stop docker       關閉docker
systemctl enable docker     設定開機啟動
service docker restart      重新開機docker服務
service docker stop         關閉docker服務
           

3. 鏡像

docker search                檢索鏡像
docke pull                   擷取鏡像
docker images                列出鏡像
docker image Is              列出鏡像
docker rmi                   删除鏡像
docker image rm              删除鏡像
docker save                  導出鏡像
docker load                  導入鏡像
Dockerfile                   定制鏡像(三個)
{   docker build             建構鏡像
    docker run               運作鏡像
    Dockerfile               常用指令(四個)
    {   COPY                 複制檔案
        ADD                  進階複制
        CMD                  容器啟動指令
        ENV                  環境變量
        EXPOSE               暴露端口
    }
}
           

九、專欄分享

推薦閱讀:[ 滲透入門篇 ] 滲透行業必備術語大集合(一)

每個專欄都在持續更新中~~~

滲透測試自學篇

網絡基礎

web基礎知識點

作業系統篇

python爬蟲

閑聊

面試總結

python

通訊安全

靶場