做過java的同學(xué)可能對上圖的架構(gòu)方式?..."/>
溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

云原生技術(shù)之Docker入門

發(fā)布時間:2020-07-22 12:17:09 來源:網(wǎng)絡(luò) 閱讀:225 作者:wx5d32e3bc1243e 欄目:云計算

1. 為什么需要容器?

下圖是一個比較傳統(tǒng)的軟件架構(gòu):

云原生技術(shù)之Docker入門cdn.xitu.io/2019/9/4/16cfb4bb0a18c6fe?w=527&h=299&f=png&s=6986">

做過java的同學(xué)可能對上圖的架構(gòu)方式比較了解,我們通常會將一個應(yīng)用程序生成一個war包,放到一個tomcat容器當(dāng)中并在一臺虛擬機(VM)中啟動運行,然后配置nginx的負載均衡策略,將來自用戶的請求轉(zhuǎn)發(fā)到某個tomcat應(yīng)用上,這種基于主機或虛擬機部署的應(yīng)用會存在以下幾個問題:

可移植性差

需要事先安裝應(yīng)用所需要的運行環(huán)境,比如java應(yīng)用所需要的jdk或者jre,如果需要重新部署一個應(yīng)用,就需要重新初始化環(huán)境再安裝應(yīng)用,過程繁瑣; 另外如果一個應(yīng)用需要jdk7的運行環(huán)境另外一個應(yīng)用需要jdk8,那在一臺主機上就很難滿足;

可維護性差

如果tomcat應(yīng)用本身或者所在的虛擬機操作系統(tǒng)出現(xiàn)問題時,則需要人工干預(yù),比如配置nginx轉(zhuǎn)發(fā)規(guī)則、執(zhí)行重啟操作等;

可擴展性差

應(yīng)用的負載有高有低,不夠穩(wěn)定,當(dāng)前應(yīng)用負載大的時候,我們需要增加應(yīng)用的數(shù)量,當(dāng)應(yīng)用負載降低的時候,我們需要降低應(yīng)用的數(shù)量;

無法資源隔離

如果一臺虛擬機部署多個應(yīng)用,不同的應(yīng)用或者進程之間會相互影響;

...

我們接下來就來看一下我們是如何一步步的解決這些問題的。

首先是容器化,我們選擇的方案是Docker。

Docker將應(yīng)用程序與該程序的依賴,打包成一個容器鏡像,運行這個文件就會生成虛擬容器。程序在這個虛擬容器里運行,就好像運行在真實的物理機上,并且每個容器之間資源互相隔離而且都有自己的文件系統(tǒng),這樣容器之間進程不會相互影響,可以通過下圖來進行對比基于虛擬機和基于容器部署應(yīng)用的區(qū)別:

?

云原生技術(shù)之Docker入門

2. Docker介紹

2.1 Docker架構(gòu)

Docker是客戶端-服務(wù)器架構(gòu)的應(yīng)用,主要由以下部分組成:

服務(wù)端是一個名為dockerd守護進程,用來監(jiān)聽REST API請求并管理Docker對象,比如鏡像、容器、存儲卷及網(wǎng)絡(luò)等。

命令行客戶端(CLI),也就是我們平常在控制臺輸入的docker命令行,通過調(diào)用REST API進行控制Docker daemon或者同其進行集成。

鏡像倉庫(Docker Registries),鏡像倉庫用來存儲Docker鏡像。

以下是Docker的架構(gòu)示意圖:

云原生技術(shù)之Docker入門

?

云原生技術(shù)之Docker入門

2.2 Docker對象

IMAGES

鏡像一般是通過指令創(chuàng)建的只讀文件,用來生成容器。一般一個鏡像是基于另外一個鏡像并添加一些額外的指令創(chuàng)建的,可以通過一個名為Dockerfile的文件來生成一個鏡像,在Dockerfile中的每一行指令會生成一層(layer)。當(dāng)Dockerfile有改動需要重新生成鏡像時,只需要重新生成改變的那些層就可以,這樣就可以使得鏡像文件更加輕量、快速構(gòu)建。

CONTAINERS

容器是通過鏡像文件生成的運行實例??梢酝ㄟ^REST API或者docker client進行創(chuàng)建、啟動、停止、移動或者刪除一個容器。

SERVICE

用來管理和擴展多個容器,需要同docker swarm一起工作

2.3 底層技術(shù)

Docker采用go語言編寫,并且使用了Linux內(nèi)核中的幾個特性來實現(xiàn)其功能,主要有如下:

Namespaces

Docker通過Namespaces來提供隔離的工作空間(Workspace),當(dāng)你運行一個容器的時候,Docker為這個容器創(chuàng)建了數(shù)個不同類型的Namespaces,主要有以下類型:

pid namespace:提供進程隔離功能?

net namespace:管理網(wǎng)絡(luò)接口?

ipc namespace:內(nèi)部資源訪問控制 (IPC:Inter Process Communication)?

mnt namespace:管理文件系統(tǒng)掛載?

?uts namespace: 內(nèi)核隔離以及版本識別(UTS:Unix Timesharing System)

CGroups(Control Groups)

Docker通過CGroup來限定容器只能使用特定的資源。舉例來講,Docker可以限制某個容器只能使用多少cpu及內(nèi)存資源。

UnionFS(Union File System)

一種文件系統(tǒng)類型,可以運行在其他文件系統(tǒng)上,通過創(chuàng)建不同的層來使得容器文件系統(tǒng)更加輕量和快速。還有其他幾種類似的文件系統(tǒng),包括AUFS、btrfs、vfs和DeviceMapper。

3. Docker的安裝部署

以下命令是在Centos7上的命令,其他操作系統(tǒng)會存在一些差異

yum?install?docker:通過yum下載docker相關(guān)的依賴
systemctl?enable?docker:?開機運行systemctl?
start?docker:?啟動docker服務(wù)

執(zhí)行完上述操作,docker服務(wù)已經(jīng)在運行了,可以通過執(zhí)行 docker version 和 docker info 命令查看docker的版本以及相關(guān)的信息。

4. Docker的使用

4.1 Dockerfile文件

我們之前有提到Docker可以將應(yīng)用程序打包成一個鏡像,那么如何生成鏡像文件呢?這就需要用到Dockerfile文件。它是一個文本文件,用來配置鏡像,Docker根據(jù)該文件生成二進制的鏡像文件。以下是一個Dockerfile文件示例:

#?該鏡像文件繼承官方的nginx鏡像,冒號表示標簽,這里標簽是latest,表示最新的版本
FROM?nginx:latest
#?將_book目錄下的文件copy至鏡像文件的/var/www/public目錄
COPY?_book?/var/www/public/
COPY??nginx_app.conf/etc/nginx/conf.d/?nginx_app.conf
#?將容器的8080端口暴露出來,允許外部連接這個端口
EXPOSE?8080
#?容器啟動后執(zhí)行?nginx?-g?daemon?off?命令
CMD?["nginx",?"-g",?"daemon?off;"]

4.2 創(chuàng)建鏡像文件

有了Dockerfile文件以后,就可以用docker build命令創(chuàng)建鏡像文件了。

docker?build?-t?zcloud-document:0.0.1.
docker?image?ls

如果運行成功,就可以看到新生成的鏡像文件zcloud-document了。

4.3 生成容器

#?生成容器
docker?run?-p?8080:8080?-it?zcloud-document:0.0.1
docker?ps
#?重新生成一個新的鏡像標簽,并指向原來的鏡像
docker?tag?zcloud-document:0.0.1?10.0.0.183:5000/zcloud/zcloud-document:0.0.1
#?推送到私有鏡像倉庫
docker?push?10.0.0.183:5000/zcloud/zcloud-document:0.0.1

關(guān)于Docker其他的一些操作命令,大家可以自行查閱,網(wǎng)上介紹的文章也比較多,參考文章:Docker 入門教程(https://docs.docker.com/get-started/)


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI