天天看點

docker 使用centos 鏡像 運作 javaweb ,并重新生成鏡像 原料 做法 品嘗 總結

docker 使用centos 鏡像 運作 javaweb ,并重新生成鏡像 原料 做法 品嘗 總結

凡是使用過虛拟機的同學,應該都知道,啟動虛拟機就像啟動一台計算機,初始化過程是相當慢的,我們需要等很久,才能看到登入界面。一旦虛拟機啟動以後,就 可以與主控端建立網絡連接配接,確定虛拟機與主控端之間是互聯互通的。不同的虛拟機之間卻是互相隔離的,也就是說,彼此并不知道對方的存在,但每個虛拟機占用 的都是主控端的硬體與網絡資源。

我們再來對比一下 docker 技術的體系架構吧:

docker 使用centos 鏡像 運作 javaweb ,并重新生成鏡像 原料 做法 品嘗 總結

可見,在主控端的作業系統上,有一個 docker 服務在運作(或者稱為“docker 引擎”),在此服務上,我們可開啟多個 docker 容器,而每個 docker 容器中可運作自己所需的應用程式,docker 容器之間也是互相隔離的,同樣地,都是占用的主控端的硬體與網絡資源。

docker 容器相對于虛拟機而言,除了在技術實作上完全不一樣以外,啟動速度較虛拟機而言有本質的飛躍,啟動一個容器隻在眨眼瞬間。不管是虛拟機還是 docker 容器,它們都是為了隔離應用程式的運作環境,節省我們的硬體資源,為我們開發人員提供福利。

我們再來看看 docker 的 logo 吧:

docker 使用centos 鏡像 運作 javaweb ,并重新生成鏡像 原料 做法 品嘗 總結

很明顯,這是一隻鲸魚,它托着許多集裝箱。我們可以把主控端可當做這隻鲸魚,把互相隔離的容器可看成集裝箱,每個集裝箱中都包含自己的應用程式。這 logo 簡直的太形象了!

需要強調的是,筆者并非否定虛拟化技術,而是想通過本文讓更多的讀者了解如何使用 docker 技術,讓大家知道除了虛拟化技術以外,還有另一種替代技術,也能讓應用程式隔離起來。

下面,我們将結合一個 java web 應用的部署過程,來描述如何“烹饪”docker 這份美味佳肴。您準備好了嗎?我們現在就開始!

需要說明的是,ubuntu 或其它 linux 作業系統也能玩 docker,隻不過本文選擇了以 centos 為例,僅此而已。

centos 具體要求如下:

必須是 64 位作業系統

建議核心在 3.8 以上

通過以下指令檢視您的 centos 核心:

如果執行以上指令後,輸出的核心版本号低于 3.8,請參考下面的方法來來更新您的 linux 核心。

對于 centos 6.5 而言,核心版本預設是 2.6。首先,可通過以下指令安裝最新核心:

随後,編輯以下配置檔案:

将default=1修改為default=0。

最後,通過reboot指令重新開機作業系統。

重新開機後如果不出意外的話,再次檢視核心,您的 centos 核心将會顯示為 3.10。

如果到這裡,您和我們所期望的結果是一緻的。恭喜您!下面我們就一起來安裝 docker 了。

隻需通過以下指令即可安裝 docker 軟體:

可使用以下指令,檢視 docker 是否安裝成功:

若輸出了 docker 的版本号,則說明安裝成功了,可通過以下指令啟動 docker 服務:

一旦 docker 服務啟動完畢,我們下面就可以開始使用 docker 了。

就像曾經安裝軟體一樣,我們首先需要有一張刻錄了該軟體的CD光牒,如果您使用的是虛拟光驅,那麼就需要運作一種名為“鏡像”的檔案,通過它來安裝軟體。在 docker 的世界裡,也有一個名為“鏡像”的東西,已經安裝我們所需的作業系統,我們一般成為“docker 鏡像”,本文簡稱“鏡像”。

那麼問題來了,我們從哪裡下載下傳鏡像呢?

docker 官網 确實已經提供了所有的鏡像下載下傳位址,可惜在國内卻是無法通路的。幸好國内好心人提供了一個 docker 中文網,在該網站上可以下載下傳我們所需的 docker 鏡像。

我們不妨還是以 centos 為例,通過以下步驟,下載下傳一個 centos 的鏡像。

首先,通路 docker 中文網,在首頁中搜尋名為“centos”的鏡像,在搜尋的結果中,有一個“官方鏡像”,它就是我們所需的。

然後,進入 centos 官方鏡像頁面,在“pull this repository”輸入框中,有一段指令,把它複制下來,在自己的指令行上運作該指令,随後将立即下載下傳該鏡像。

最後,使用以下指令檢視本地所有的鏡像:

當下載下傳完成後,您應該會看到:

如果看到以上輸出,說明您可以使用“docker.cn/docker/centos”這個鏡像了,或将其稱為倉庫(repository),該鏡像有一 個名為“centos6”的标簽(tag),此外還有一個名為“25c5298b1a36 ”的鏡像 id(可能您所看到的鏡像 id 與此處的不一緻,那是正常現象,因為這個數字是随機生成的)。此外,我們可以看到該鏡像隻有 215.8 mb,非常小巧,而不像虛拟機的鏡像檔案那樣龐大。

現在鏡像已經有了,我們下面就需要使用該鏡像,來啟動容器。

容器是在鏡像的基礎上來運作的,一旦容器啟動了,我們就可以登入到容器中,安裝自己所需的軟體或應用程式。既然鏡像已經下載下傳到本地,那麼如何才能啟動容器呢?

隻需使用以下指令即可啟動容器:

這條指令比較長,我們稍微分解一下,其實包含以下三個部分:

其中,相關參數包括:

-i:表示以“互動模式”運作容器

-t:表示容器啟動後會進入其指令行

-v:表示需要将本地哪個目錄挂載到容器中,格式:-v <主控端目錄>:<容器目錄>

假設我們的所有安裝程式都放在了主控端的/root/software/目錄下,現在需要将其挂載到容器的/mnt/software/目錄下。

需要說明的是,不一定要使用“鏡像 id”,也可以使用“倉庫名:标簽名”,例如:docker.cn/docker/centos:centos6。

初始指令表示一旦容器啟動,需要運作的指令,此時使用“/bin/bash”,表示什麼也不做,隻需進入指令行即可。

為了搭建 java web 運作環境,我們需要安裝 jdk 與 tomcat,下面的過程均在容器内部進行。我們不妨選擇/opt/目錄作為安裝目錄,首先需要通過cd /opt/指令進入該目錄。

注意:安裝軟體必須在啟動響應的容器後,在容器的指令行中執行,當 docker run 鏡像id 後,會自動進入容器的操作視窗,如下:

首先,解壓 jdk 程式包:

然後,重命名 jdk 目錄:

首先,解壓 tomcat 程式包:

然後,重命名 tomcat 目錄:

首先,編輯.bashrc檔案

然後,在該檔案末尾添加如下配置:

最後,需要使用source指令,讓環境變量生效:

注意:如果不想啟動docker就運作,可以跳過此步驟

我們需要編寫一個運作腳本,當啟動容器時,運作該腳本,啟動 tomcat,具體過程如下:

首先,建立運作腳本:

然後,編輯腳本内容如下:

注意:這裡必須先加載環境變量,然後使用 tomcat 的運作腳本來啟動 tomcat 服務。

最後,為運作腳本添加執行權限:

當以上步驟全部完成後,可使用exit指令,退出容器。

随後,可使用如下指令檢視正在運作的容器:

此時,您應該看不到任何正在運作的程式,因為剛才已經使用exit指令退出的容器,此時容器處于停止狀态,可使用如下指令檢視所有容器:

輸出如下内容:

使用以下指令,根據某個“容器 id”來建立一個新的“鏡像”:

該容器的 id 是“57c312bbaad1”,所建立的鏡像名是“huangyong/javaweb:0.1”,随後可使用鏡像來啟動 java web 容器。

注意,此處特别重要。如果需要外網能狗通路docker容器,則必須給容器影射端口,不然萬網無法通路容器,就連主控端也無法通路容器。

有必要首先使用docker images指令,檢視目前所有的鏡像:

可見,此時已經看到了最新建立的鏡像“huangyong/javaweb:0.1”,其鏡像 id 是“fc826a4706af”。正如上面所描述的那樣,我們可以通過“鏡像名”或“鏡像 id”來啟動容器,與上次啟動容器不同的是,我們現在不再進入容器的指令行,而是直接啟動容器内部的 tomcat 服務。此時,需要使用以下指令:

注意:如果沒有編寫啟動tomcat腳本,而在docker容器中指令運作使用如下指令

如果同時挂載檔案

稍作解釋:

-d:表示以“守護模式”執行/root/run.sh腳本,此時 tomcat 控制台不會出現在輸出終端上。

-p:表示主控端與容器的端口映射,此時将容器内部的 8080 端口映射為主控端的 58080 端口,這樣就向外界暴露了 58080 端口,可通過 docker 網橋來通路容器内部的 8080 端口了。

--name:表示容器名稱,用一個有意義的名稱命名即可。

關于 docker 網橋的内容,需要補充說明一下。實際上 docker 在主控端與容器之間,搭建了一座網絡通信的橋梁,我們可通過主控端 ip 位址與端口号來映射容器内部的 ip 位址與端口号,

在一系列參數後面的是“鏡像名”或“鏡像 id”,怎麼友善就怎麼來。最後是“初始指令”,它是上面編寫的運作腳本,裡面封裝了加載環境變量并啟動 tomcat 服務的指令。

當運作以上指令後,會立即輸出一長串“容器 id”,我們可通過docker ps指令來檢視目前正在運作的容器。

在浏覽器中,輸入以下位址,即可通路 tomcat 首頁:

注意:這裡使用的是主控端的 ip 位址,與對外暴露的端口号 58080,它映射容器内部的端口号 8080。

通過本文,我們了解了 docker 是什麼?它與虛拟機的差别在哪裡?以及如何安裝 docker?如何下載下傳 docker 鏡像?如何運作 docker 容器?如何在容器内安裝應用程式?如何在容器上建立鏡像?如何以服務的方式啟動容器?這一切看似簡單,但操作也是相當繁瑣的,不過熟能生巧,需要我們不斷 地操練。

除了這種手工生成 docker 鏡像的方式以外,還有一種更像是寫代碼一樣,可以自動地建立 docker 鏡像的方式。隻需要我們編寫一個 dockerfile 檔案,随後使用docker build指令即可完成以上所有的手工操作。