JavaRush /Java Blog /Random-TW /初識Docker
Viacheslav
等級 3

初識Docker

在 Random-TW 群組發布
容器化是實務上經常使用的機制。例如,當你在獵人頭上搜尋時,截至今天你會發現 477 個職缺提到了 Docker。因此,熟悉一下它是什麼並不是一個壞主意。我希望這篇簡短的評論將有助於形成第一個想法。好吧,他會用額外的材料來支持它,例如 Udemy 上的課程。 Docker 初識 - 1

介紹

在這篇簡短的評論中,我想談談容器化等主題。您需要先了解容器化實際上是什麼。根據維基百科,「容器化」是作業系統層級(即不是硬體)虛擬化,其中作業系統核心維護多個獨立的使用者空間實例,而不是僅一個。「用戶空間」是作業系統為使用者程式保留的虛擬記憶體位址空間。從使用者的角度來看,使用者空間實例(通常稱為容器)與單一作業系統實例完全相同。核心保證容器完全隔離,不同容器的程式不會互相影響。原來容器化就是軟體虛擬化,也就是作業系統層面的虛擬化,由作業系統核心負責。這種方法的特徵之一是所有容器都使用與主機作業系統(即容器所在的作業系統)相同的通用核心。這使您可以擺脫模擬虛擬硬體和啟動成熟的作業系統實例的開銷。可以說,這就是「輕量級」虛擬化。核心是作業系統的核心部分,它為應用程式提供對電腦資源(例如處理器時間、記憶體、外部硬體以及外部輸入和輸出設備)的協調存取。核心通常也提供檔案系統和網路協定服務。一般來說,這是整個系統的核心。有關其他信息,查看材料“有關容器的一般信息”可能會有所幫助。還需要多說幾句話才能讓介紹完整。我們現在知道作業系統有內核。它為用戶空間實例提供隔離。在這種情況下,您可能會遇到術語「cgroups」。這是允許您實現此目的的 Linux 核心機制的名稱。因此,可以說容器化之路是從Linux系統開始的。不過,從Windows 10開始,對容器化的支援也出現了。若要使用虛擬化,您需要在電腦的 BIOS 中配置虛擬化支援。如何執行此操作取決於計算機。例如,它可能看起來像這樣:
Docker 初識 - 2
在 Windows 上,您可以透過不同的方式進行檢查。例如,您可以從 Microsoft 網站下載一個特殊的實用程式:硬體輔助虛擬化偵測工具。好吧,值得一提的是另一個重要的概念—Hypervisor。Hypervisor是一個虛擬機器監視器,是一個確保同一台電腦上多個作業系統並行執行的程式。虛擬機器管理程式確保作業系統彼此隔離並在執行的作業系統之間共用資源。Oracle VirtualBox就是這樣的虛擬機器管理程式之一。
Docker 初識 - 3

碼頭工人

那麼,什麼是虛擬化就很清楚了。但如何使用呢?Docker 在這裡為我們提供了幫助。Docker 是用於在容器化環境中自動部署和管理應用程式的軟體。值得一提的是,Docker 以 Docker Enginge 這樣的概念為代表。您應該從 Docker 官方網站和「Docker 概述」部分開始。
Docker 初識 - 4
文件說 docker 包括:
  • Docker伺服器稱為Docker Daemon進程(dockerd)。
  • 命令列介面,也稱為 CLI (docker)。
  • 一個 REST API,描述程式如何與守護程式「對話」並告訴它要做什麼。
在我們進一步深入之前,讓我們先安裝 docker,也就是安裝 docker 守護程式。Docker 網站有安裝「Docker for Windows」的說明。有趣的是,Docker 有自己的系統需求。如果您像我一樣擁有舊的 Windows,例如 Windows 7,那麼您需要使用 Docker Toolbox。
Docker 初識 - 5

Docker工具箱

在不符合系統需求的舊機器上安裝Docker。網站是這樣說的:「舊版桌面解決方案」。我們到「Docker Toolbox」頁面下載它。該套裝重約 211 兆位元組。我們將把它安裝為預設值,也就是說,我們將簡單地溫順地同意一切,而不重新排列標誌。安裝後,我們將檢查一切是否正常。未來,我們的戰場將是命令列。我建議不要使用Windows命令列,因為它可能會出現不明顯的問題。最好使用 bash shell。在Windows上,最推薦的取得方式是安裝git版本控制系統,它仍然會派上用場。因為與它「捆綁」的將是我們需要的 bash。對於本次審查,我將使用 git bash。您也可以使用CYGWIN安裝 bash 。讓我們啟動 bash 或 git bash。讓我們確保我們已經安裝了 Docker Machine,也稱為 Docker Machine:docker-machine -version 這個 Docker Machine 是什麼? Docker Machine是用於管理 docker 化主機(這些主機是安裝了 Docker Engine 的主機)的實用程式。如果我們在安裝 Docket Toolbox 後立即使用命令查看 docker 機器docker-machine ls,我們將看到一個空列表:
Docker 初識 - 6
讓我們創建一台新機器。為此,我們需要執行create命令::docker-machine create -- driver virtualbox javarush我們將看到docker機器建立日誌:
Docker 初次介紹 - 7
我們感興趣的是以下內容。Boot2Docker是什麼?這是一個用於運行 Docker 引擎的簡約 Linux 發行版(我們知道 Docker 的工作得益於 Linux 虛擬化工具,而在 Windows 中,必要的機制僅從 Windows 10 開始出現)。該發行版基於「Tiny Core Linux」發行版。也提到了 VirtualBox VM。這是因為我們指定了--driver virtualbox. 在 VirtualBox 中從 Boot2Docker 映像建立了一個新的虛擬機器。建立完成後,我們可以啟動VirtualBox(因為VirtualBox是隨Docker Toolbox一起安裝的)並查看為docker機器建立的虛擬機器:
Docker 初識 - 8
創建完成後,會提示我們執行命令「docker-machine env」來取得連接docker機器需要配置的環境變數:
Docker 初識 - 9
使用 docker-machine 執行此命令後,我們連接到遠端 docker 化主機(在本例中是 Virtual Box 上託管的虛擬主機),並且可以在本機執行 docker 命令,就像在遠端主機上執行它們一樣。要檢查,我們可以執行“ docker info ”命令。如果未建立與 docker 機器的連接,我們將收到錯誤。如果一切順利,則會顯示有關 docker 機器上 docker 的資訊。現在是時候了解 Docker 一般如何運作以及如何使用它了。
Docker 初識 - 10

Docker容器

所以我們有碼頭工人。這個 docker 到底是什麼?Docker 文件和「入門」部分將幫助我們理解這一點。本節的引言部分介紹了 Docker概念。它指出,Docker 是一個用於在容器中開發、調試和運行應用程式的平台。所以說,Docker最主要的就是容器。即使你看docker的標誌,它也是一頭背著容器的鯨魚。但什麼是容器呢?接下來的“映像和容器”部分錶示容器是映像的運行實例。Image 是一個“套件”,包含應用程式所需的一切(程式碼、環境、函式庫、設定等)。現在我們自己來嘗試。Docker 網站有一個名為「Docker 範例」的部分,其中包括「Docker for Beginners」。這裡的例子對我來說似乎更有趣。所以,我們突然想熟悉Alpine Linux,我們可以使用 Docker 容器來做到這一點。要獲得圖像,我們必須將其“拉”或“拉”出來。因此,我們執行docker pull命令:docker pull apline
Docker 初識 - 11
正如我們所看到的,我們正在從某個地方下載。預設情況下,Docker 查看其在網路https://hub.docker.com上的儲存庫。成功檢索映像後,我們可以透過執行docker images命令來檢查可用映像的清單:
Docker 初識 - 12
現在我們有了一個 apline 映像。由於容器是映像的運行實例,因此讓我們啟動這個映像。讓我們使用命令啟動容器docker run alpine。正如我們所見,什麼也沒發生。如果我們執行命令docker ps來顯示所有活動容器,我們也不會得到任何結果。但如果我們執行,docker ps -a我們將看到所有容器:
初識 Docker - 13
問題是我們沒有以互動模式啟動 Docker。於是,他執行了命令,停了下來。該命令是打開終端機。讓我們做同樣的事情,但是在互動模式下(使用-it標誌):
Docker 初識 - 14
正如您所看到的,克服了一個錯誤並使用提示後,我們到達了容器並可以在其中工作!要退出容器而不停止其運行,可以按Ctrl + p + q。如果我們現在運行docker ps,我們將看到一個活動容器。若要進入已經執行的容器,請執行docker exec命令:
初識 Docker - 15
我建議閱讀 Docker 範例的描述,以獲取關於這一切如何發生的精彩描述:「1.0 運行你的第一個容器」。我喜歡它,因為所有內容都以一種非常容易理解的方式寫在那裡。簡而言之,我們使用 docker-machine 連接到執行 Docker Daemon 的虛擬機器。使用 CLI 透過 REST API,我們要求啟動 alpine 鏡像。Docker 找到了它,因此不會下載它。Docker 建立一個新容器並執行我們在該容器中指定的命令。當然,這一切都是好的。但為什麼我們需要這一切?而這裡我們需要弄清楚docker是如何建立映像的。他根據 dockerfile 創建它們。
Docker 初識 - 16

Dockerfile

如Dockerfile 參考中所述,dockerfile 是一個文字文件,其中包含用於取得映像的所有命令。事實上,我們收到的所有映像(甚至是上面範例中的 Alpine)都是從 dockerfile 建立的。讓我們使用 Java 應用程式來建立我們的映像。首先我們需要這個 Java 應用程式。我建議使用 Gradle 建置系統,您可以在這篇簡短的評論中閱讀更多:「Gradle 簡介」。將幫助我們創建專案「Gradle Build init plugin」。讓我們使用 Gradle 建立一個新的 Java 應用程式: gradle init --type java-application 此命令建立一個範本 Java 專案。這是一個獨立的應用程序,但我們想創建一個 Web 應用程式。讓我們刪除 App 和 AppTest 類別(它們是由 Gradle Build Init 插件自動產生的)。為了快速創建 Web 應用程序,我們將使用 Gradle 中的教程:「建立 Java Web 應用程式」。根據教程,我們來做: 你必須要小心。與往常一樣,範例中可能存在錯誤。這裡是:
Docker 初識 - 17
現在,為了測試它,讓我們將 gretty 插件新增到 build.gradle,如「新增 gretty 外掛程式並執行應用程式」部分所示:
plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}
有趣的是,Gretty 沒有看到HelloServlet上面描述的 中的錯誤。這證明應用程式在不同的環境中可以有不同的行為。Gretty 可以在常規獨立伺服器會拋出錯誤的地方工作。剩下的就是檢查應用程式是否正常運作。讓我們做:gradle appRun
初識 Docker - 18
如果一切順利,則使用該命令gradle war收集帶有擴展 war 的存檔(網路存檔)。預設情況下,gradle 將其建置在\build\libs. 現在,我們準備好要寫 dockerfile。使用「Dockerfile 參考」我們將建立一個 Dockerfile。讓我們在 Java 專案的根目錄中建立一個名為「Dockerfile」的檔案(與建置腳本位於同一位置)。讓我們打開它進行編輯。該文件有自己的格式,在「Dockerfile 參考:格式」部分中進行了描述。任何 dockerfile 都以 FROM 語句開頭,表示「基礎映像」。我們可以說這是我們製作圖像的基礎圖像。我們很容易選擇父圖像。Web 應用程式需要 Web 伺服器。例如,我們可以使用 Tomcat Web 伺服器。我們進入官方 Docker 儲存庫,稱為docker hub。我們查看那裡是否有我們需要的圖像:
初識 Docker - 19
還值得理解的是 tomcat 鏡像的呼叫。但除了名稱之外,它還有一個標籤。標籤就像一個版本。不同版本的Tomcat鏡像的差異在於使用哪個版本的Tomcat、哪個版本的jre以及哪個基礎鏡像。例如,我們可以得到一個鏡像,docker pull tomcat:9-jre8-alpine 它使用tomcat版本9、jre版本8和alpine鏡像作為基礎。這對於減小圖像的大小非常重要:
初識 Docker - 20
正如我們所看到的,差異是巨大的。如果我們基於 tomcata alpine 建立映像,我們將僅從 100 MB 開始,而不是 600 MB。因此,我們將以下內容新增到先前建立的 dockerfile 中:
# Базовый образ, "наследуемся" от него
FROM tomcat:9-jre8-alpine
# Копируем из Build Context'а собранный web archive в каталог томката
COPY build/libs/docker.war /usr/local/tomcat/webapps/docker.war
# Меняем рабочий каталог на томкатовский
WORKDIR /usr/local/tomcat
# Открываем порт 8080 для контейнера, т.к. его слушает томкат
EXPOSE 8080
現在讓我們執行命令來建立映像docker build -t jrdocker .
初識 Docker - 21
-t- 這是一個標籤,也就是組裝好的鏡像叫什麼。末尾的點表示我們將當前目錄(dockerfile 所在的目錄以及我們運行命令的目錄)添加到Build context. Build context- 這是建立 dockerfile 時可用的那些檔案的上下文。正如您所看到的,多虧了這一點,我們能夠將組裝的 war 檔案複製到我們的映像中,到 Web 伺服器目錄中。現在讓我們運行我們的映像:docker run -d --rm -p 8888:8080 jrdocker
初識 Docker - 22
若要了解伺服器是否已啟動,可以查看容器中的日誌。可以使用 docker log 指令取得日誌,並透過容器的 ID 或名稱指定容器。例如:
初識 Docker - 23
好吧,不要忘記我們總是可以使用以下命令按名稱存取正在運行的容器:winpty docker exec -it NameКонтейнера sh 現在剩下的就是連接了。之前,我們指定了EXPOSE,即允許從容器內部存取 8080 連接埠。當我們啟動容器本身時,我們指定了 -p (傳入連接埠)標籤,從而關聯容器(Tomcat Web 伺服器)上的 8080 連接埠正在等待與具有docker 守護程式的電腦上的連接埠8888 的連線。我們記得,我們​​不是直接啟動 docker 守護進程,而是透過 docker-machine 啟動。因此,我們將再次使用 docker-machine ls 命令請求 docker 機器上的資料並聯絡容器中的伺服器:
Docker 初次介紹 - 24
因此,你和我剛剛在 Docker 容器中啟動了我們的 Web 應用程式!)我還想指出以下幾點。如果出現存取問題,您應該記住,Docker 機器首先是 Virtual BOx 虛擬機器。虛擬機器的網路設定可能有問題。正常工作的 VMBox 配置可能如下所示:
初識 Docker - 25
初識 Docker - 26

層數

我們已經知道映像像是從 dockerfile 建立的,而 dockerfile 是一組指令。我們也發現 dockerfile 有一個父檔。而且影像的大小是不同的。有趣的是,您可以使用docker History指令查看映像建置的歷史記錄。例如:
初識 Docker - 27
重要的是要理解,從本質上講,每個圖像都是一組圖像。每個映像變更(dockerfile 中的每個新指令)都會建立一個具有自己的 ID 的新圖層。您可以在文件「Docker:映像和圖層」中閱讀有關圖層的更多資訊。我還強烈推薦閱讀關於 Habré 的文章:「Docker 映像和圖片中的容器」。

結論

我希望這個簡短的概述足以讓您對容器化感興趣。以下是可能有用的其他材料的連結: #維亞切斯拉夫
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION