對Docker的瞭解,你能讀懂多少?

劉小波發表於2018-08-01

對Docker的瞭解,能讀懂下圖也就夠了,圖中有五個物件:映象、容器、映象倉庫、備份檔案、Dockerfile,並且有多個藍色字型標出的命令,用來將各種物件互相轉換、生成,接下來一一介紹:

映象

你可以簡單理解映象是一個壓縮包,這個包中,有你的程式或程式碼,還有一個檔案系統,所謂檔案系統,就是打包了一個標準作業系統的所有必須檔案,可執行程式、執行庫等。

Docker之所以解決了程式執行環境一致性問題,就是將應用程式和檔案系統打包到了一起,程式執行時,從你打包的映象檔案系統中載入依賴,比如,你的程式依賴JDK 1.8,那麼將映象中打包上JDK1.8的基礎庫,然後無論將映象部署到何種環境的系統上,無論那臺主機是否安裝了JDK,或安裝了任意版本的JDK,你的應用程式啟動時,都能一致性地載入映象中的JDK1.8,避免了因環境不統一造成的部署難題和執行時BUG。

可以通過ID或名稱識別映象,ID是SHA256格式的HASH值,例如:

b1183dab1c4049b9b9d0d0dff17d2eb04e8d9caf873f7ff505ff9fe8909e2a48
Copy複製程式碼

可以簡寫做 b1183dab1c40

映象名稱分為映象名和Tag兩部分組成,中間以冒號分別,如果Tag省略,則代表latest,比如:

# Docker官方映象,省略了 Tag
ubuntu

# Docker官方映象,指定Tag
ubuntu:16.04

# Docker Hub上非Docker官方的映象
maichong/ubuntu:16.04

# 脈衝雲倉庫中的映象,帶映象倉庫地址
maichong.io/project/ubuntu:16.04
Copy複製程式碼

可以使用 docker tag 命令給已經存在的映象打上一個新標籤,比如:

# 給 ubuntu:16.04 增加一個新標籤 maichong.io/project/ubuntu:16.04
docker tag ubuntu:16.04 maichong.io/project/ubuntu:16.04
Copy複製程式碼

檢視當前系統中所有的映象列表:

> docker images
REPOSITORY        TAG            IMAGE ID        CREATED            SIZE
ubuntu            16.04        e13f3d529b1a    6 days ago        115MB
Copy複製程式碼

容器

可以簡單理解映象是“死的”,是磁碟上儲存的“靜態的”檔案,而容器,則是執行起來的、記憶體中的、“動態的”例項。當然,容器不一定是執行著的,容器也能停止。

通過 docker run 命令可以從一個映象啟動一個容器,一個映象可以啟動無限個容器副本,每個容器還互相隔離,可以將一個個容器理解成一個個虛擬機器,每個容器都有自己的IP、檔案系統等等。

和虛擬機器相比,容器執行時雖然網路、檔案等資源是隔離的,但是共享主機的核心,即,Docker沒有為每個容器都從頭啟動核心,而是在當前主機系統的核心中執行容器中的程式,這相對於VM虛擬機器有非常大的效能優勢,所以稱Docker為輕量虛擬化。

可以通過 docker start / docker stop / docker restart 控制容器的啟動、停止、重啟。

執行docker commit命令可以將正在執行的容器生成一個新版本的映象,但是推薦使用Dockerfile生成映象。

Dockerfile

簡言之,Dockerfile是生成映象的配置檔案,例如:

# 指定tomcat版本
FROM tomcat:8.5.32-jre8

# 指定工作目錄
WORKDIR /app

# 將打包後的 server.jar 拷貝到映象中
# 可以使用脈衝雲的編譯構建服務,線上將原始碼打包成 jar
ADD server.jar /app/server.jar

# 設定映象的啟動命令
CMD java -jar /app/server.jar

# 宣告需要監聽的埠
EXPOSE 8080
Copy複製程式碼

該檔案中首先宣告瞭映象的基礎映象,一般情況下,你構建的映象需要依賴一個基礎映象,就像你在一個電腦上安裝軟體的前提是這個電腦已經有了一個作業系統。

然後Dockerfile中記錄著生成新映象的一個個步驟,包括拷貝檔案、執行命令等。

Dockerfile中還包含著一些其他資訊的宣告,比如環境變數、標註需要開放的埠等。

使用docker build 命令,可以依照Dockerfile中記錄的步驟,一步步生成新的映象。

在正在執行的容器內執行一個個命令,安裝一個個軟體,然後執行 docker commit 也能生成一個新的映象,但是請不要這樣操作。因為,使用Dockerfile可以記錄下來映象的生成過程,並且能夠隨時調整其中的步驟,重新生成映象。這就是傳說中的基礎設施即程式碼,將基礎環境的配置當做軟體程式設計來進行。

備份檔案

可以使用 docker save 命令,將你電腦上生成的映象匯出成tar打包檔案,然後用來資料備份,或將檔案拷貝到其他電腦上,用docker load 命令匯入映象,實現映象的分發。

但是,這樣操作非常麻煩,尤其是遠端傳輸。請使用映象倉庫來進行統一管理和分發。

映象倉庫

映象倉庫就是一個線上提供映象儲存的服務。使用 docker pull 從映象倉庫中拉取(下載)映象,使用 docker push 命令將本地映象推送(上傳)到映象倉庫中。

通常我們所有用到的映象都來自Docker官方倉庫 hub.docker.com ,對於企業使用者,脈衝雲也提供了企業私有映象倉庫,你必須擁有指定專案的許可權,並且通過 docker login maichong.io 登入後才能向脈衝雲中推拉映象。

最後,作為普通開發者,脈衝雲不要求記住全部的Docker概念和命令,只需要會編寫Dockerfile配置應用程式的環境即可,我們下一節繼續介紹如何編寫Dockerfile。

相關文章