雲原生技術之Docker入門

1.爲何須要容器?

下圖是一個比較傳統的軟件架構:java

clipboard.png

作過java的同窗可能對上圖的架構方式比較瞭解,咱們一般會將一個應用程序生成一個war包,放到一個tomcat容器當中並在一臺虛擬機(VM)中啓動運行,而後配置nginx的負載均衡策略,未來自用戶的請求轉發到某個tomcat應用上,這種基於主機或虛擬機部署的應用會存在如下幾個問題:nginx

可移植性差

須要事先安裝應用所須要的運行環境,好比java應用所須要的jdk或者jre,若是須要從新部署一個應用,就須要從新初始化環境再安裝應用,過程繁瑣; 另外若是一個應用須要jdk7的運行環境另一個應用須要jdk8,那在一臺主機上就很難知足;docker

可維護性差

若是tomcat應用自己或者所在的虛擬機操做系統出現問題時,則須要人工干預,好比配置nginx轉發規則、執行重啓操做等;tomcat

可擴展性差

應用的負載有高有低,不夠穩定,當前應用負載大的時候,咱們須要增長應用的數量,當應用負載下降的時候,咱們須要下降應用的數量;服務器

沒法資源隔離

若是一臺虛擬機部署多個應用,不一樣的應用或者進程之間會相互影響;網絡

...架構

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

首先是容器化,咱們選擇的方案是Docker。負載均衡

Docker將應用程序與該程序的依賴,打包成一個容器鏡像,運行這個文件就會生成虛擬容器。程序在這個虛擬容器裏運行,就好像運行在真實的物理機上,而且每一個容器之間資源互相隔離並且都有本身的文件系統,這樣容器之間進程不會相互影響,能夠經過下圖來進行對比基於虛擬機和基於容器部署應用的區別:ui

clipboard.png

2. Docker介紹

2.1 Docker架構

Docker是客戶端-服務器架構的應用,主要由如下部分組成:

服務端是一個名爲dockerd守護進程,用來監聽REST API請求並管理Docker對象,好比鏡像、容器、存儲卷及網絡等。

命令行客戶端(CLI),也就是咱們日常在控制檯輸入的docker命令行,經過調用REST API進行控制Docker daemon或者同其進行集成。

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

如下是Docker的架構示意圖:

clipboard.png

clipboard.png

2.2 Docker對象

IMAGES

鏡像通常是經過指令建立的只讀文件,用來生成容器。通常一個鏡像是基於另一個鏡像並添加一些額外的指令建立的,能夠經過一個名爲Dockerfile的文件來生成一個鏡像,在Dockerfile中的每一行指令會生成一層(layer)。當Dockerfile有改動須要從新生成鏡像時,只須要從新生成改變的那些層就能夠,這樣就可使得鏡像文件更加輕量、快速構建。

CONTAINERS

容器是經過鏡像文件生成的運行實例。能夠經過REST API或者docker client進行建立、啓動、中止、移動或者刪除一個容器。

SERVICE

用來管理和擴展多個容器,須要同docker swarm一塊兒工做

2.3 底層技術

Docker採用go語言編寫,而且使用了Linux內核中的幾個特性來實現其功能,主要有以下:

Namespaces

Docker經過Namespaces來提供隔離的工做空間(Workspace),當你運行一個容器的時候,Docker爲這個容器建立了數個不一樣類型的Namespaces,主要有如下類型:

pid namespace:提供進程隔離功能

net namespace:管理網絡接口

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

mnt namespace:管理文件系統掛載

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

CGroups(Control Groups)

Docker經過CGroup來限定容器只能使用特定的資源。舉例來說,Docker能夠限制某個容器只能使用多少cpu及內存資源。

UnionFS(Union File System)

一種文件系統類型,能夠運行在其餘文件系統上,經過建立不一樣的層來使得容器文件系統更加輕量和快速。還有其餘幾種相似的文件系統,包括AUFS、btrfs、vfs和DeviceMapper。

3. Docker的安裝部署

如下命令是在Centos7上的命令,其餘操做系統會存在一些差別

yum install docker:經過yum下載docker相關的依賴
systemctl enable docker: 開機運行systemctl 
start docker: 啓動docker服務

執行完上述操做,docker服務已經在運行了,能夠經過執行 docker version 和 docker info 命令查看docker的版本以及相關的信息。

4. Docker的使用

4.1 Dockerfile文件
咱們以前有提到Docker能夠將應用程序打包成一個鏡像,那麼如何生成鏡像文件呢?這就須要用到Dockerfile文件。它是一個文本文件,用來配置鏡像,Docker根據該文件生成二進制的鏡像文件。如下是一個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
# 容器啓動後執行 nginx -g daemon off 命令
CMD ["nginx", "-g", "daemon off;"]

4.2 建立鏡像文件
有了Dockerfile文件之後,就能夠用docker build命令建立鏡像文件了。

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

關於Docker其餘的一些操做命令,你們能夠自行查閱,網上介紹的文章也比較多,參考文章:Docker 入門教程(https://docs.docker.com/get-s...

相關文章
相關標籤/搜索