天天看點

EdgeX Foundry第一彈 容器運作時docker與服務編排

本文為Edgex系列第一篇文章,主要探讨容器化相關内容。

一、了解Edgex為什麼先學習容器?

1.應用服務排程。

Edgex

服務衆多,包含

應用服務

支援服務

裝置服務

安全服務

中間件

等,使用容器部署更為便利。

2.官方對于雲原生的支援,參考倉庫:

docker-compose :github.com/edgexfoundr…

kubernetes :github.com/edgexfoundr…

3.邊緣計算社群生态的支援,如

kubeedge

k3s

等輕量級

k8s

服務。另外

kubeedge

也提供一定的裝置接入與雲邊協同能力。

3.為應用服務提供

CI/CD

支援,如內建

jenkins

等。

二、容器與虛拟機差異

因為資源關系,目前内部叢集搭建也有使用基于KVM的虛拟化,那麼虛拟機和容器有何差別,容器為什麼比虛拟機更受歡迎?

EdgeX Foundry第一彈 容器運作時docker與服務編排

如圖所示,虛拟機基于hypervisor軟體在作業系統上對硬體資源做了虛拟化,并在虛拟化裝置上重新建構了一個作業系統Guest OS,對主控端的網絡請求、磁盤I/O等造成較大的負荷,具體對比參數請參考 Docker容器與KVM虛拟機的性能對比與研究;

虛拟化技術則基于Namespace等技術,建立一個隔離視圖,使得程序之間資源互相隔離,但本質還是直接運作在主控端的程序,因而資源開銷更少,性能更高。不過容器受歡迎的原因遠不止于此,如Docker鏡像等功能也至關重要,即所謂的

Build once, Run anywhere

三、Docker技術原理

Docker 是利用 Linux 的

Namespace

Cgroups

和聯合檔案系統三大機制來保證實作的, 是以它的原理是使用

Namespace

做主機名、網絡、PID 等資源的隔離,使用

Cgroups

對程序或者程序組做資源(例如:CPU、記憶體等)的限制,聯合檔案系統用于鏡像建構和容器運作環境。

Namespace

是 Linux 核心的一項功能,該功能對核心資源進行隔離,使得容器中的程序都可以在單獨的命名空間中運作,并且隻可以通路目前容器命名空間的資源。

Namespace

可以隔離程序 ID、主機名、使用者 ID、檔案名、網絡通路和程序間通信等相關資源。

Docker 主要用到以下五種命名空間。

pid namespace

:用于隔離程序 ID。

net namespace

:隔離網絡接口,在虛拟的 net namespace 内使用者可以擁有自己獨立的 IP、路由、端口等。

mnt namespace

:檔案系統挂載點隔離。

ipc namespace

:信号量,消息隊列和共享記憶體的隔離。

uts namespace

:主機名和域名的隔離。

Cgroups

是一種 Linux 核心功能,可以限制和隔離程序的資源使用情況(CPU、記憶體、磁盤 I/O、網絡等)。在容器的實作中,Cgroups 通常用來限制容器的 CPU 和記憶體等資源的使用。

聯合檔案系統 聯合檔案系統,又叫 UnionFS,是一種通過建立檔案層程序操作的檔案系統,是以,聯合檔案系統非常輕快。Docker 使用聯合檔案系統為容器提供建構層,使得容器可以實作寫時複制以及鏡像的分層建構和存儲。常用的聯合檔案系統有 AUFS、Overlay 和 Devicemapper 等。

四、Docker 核心概念

鏡像:一個隻讀的檔案和檔案夾組合,包含了容器運作時需要得所有基礎檔案和配置資訊,是容器啟動的基礎。

容器:鏡像的運作實體。鏡像是靜态的隻讀檔案,而容器帶有運作時需要的可寫檔案層,并且容器中的程序屬于運作狀态。即容器運作着真正的應用程序。容器有初建、運作、停止、暫停和删除五種狀态。

倉庫:Docker 的鏡像倉庫類似于代碼倉庫,用來存儲和分發 Docker 鏡像。鏡像倉庫分為公共鏡像倉庫和私有鏡像倉庫。常用公共鏡像倉庫:hub.docker.com/,私有倉庫可以使用阿裡雲(測試),或者自建habor倉庫等。

鏡像、容器、倉庫,三者之間的聯系:

EdgeX Foundry第一彈 容器運作時docker與服務編排

docker架構:

EdgeX Foundry第一彈 容器運作時docker與服務編排

Docker 整體架構采用 C/S(用戶端 / 伺服器)模式,用戶端負責發送操作指令,服務端負責接收和處理指令。

五、docker安裝

step 1:解除安裝已有資源

yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine

step 2:添加 Docker 安裝源

yum-config-manager \ --add-repo \ <https://download.docker.com/linux/centos/docker-ce.repo>

step 3: 安裝最新版本Docker

yum install docker-ce docker-ce-cli containerd.io

如果想要安裝指定版本的Docker,可以使用以下指令:

yum list docker-ce --showduplicates | sort -r

yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

step 4: 啟動docker

systemctl start docker

啟動完成後,運作hello world容器,檢查是否安裝正确,指令如下:

docker run hello-world

Docker 首先會檢查本地是否有

hello-world

這個鏡像,如果發現本地沒有這個鏡像,Docker 就會去

Docker Hub

官方倉庫下載下傳此鏡像,然後運作它。最後輸出 "

Hello from Docker!

" 并退出。

如需解除安裝docker,執行

yum -y remove docker-engine

,,如需删除鏡像、容器、卷以及自定義檔案,可執行以下指令:

rm -rf /var/lib/docker

六、Docker基礎操作

EdgeX Foundry第一彈 容器運作時docker與服務編排

拉取鏡像,使用docker pull指令拉取遠端倉庫的鏡像到本地 ;

指令格式:

docker pull [Registry]/[Repository]/[Image]:[Tag]

重命名鏡像,使用docker tag指令“重命名”鏡像 ;

指令格式:

docker tag [SOURCE_IMAGE](#) [TARGET_IMAGE](#)

檢視鏡像,使用

docker image ls

docker images

指令檢視本地已經存在的鏡像 ;

删除鏡像,使用

docker rmi

指令删除鏡像 ;

建構鏡像,建構鏡像有兩種方式。第一種方式是使用

docker build

指令基于

Dockerfile

建構鏡像,也是我比較推薦的鏡像建構方式;第二種方式是使用

docker commit

指令基于已經運作的容器送出為鏡像。

Dockerfile

常用指令:

EdgeX Foundry第一彈 容器運作時docker與服務編排

eg:

FROM centos:7
​
COPY nginx.repo /etc/yum.repos.d/nginx.repo
​
RUN yum install -y nginx
​
EXPOSE 80
​
ENV HOST=iotnginx
​
CMD ["nginx","-g","daemon off;"]
複制代碼
           

第一行表示基于 centos:7 這個鏡像來建構自定義鏡像。這裡需要注意,每個 Dockerfile 的第一行除了注釋都必須以 FROM 開頭。

第二行表示拷貝本地檔案

nginx.repo

檔案到容器内的

/etc/yum.repos.d

目錄下。這裡拷貝

nginx.repo

檔案是為了添加 nginx 的安裝源。

第三行表示在容器内運作

yum install -y nginx

指令,安裝 nginx 服務到容器内,執行完第三行指令,容器内的 nginx 已經安裝完成。

第四行聲明容器内業務(nginx)使用 80 端口對外提供服務。

第五行定義容器啟動時的環境變量

HOST=iotnginx

,容器啟動後可以擷取到環境變量 HOST 的值為 iotnginx。

第六行定義容器的啟動指令,指令格式為 json 數組。這裡設定了容器的啟動指令為 nginx ,并且添加了 nginx 的啟動參數 -g 'daemon off;' ,使得 nginx 以前台的方式啟動。

七、單機服務編排

單機服務編排工具Docker-compose,這裡我們介紹他的安裝與基礎指令。

下載下傳方式一:github

curl -L "https://github.com/docker/compose/releases/download/${release_tag}/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
複制代碼
           

替換release_tag為對應版本。

下載下傳方式二:百度雲

連結:https://pan.baidu.com/s/1E1LW9MVrJ-S6nfqJ1HZ3Ww 
提取碼:kuqw
複制代碼
           

移動到bin目錄下,友善調用:

mv docker-compose-Linux-x86_64-1.22.0 /usr/local/bin/docker-compose
複制代碼
           

添加執行權限:

chmod +x /usr/local/bin/docker-compose
複制代碼
           

注意:

docker版本是否相容。

常用指令:

  • 啟動:

    docker-compose up -d

    注意這裡需要在yml配置檔案路徑執行,其他路徑執行需要-f指定配置檔案位址。
  • 檢視日志:

    docker-compose logs -f ${compose-contatainer-name}

  • 停止:

    docker-compose stop

  • 停止并删除容器:

    docker-compose down

  • 其他指令幫助:

    docker-compose --help

八、叢集服務編排

叢集服務編排,這裡介紹四種方式。

docker swarm

方式基于Docker API實作,且使用較為簡單;

kubernetes

方案推薦使用

kubespray

一鍵部署生産叢集,但注意新版本k8s是不再支援docker;

kubeedge/k3s

可以作為邊緣端服務編排工作,另外kubeedge提供雲邊協同能力,後續也會介紹相關的

baetyl

等内容;

因為本系列使用

docker-compose

作為編排工具,暫時不展開。如有需要,請參考:

1. docker swarm

2. kubernetes+containerd/cri-o/docker

3.kubeedge

4.k3s

5.baetyl

九、參考資料

docs.docker.com/get-started…

docs.docker.com/compose/ref…

docs.docker.com/engine/swar…

kubernetes.io/zh/docs/set…

www.bilibili.com/video/av887…

kubeedge.io/zh/

github.com/zxxf18/edge…

繼續閱讀