本文為Edgex系列第一篇文章,主要探讨容器化相關内容。
一、了解Edgex為什麼先學習容器?
1.應用服務排程。
Edgex
服務衆多,包含
應用服務
、
支援服務
、
裝置服務
、
安全服務
、
中間件
等,使用容器部署更為便利。
2.官方對于雲原生的支援,參考倉庫:
docker-compose :github.com/edgexfoundr…
kubernetes :github.com/edgexfoundr…
3.邊緣計算社群生态的支援,如
kubeedge
、
k3s
等輕量級
k8s
服務。另外
kubeedge
也提供一定的裝置接入與雲邊協同能力。
3.為應用服務提供
CI/CD
支援,如內建
jenkins
等。
二、容器與虛拟機差異
因為資源關系,目前内部叢集搭建也有使用基于KVM的虛拟化,那麼虛拟機和容器有何差別,容器為什麼比虛拟機更受歡迎?
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbwxCdh1mcvZ2LcV2Zh1Wa9M3clN2byBXLzN3btg3PwJWZ35CNzMjYzE2N5QzM5QGZ3YjNzAzNmNWYjF2Y4EmN2Y2N18CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.webp)
如圖所示,虛拟機基于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倉庫等。
鏡像、容器、倉庫,三者之間的聯系:
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基礎操作
拉取鏡像,使用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
常用指令:
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版本是否相容。
常用指令:
- 啟動:
注意這裡需要在yml配置檔案路徑執行,其他路徑執行需要-f指定配置檔案位址。docker-compose up -d
- 檢視日志:
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…