Hello Docker
Docker: Build, Ship, and Run Any App, Anywhere
在任何地方構建、交付和執行任何應用
1. 引言
最近簡單的學習了下Docker
,本文先簡要梳理下Docker
涉及到的一些重要概念,後續在結合.NET Core探討其基本用法。
2. What’s Docker
Docker
是用GO
語言編寫,利用Linux
核心的幾個特性來提供它的功能。Docker
是一個開放平臺用於快速開發、分發和部署應用程式。它提供了一個作業系統級別的抽象。它隔離了應用程式對基礎架構(作業系統等)的依賴。解決了生產、測試、部署環境的一致性問題。
Docker
提供了容器(鬆耦合且隔離的環境)去打包和執行應用程式。良好的安全性和隔離性允許我們在一個主機上執行多個容器。因為容器是直接在宿主機器的核心中執行且不需要額外的管理程式的負載(比如虛擬機器需要VMware
管理程式),所以說容器是輕量級的。
3. Docker Engine
從圖中可知,Client
使用docker CLI
(命令列工具)通過Docker REST API
去和docker daemon
(docker
的守護程式)進行互動,docker daemon
負責去建立和管理Docker objects
(比如映象、容器、網路和儲存卷等)。
4. Docker的適用場景
快速、一致地交付應用
Docker
通過使用容器(其提供應用程式和服務)來提供標準化的工作環境來精簡開發週期。容器在持續整合和持續開發(CI/CD
)中十分有用。
考慮以下示例場景:
- 開發人員在本地編寫程式碼,並使用
Docker
容器與同事分享他們的工作。 - 開發人員使用
Docker
將應用程式推入測試環境,並執行自動和手動測試。當開發人員發現錯誤時,他們可以在開發環境中修復它們,並將其重新部署到測試環境進行測試和驗證。 - 完成測試後,將修復程式推送給客戶就如同將更新的映象推送到生產環境一樣簡單。
響應式部署和縮放
Docker
的可移植性和輕量級特性也使得動態管理工作負載變得非常容易,幾乎可以實時地按業務需求對應用程式和服務進行擴充套件和收縮。
在同一硬體執行多個工作負載
Docker
的輕量級及執行快速的特性,允許我們用更少的資源做更多的事情,最大化的使用計算機的資源。Docker
是高密度環境和中小型部署的理想選擇。
5. Docker架構
從圖中我們可以看出,Docker
是一個C/S
架構。客戶端通過REST API
與Docker
的守護程式進行互動,守護程式從Registry
(倉庫,如DockerHub
)拉取映象,再構建、執行和分發容器等。
6. Docker VS Vitual Machine
首先,Docker
是一種容器管理技術,而非虛擬化技術。與我們熟知的虛擬機器有著本質區別:
通過上圖可知,Docker
是基於Docker
引擎通過共享宿主機的硬體資源,使用容器來提供獨立執行環境來執行應用程式!而VM
則是基於Supervisor
(虛擬機器管理程式)使用虛擬機器技術來提供隔離的虛擬機器,在虛擬機器的作業系統上提供執行環境!雖然兩者都提供了很好的資源隔離,但很明顯Docker的虛擬化開銷更低!
7. 核心術語
下面我們就來重點梳理下Docker
涉及到的一些核心術語:Registry、Image、Container、Stack、Service、Swarm
。
Registry(倉庫)
Docker Registry
用來儲存Docker
映象,比如Docker
官方的Docker Hub
就是一個公開的倉庫。在上面我們可以找到我們想要的映象。當然我們也可以建立私有的映象倉庫。
當我們執行Docker pull
或Docker run
命令時,若本地無所需的映象,那麼將會從倉庫(一般為DockerHub
)下載(pull
)一個映象。Docker
執行run
方法得到一個容器,使用者在容器裡執行各種操作。Docker
執行commit
方法將一個容器轉化為映象。Docker
利用login
、push
等命令將本地映象推送(push
)到倉庫。其他機器或伺服器上就可以使用該映象去生成容器,進而執行相應的應用程式。
另外,我們可以在Docker Store
進行映象交易。
Image(映象)
映象是自讀的,用於建立Docker
容器。我們可以基於一個映象做一些額外的自定義更改後,commit
成我們自己的映象。也可以使用Dockerfile
,build
成我們自己的映象。Docker
使用映象分層技術,Dockerfile
中的每個指令都會建立為映象中的一個層。
Container(容器)
容器是docker
中最重要的概念,Container
是映象的執行例項,它是一個隔離的、資源受控的可移植的執行時環境,其中包含作業系統、需要執行的程式、執行程式的相關依賴、環境變數等。我們可以通過docker run <image>
建立指定映象的容器,建立容器時會在映象上附加一個讀寫層。我們可以連線容器到一個或多個網路,併為其附加儲存,或基於它當前狀態建立一個新的映象。Docker
使用namespace
的技術來實現容器之間的隔離!對於容器的更改是暫時的,當容器停止時,相應的改動就會丟失。我們可以通過掛載volume
來持久化儲存!
Docker Swarm(Docker叢集)
Docker Swarm
是 Docker
的獨立原生叢集工具的名稱。Docker Swarm
將多個Docker
主機叢集並將它們暴露為單個虛擬的Docker
主機。
Service(服務)
通過服務我們可以很好進行容器擴充套件,預設情況下,服務在Swarm
下的所有工作節點之間進行負載平衡。在Docker
中我們通過編寫docker-compose.yml
來定義、執行和擴充套件服務。
Stack(服務堆)
Stack
是一組相互關聯的服務,它們可以共享依賴關係,並且可以一起協調和縮放。單個Stack
能夠定義和協調整個應用程式的功能。
相關文章
- Docker Hello WorldDocker
- docker學習3:Docker Hello WorldDocker
- 在docker中寫個Hello WorldDocker
- [第七篇]——Docker Hello WorldDocker
- Docker Hello World容器執行報錯的解決辦法Docker
- hello
- Hello Lua
- Hello, Webpack!Web
- hello word
- Hello,Threadthread
- Hello, World
- Hello Word!
- Hello,cnblogs
- Hello,World
- "HELLO BOKEYUAN"
- Hello World
- Hello World!
- Hello,find!
- Hello World !
- Go - Hello WorldGo
- tf:'hello tensorflow'
- Hello,Spring BootSpring Boot
- Deep "Hello world!"
- Hello Python worldPython
- Hello World探究
- dotnet hello world
- Go:Hello WorldGo
- Hello Cnbolgs with githubGithub
- ant Hello World
- cmake:Hello cmake
- String s = “hello“和String s = new String(“hello“)的區別
- I'm Hello World
- Say "Hello tomorrow" with GoGo
- 【Hello CSS】序章-起源CSS
- 輸出hello world
- RabbitMQ tutorial - "Hello world!"MQ
- WebGL 的 Hello WorldWeb
- Solidity教程 hello wordSolid