Docker 學習筆記 (一) Docker 簡介
Docker 的問世,翻轉了人們對用環境部署與開發的習慣,學會 Docker 絕對是一項不虧本的投資
Docker 現在幾乎已經是一門顯學了。上 Devops 下至 Developer 各項軟體開發無不使用 Docker 進行開發與部屬。
究竟,Docker 是什麼呢?
今天這篇主要就是介紹什麼是 Docker,以及淺談其運作原理。
什麼是Docker
我們來看一下 Wiki 的解釋:
Docker是一個開源的軟體專案,一個輕量的虛擬化技術。讓應用程式部署在軟體貨櫃下的工作可以自動化進行,藉此在 Linux 上提供一個額外的軟體抽象層,以及作業系統虛擬化的自動管理機制。
Docker利用 Linux 核心中的資源分離機制以及命名空間(namespaces),來建立獨立的容器(containers)。
這可以在單一 Linux 實體下運作,避免啟動一個虛擬機器造成的額外負擔。
簡單說就是以下這張圖
此做法有兩個優勢:
- 從開發者的角度:
在開發階段,我們總希望有一個乾淨的隔離的環境開發專案。而唯一的做法只能是使用虛擬機將工作環境隔離。然而每一台虛擬機都包含著完整 OS
、完整虛擬硬體層
… 等等專案以外的工具 。這讓部署一個虛擬專案費時費勁。
Docker 在原本的作業系統之上,多加一層虛擬化容器,將服務打包起來,如此可以大大減少每一個專案虛擬化的消耗成本。另外,藉由專案的虛擬化,我們可以更輕鬆、更容易地做到持續部署與測試,提升專案的穩健性;而藉由 docker 虛擬化的服務,我們都可以有效並統一地管理。
- 從部署的角度:
當專案要部署到正式環境、客戶電腦時。以往我們可能會常常碰到這樣的狀況:明明在我電腦跑得好好的,為什麼到你電腦就不行。
這通常是因為運行環境的不同所導致。然而也正因為這個運行環境不同,時常導致部署耗時耗力、而對環境設定的檢查與除錯也總是讓人挫折。
Docker 的出現,也解決了這個部署上的問題。我們只需要將自己寫好的 Dockerfile/image 與專案交付,目標環境只需要使用 Docker run 。即可輕鬆部署、配置好提供的專案。
Docker 的一些概念
系統架構
Docker 的系統架構主要是 Client-Server 分離的。我們通常使用 Docker client 管理下達指令通知 Docker server 執行我們所想要執行的動作。而 Docker server 就是實質管理 Docker Image、執行啟動、停止 Docker Container 的 Service。
Docker 的 C-S 架構是使用 Restful API 進行溝通的。也因此我們其實可以使用 Docker Remote API 對 Docker Server 進行操作。
詳情可以查看 Docker Engine API
名詞概念解釋
Docker 中有兩個很重要的概念要了解:Image 與 Container 。
Image
所謂的 Image 我們可以看成是 .iso 這類的映像檔。Docker 需要從 image 才能啟動 container。在實務上,我們會將專案打包成 Image 之後使用此 Image 啟動此專案的 docker container;在許多場合,Dockerhub 已經有許多人提供完整服務的 Image。我們可以使用 docker pull
將 Image pull 下來使用,就像使用 git pull 那樣。
- 自行打包 Image
自行打包 Image 有兩種方法
- 撰寫
Dockerfile
,使用docker build
依據 Dockerfile 內容創建 Image。 - Base on container 使用
docker commit <new image name> <new tag>
創建新的 image。
- 從 DockerHub 上 Pull 現成的 Image 使用:我們僅需要在 dockerHub 中找到自己喜歡的 image,之後使用
docker pull <image name>
即可將 image pull 下來使用。
Container
Docker Container 是 docker 透過 image 真正執行的實體(Instance)。每一個 instance 都是一條 process,而同一個 image 都可以啟動多個 container。每個 container 都是獨立、隔離且互不衝突,當然也不會有 A container 與 B container 衝 port 的問題。
下一篇我們將開始講解 Docker 的安裝。