Docker入門——了解Docker的核心概念
1 前言
相信不少人聽過這麼一句話:
人類的本質是複讀機。
在軟體開發領域也一樣,我們總是想尋找更好地方式複制優秀的邏輯或系統。最核心的方法是抽取通用邏輯群組件,把差異化的東西接口化或配置化,達到複用的效果。如
Java
的
Build Once, Run Everywhere
,還有
Spring
的強大的抽象能力。這是應用層面的複用,
Docker
則在系統層面作文章,讓我們可以快速複制一個系統(如CentOS)或一個服務(如Kafka)。
2 Docker的便利與優勢
利用
Docker
,我們可以很快的使用别人已經建立好的鏡像來釋出一個完整的系統或某個元件。它至少提供了以下便利:
- 提供一緻的運作環境。從同一個鏡像檔案建立容器,應用運作環境相同,保持開發環境、測試環境和生産環境的一緻。這能減少許多因環境差異和配置差異帶來的問題。測試提了Bug,開發再也不能第一時間回:是你環境沒配好吧?是你不會用吧?
- 彈性的系統。因
可快速啟動/停止,使系統能根據請求量/資料量動态的改變運作的服務數量,以提供伸縮可變的系統服務。Docker
- 微服務開發。容器可以非常輕量級,而且可快速動态啟停,非常适用于微服務架構。一台實體機器也能運作多個容器,不一定需要實體叢集。
複制一個系統,我們可以通過增加一台實體機,或者通過虛拟機技術運作多個系統,現在有了
Docker
,還可以通過它來啟動一個系統。與其它方式相比,
Docker
有以下優勢:
- 啟動速度快,秒級的啟動速度;
- 性能好,近似實體機的性能,不會有過多資源損失和性能浪費;
- 體量小,鏡像可以做得更小(MB級),不像虛拟機的幾GB;
- 跨平台,能在Linux/Unix/Mac/Windows系統下運作;
- 利于CI/CD,有成熟的技術實踐;
- 社群活躍,有大公司背書,應用廣泛,鏡像資源豐富。
3 Docker核心概念
3.1 鏡像Image
說起鏡像,不由想起當年拿着U盤搗鼓各種系統的日子。那時會找各種系統的
iso檔案
,下載下傳速度還特别慢,幾GB的檔案呢。那些
iso檔案
,就是鏡像檔案。但這些鏡像檔案是相對于實體機系統或虛拟機技術而言的,而不是
Docker
的鏡像檔案。
對于
Docker
而言,鏡像會被統一管理,在本地有特定的地方存放鏡像,不同的系統位置不一樣。一般而言,是無須自己管理鏡像檔案的,
Docker
會有效地管理群組織。列出所有鏡像指令如下:
docker images
或docker image ls
Docker
由鏡像啟動容器,就像通過
iso檔案
安裝啟動系統一樣。鏡像是通用的,是以也是可以共享的。一般我們可以通過複用别人做好的優秀鏡像來提高開發效率。我們隻需要在别人鏡像的基礎上做定制開發即可。例如我們可拉取一個帶
JDK
的
Linux
鏡像,然後把自己的Java應用添加上去,形成自己新的鏡像。
為了提高複用率與速度,我們将鏡像分層,如下圖所示:
如鏡像B是基于鏡像A打包而成的,則鏡像B比鏡像A多一層。鏡像B包含了鏡像A的所有層級。這樣做的好處是,不用管理一個大的鏡像,而管理層級變化。假如本機已經下載下傳了鏡像E,則本機已經有(A, B, C, E),當需要拉取F的時候,不再需要拉取(A, B)了。這利用了
Docker
的緩存技術,另外,在建構新鏡像時,同樣也使用了緩存。
标簽Tag是鏡像的重要概念,一般用于标記版本号,對于同一個鏡像源名,可以有多個标簽,如
redis:5.0.8
、
redis:latest
,
5.0.8
和
latest
都是标簽名,預設使用
latest
。
3.2 容器Container
有了鏡像後,就可以建立容器了。啟動一個容器,就像啟動一個程序一樣快速,可以通過
docker run
指令啟動,如下:
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
容器提供了軟體硬體環境,會消耗實體機資源,同時它還具有狀态,互相隔離。可以從一個鏡像啟動多個不同的容器,如從
Ubuntu
鏡像啟動多個
Ubuntu
系統。可以通過指令
docker ps
檢視目前運作的容器,已經停止的容器不會顯示出來。當容器停止時,容器檔案并不會消失,可以通過
docker ps -a
檢視所有容器。
可以簡單了解鏡像與容器的關系:
鏡像是容器的模闆,是沒運作沒狀态的檔案,啟動容器需要鏡像。容器是運作着的、帶狀态的互相隔離的服務。可以由一個鏡像啟動多個容器,也可以從一個容器建立一個鏡像,但這并不說明兩者是可逆的互相轉換。
3.3 倉庫Repository
倉庫很容易了解,就是存放鏡像的地方。既然鏡像是通用的,可以共享,那就需要一個共享的地方,倉庫承擔着這樣一個責任。這跟
maven
、
npm
等是同樣的道理。最大、最常用的倉庫當然是官方倉庫
Docker Hub
,但國内通路速度也相當感人,可以通過使用國内倉庫解決這個問題,如使用阿裡的倉庫。這跟
GitHub
、
maven
也是何其相似。
我們可以從倉庫拉取别人的鏡像,也可以把自己建構的鏡像推送到倉庫上。
4 總結
本次主要講解一下 Docker
的概念,實踐與指令以後再一一道來。
Docker
歡迎通路南瓜慢說 www.pkslow.com擷取更多精彩文章!
歡迎關注微信公衆号<南瓜慢說>,将持續為你更新...
多讀書,多分享;多寫作,多整理。