Docker入門

Docker

Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從Apache2.0協議開源。

Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後發佈到任何流行的 Linux 機器上,也可以實現虛擬化。

image

解決的問題

由於不同的機器有不同的操作系統,以及不同的庫和組件,在將一個應用部署到多臺機器上需要進行大量的環境配置操作。

Docker 主要解決環境配置問題,它是一種虛擬化技術,對進程進行隔離,被隔離的進程獨立於宿主操作系統和其它隔離的進程。使用 Docker 可以不修改應用程序代碼,不需要開發人員學習特定環境下的技術,就能夠將現有的應用程序部署在其他機器中。

與虛擬機的比較

虛擬機也是一種虛擬化技術,它與 Docker 最大的區別在於它是通過模擬硬件,並在硬件上安裝操作系統來實現。

虛擬機

Hypervisor是一種運行在物理服務器和操作系統之間的中間軟件層,可允許多個操作系統和應用共享一套基礎物理硬件,因此也可以看作是虛擬環境中的“元”操作系統,它可以協調訪問服務器上的所有物理設備和虛擬機,也叫虛擬機監視器(Virtual Machine Monitor)。

docker

啓動速度

啓動虛擬機需要啓動虛擬機的操作系統,再啓動應用,這個過程非常慢;

而啓動 Docker 相當於啓動宿主操作系統上的一個進程。

佔用資源

虛擬機是一個完整的操作系統,需要佔用大量的磁盤、內存和 CPU,一臺機器只能開啓幾十個的虛擬機。

而 Docker 只是一個進程,只需要將應用以及相關的組件打包,在運行時佔用很少的資源,一臺機器可以開啓成千上萬個 Docker。

優勢

更容易遷移

提供一致性的運行環境,可以在不同的機器上進行遷移,而不用擔心環境變化導致無法運行。

更容易維護

使用分層技術和鏡像,使得應用可以更容易複用重複部分。複用程度越高,維護工作也越容易。

更容易擴展

可以使用基礎鏡像進一步擴展得到新的鏡像,並且官方和開源社區提供了大量的鏡像,通過擴展這些鏡像可以非常容易得到我們想要的鏡像。

使用場景

持續集成

持續集成指的是頻繁地將代碼集成到主幹上,這樣能夠更快地發現錯誤。

Docker 具有輕量級以及隔離性的特點,在將代碼集成到一個 Docker 中不會對其它 Docker 產生影響。

提供可伸縮的雲服務

根據應用的負載情況,可以很容易地增加或者減少 Docker。

搭建微服務架構

Docker 輕量級的特點使得它很適合用於部署、維護、組合微服務。

鏡像與容器

鏡像是一種靜態的結構,可以看成面向對象裏面的,而容器是鏡像的一個實例

鏡像包含着容器運行時所需要的代碼以及其它組件,它是一種分層結構,每一層都是隻讀的(read-only layers)。構建鏡像時,會一層一層構建,前一層是後一層的基礎。鏡像的這種分層存儲結構很適合鏡像的複用以及定製。

構建容器時,通過在鏡像的基礎上添加一個可寫層(writable layer),用來保存着容器運行過程中的修改。

image

網絡模式

docker run創建Docker容器時,可以用–net選項指定容器的網絡模式,Docker有以下4種網絡模式:

  • bridge模式:使用–net =bridge指定,默認設置;
  • host模式:使用–net =host指定;
  • none模式:使用–net =none指定;
  • container模式:使用–net =container:NAMEorID指定。

bridge模式

bridge模式是Docker默認的網絡設置,此模式會爲每一個容器分配Network Namespace、設置IP等,並將並將一個主機上的Docker容器連接到一個虛擬網橋上。當Docker server啓動時,會在主機上創建一個名爲docker0的虛擬網橋,此主機上啓動的Docker容器會連接到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網絡中。接下來就要爲容器分配IP了,Docker會從RFC1918所定義的私有IP網段中,選擇一個和宿主機不同的IP地址和子網分配給docker0,連接到docker0的容器就從這個子網中選擇一個未佔用的IP使用。如一般Docker會使用172.17.0.0/16這個網段,並將172.17.42.1/16分配給docker0網橋(在主機上使用ifconfig命令是可以看到docker0的,可以認爲它是網橋的管理端口,在宿主機上作爲一塊虛擬網卡使用)。
image

host模式

該模式將禁用Docker容器的網絡隔離。因爲容器共享了宿主機的網絡命名空間,直接暴露在公共網絡中。因此,你需要通過端口映射(port mapping)來進行協調。

$ docker run -d --net=host ubuntu:14.04 tail -f /dev/null
$ ip addr | grep -A 2 eth0:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 06:58:2b:07:d5:f3 brd ff:ff:ff:ff:ff:ff
inet **10.0.7.197**/22 brd 10.0.7.255 scope global dynamic eth0

$ docker ps
CONTAINER ID  IMAGE         COMMAND  CREATED
STATUS        PORTS         NAMES
b44d7d5d3903  ubuntu:14.04  tail -f  2 seconds ago
Up 2 seconds                jovial_blackwell
$ docker exec -it b44d7d5d3903 ip addr
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 06:58:2b:07:d5:f3 brd ff:ff:ff:ff:ff:ff
inet **10.0.7.197**/22 brd 10.0.7.255 scope global dynamic eth0

我們可以從上例中看到:容器和宿主機具有相同的IP地址10.0.7.197。

在下圖中,我們可以看到:當使用host模式網絡時,容器實際上繼承了宿主機的IP地址。該模式比bridge模式更快(因爲沒有路由開銷),但是它將容器直接暴露在公共網絡中,是有安全隱患的。

image

none模式

該模式將容器放置在它自己的網絡棧中,但是並不進行任何配置。實際上,該模式關閉了容器的網絡功能,在以下兩種情況下是有用的:

  • 容器並不需要網絡(例如只需要寫磁盤卷的批處理任務)
  • 你希望自定義網絡

container模式

這個模式指定新創建的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、端口範圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過lo網卡設備通信。

$ docker run -d -P --net=bridge nginx:1.9.1
$ docker ps
CONTAINER ID  IMAGE        COMMAND   CREATED         STATUS
PORTS                      NAMES
eb19088be8a0  nginx:1.9.1  nginx -g  3 minutes ago   Up 3 minutes
0.0.0.0:32769->80/tcp,
0.0.0.0:32768->443/tcp     admiring_engelbart
$ docker exec -it admiring_engelbart ip addr
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet **172.17.0.3**/16 scope global eth0

$ docker run -it --net=container:admiring_engelbart ubuntu:14.04 ip addr
...
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet **172.17.0.3**/16 scope global eth0

結果(上面的例子)顯示:第二個容器使用了–net=container參數,因此和第一個容器admiring_engelbart具有相同的IP地址172.17.0.3。

參考資料

Docker網絡模式

CyC2018/CS-Notes

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