自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Docker 是什么? 和 K8s 之間是什么關(guān)系?

云計算 云原生
我們經(jīng)常能聽到程序員說"這個程序在我環(huán)境里明明是好的啊,怎么到你這就不行了呢"?注意這里的關(guān)鍵詞,程序和環(huán)境。程序是跑在操作系統(tǒng)上的,而操作系統(tǒng)上又裝了各種不同版本的依賴庫和配置,這些被程序所依賴的信息,我們統(tǒng)稱為"環(huán)境"。

作為一個程序員,如果你想安裝一個 vim 編輯下文本,在不同環(huán)境里你得執(zhí)行不同的命令。在 ubuntu,你需要執(zhí)行 apt-get install vim,在 centos 里,你需要執(zhí)行 yum install vim.

裝個小軟件尚且如此,要是你想將自己寫的代碼部署到各個不同操作系統(tǒng)的服務(wù)器上,那依賴的軟件和配置就更多了,需要針對每個環(huán)境單獨寫一套部署腳本。難受,太難受了。

那么問題就來了,有沒有更好的解決方案?當然有,沒有什么是加一層中間層不能解決的,如果有,那就再加一層,這次我們要加的中間層是 Docker。

Docker是代碼和操作系統(tǒng)之間的中間層

哦不,準確來說是 Docker容器。

Docker 是什么?

我們經(jīng)常能聽到程序員說"這個程序在我環(huán)境里明明是好的啊,怎么到你這就不行了呢"?注意這里的關(guān)鍵詞,程序和環(huán)境。程序是跑在操作系統(tǒng)上的,而操作系統(tǒng)上又裝了各種不同版本的依賴庫和配置,這些被程序所依賴的信息,我們統(tǒng)稱為"環(huán)境"。

程序和環(huán)境

程序依賴環(huán)境,環(huán)境不同,程序就可能跑不起來。如果我們能將環(huán)境和程序一起打包,給到對方運行,那問題不就解決了嗎。Docker 就是這樣一款可以將程序和環(huán)境打包并運行的工具軟件。我們來看下它是怎么做的?

基礎(chǔ)鏡像是什么

既然上面提到環(huán)境不同,會導(dǎo)致程序運行結(jié)果不同,那么我們首先要做的最重要的事情,就是統(tǒng)一環(huán)境。而環(huán)境中,最最重要的就是操作系統(tǒng)。比如 centos 還是 ubuntu,我們得選一個,讓所有程序都跑在同一個操作系統(tǒng)上。并且我們知道操作系統(tǒng)分為用戶空間和內(nèi)核空間,應(yīng)用程序運行在用戶空間。因此,我們可以閹割操作系統(tǒng),只需要利用操作系統(tǒng)的用戶空間部分,就能構(gòu)建出應(yīng)用所需的環(huán)境。其次就是統(tǒng)一程序語言依賴,比如要跑 python 應(yīng)用,你得裝個 python 解釋器,要跑個 java 應(yīng)用,得裝個 JVM,要跑 go 應(yīng)用,那就。。什么都不需要裝。選中一個基礎(chǔ)操作系統(tǒng)和語言后,我們將它們對應(yīng)的文件系統(tǒng),依賴庫,配置等放一起打包成一個類似壓縮包的文件,這就是所謂的基礎(chǔ)鏡像(Base Image)。

基礎(chǔ)鏡像是什么

Dockerfile 是什么

有了基礎(chǔ)鏡像之后還不夠,我們經(jīng)常還需要安裝一些依賴,比如yum install gcc,甚至還要創(chuàng)建一些文件夾。最后才是運行我們的目標應(yīng)用程序。我們知道 linux 中,所有工作都可以通過命令行完成,所以我們可以將要做的事情以命令行的形式一行行列出來。就像一份 todo list。意思是要求在基礎(chǔ)鏡像的基礎(chǔ)上按著 todo list 挨個執(zhí)行命令。這份 todo list 長下面這樣。

# 指定基礎(chǔ)鏡像
FROM python:3.9

# 設(shè)置工作目錄
WORKDIR /app

# 復(fù)制依賴文件到容器中
COPY requirements.txt .

RUN yum install gcc
# 安裝依賴
RUN pip install --no-cache-dir -r requirements.txt

# 將當前目錄下的所有文件復(fù)制到容器的 /app 目錄下
COPY . /app

# 設(shè)置容器啟動時執(zhí)行的命令
CMD ["python", "app.py"]

具體含義是,基于一個裝了 python3.9 解釋器的操作系統(tǒng)(基礎(chǔ)鏡像),再執(zhí)行 pip install 等命令安裝其他依賴,從而構(gòu)建出一個適合程序運行的環(huán)境,最后用 python app.py 運行我們的目標應(yīng)用程序。像這樣一份列清楚了,從操作系統(tǒng)到應(yīng)用服務(wù)啟動,需要做哪些事情的清單文件(todo list),就是所謂的 Dockerfile。

容器鏡像是什么

注意 Dockerfile 只是描述了要做哪些事情,并沒有真正開始做。當我們用命令行執(zhí)行 docker build 的時候,Docker 軟件就會按著 Dockerfile 的說明,一行行構(gòu)建環(huán)境+應(yīng)用程序。最終將這個環(huán)境+程序,打包成一個類似"壓縮包"的東西,我們叫它容器鏡像(container image)。

容器鏡像

只要將容器鏡像傳到任意一臺服務(wù)器上,對這個"壓縮包"執(zhí)行"解壓縮",我們就能同時運行環(huán)境和程序。太完美了!但是現(xiàn)在還有個問題,怎么將容器鏡像傳到那么多服務(wù)器上呢?

Registry 是什么

服務(wù)器那么多,挨個將容器鏡像傳過去也不是不行,就是將壓力全給到發(fā)送方的網(wǎng)絡(luò)帶寬了。有沒有更好的解決方案?有??梢詤⒖?nbsp;github 代碼倉庫 的做法,我們通常會使用 git push 將代碼傳到 github,有需要的人自己通過 git pull 的方式將代碼從 github 拉到自己的機器上。

github倉庫

那 Docker 也一樣,弄一個鏡像倉庫,通過 docker push 將鏡像推到倉庫,有需要的時候再通過 docker pull 將鏡像拉到機器上。這個負責(zé)管理鏡像倉庫推拉能力的服務(wù),就叫 Docker Registry?;?Docker Registry 的能力,我們可以搭建各種官方或私人鏡像倉庫,比如官方的叫 DockerHub,非官方的有清華大學(xué)的 Tuna 等等,一般公司內(nèi)部也會有自己的鏡像倉庫。

Registry是什么

容器是什么

現(xiàn)在,我們解決了服務(wù)器間傳輸容器鏡像的問題。我們可以跑到目的服務(wù)器上,執(zhí)行 docker pull 拿到容器鏡像。然后執(zhí)行 docker run 命令,將這個類似"壓縮包"的容器鏡像給"解壓縮",獲得一個獨立的環(huán)境和應(yīng)用程序并運行起來。這樣一個獨立的環(huán)境和應(yīng)用程序,就是所謂的容器(container)。我們可以在一個操作系統(tǒng)上同時跑多個容器。且這些容器之間都是互相獨立,互相隔離的。

容器是什么

Docker 和虛擬機的關(guān)系?

眼熟不,這個容器是不是很像我們用 vmware 或 kvm 整出來的傳統(tǒng)虛擬機?但不同的是,傳統(tǒng)虛擬機自帶一個完整操作系統(tǒng),而容器本身不帶完整操作系統(tǒng),容器的基礎(chǔ)鏡像實際上只包含了操作系統(tǒng)的核心依賴庫和配置文件等必要組件。它利用一個叫 Namespace 的能力讓它看起來就像是一個獨立操作系統(tǒng)一樣。再利用一個叫 Cgroup 的能力限制它能使用的計算資源。

Docker和虛擬機的區(qū)別

所以說,容器本質(zhì)上只是個自帶獨立運行環(huán)境的特殊進程,底層用的其實是宿主機的操作系統(tǒng)內(nèi)核。

容器本質(zhì)是一個特殊進程

Docker 的架構(gòu)原理

現(xiàn)在,我們回到日常使用場景中,聊聊 Docker 的架構(gòu)原理。它是經(jīng)典的 Client/Server 架構(gòu)。Client 對應(yīng) Docker-cli, Server 對應(yīng) Docker daemon。我們在命令行里敲 Docker 命令,使用的就是 Docker-cli。

Docker是C/S軟件架構(gòu)

Docker-cli 會解析我們輸入的 cmd 命令,然后調(diào)用 Docker daemon 守護進程提供的 RESTful API,守護進程收到命令后,會根據(jù)指令創(chuàng)建和管理各個容器。再具體點,Docker Daemon 內(nèi)部分為 Docker Server、Engine 兩層。Docker Server 本質(zhì)上就是個 HTTP 服務(wù),負責(zé)對外提供操作容器和鏡像的 api 接口,接收到 API 請求后,會分發(fā)任務(wù)給 Engine 層,Engine 層負責(zé)創(chuàng)建 Job,由 Job 實際執(zhí)行各種工作。

Docker daemon內(nèi)部架構(gòu)

不同的 Docker 命令會執(zhí)行不同類型的 Job 任務(wù)。

docker build

如果你執(zhí)行的是 docker build 命令,Job 則會根據(jù) Dockerfile 指令,像包洋蔥皮似的一層層構(gòu)建容器鏡像文件。

docker build執(zhí)行邏輯

docker pull/push

如果你執(zhí)行的是 docker pull 或 push 之類的鏡像推拉操作,Job 則會跟外部的 Docker Registry 交互,將鏡像上傳或下載。

docker pull/push執(zhí)行邏輯

docker run

如果你執(zhí)行的是 docker run 命令,Job 就會基于鏡像文件調(diào)用 containerd 組件,驅(qū)使 runC 組件創(chuàng)建和運行容器。

docker run執(zhí)行邏輯

Docker 到底是什么?

現(xiàn)在我們再回過頭來看這句話,Docker 本質(zhì)上就是一個將程序和環(huán)境打包并運行的工具軟件。具體點來說就是,它通過 Dockerfile 描述環(huán)境和應(yīng)用程序的依賴關(guān)系, docker build 構(gòu)建鏡像, docker pull/push 跟 Docker Registry 交互實現(xiàn)存儲和分發(fā)鏡像,docker run 命令基于鏡像啟動容器,基于容器技術(shù)運行程序和它對應(yīng)的環(huán)境,從而解決環(huán)境依賴導(dǎo)致的各種問題。

Docker到底是什么

好了,到這里,我們就了解了 Docker 的架構(gòu)和基本運行原理了。接下來,我們再來聊聊跟 Docker 相關(guān)的幾個周邊。

Docker Compose 是什么?

我們現(xiàn)在知道了 Docker 容器 本身只是一個特殊進程,但如果我想要部署多個容器,且對這些容器的順序有一定要求呢?比如一個博客系統(tǒng),當然是先啟動數(shù)據(jù)庫,再啟動身份驗證服務(wù),最后才能啟動博客 web 服務(wù)。按理說挨個執(zhí)行 docker run 命令當然是沒問題的,但有沒有更優(yōu)雅的解決方案?有。我們可以通過一個 YAML 文件寫清楚要部署的容器有哪些,部署順序是怎么樣的,以及這些容器占用的 cpu 和內(nèi)存等信息。

version: "3.8"

services:
  A:
    image: "some-image-for-a"
    deploy:
      resources:
        limits:
          cpus: "0.50" # 限制 CPU 使用率為 50%
          memory: 256M # 限制內(nèi)存使用量為 256MB

  B:
    image: "some-image-for-b"
    depends_on:
      - A

  C:
    image: "some-image-for-c"
    depends_on:
      - B

然后,通過一行Docker-compose up命令,開始解析 YAML 文件,將容器們一鍵按順序部署,就完成一整套服務(wù)的部署。這其實就是 Docker Compose 干的事情。

Docker compose原理

Docker Swarm 是什么?

Docker 解決的是一個容器的部署。Docker Compose 解決的是多個容器組成的一整套服務(wù)的部署。那 Docker Swarm 就更高維度了,它解決的其實是這一整套服務(wù)在多臺服務(wù)器上的集群部署問題。比如在 A 服務(wù)器壞了,就將服務(wù)在 B 服務(wù)器上重新部署一套,實現(xiàn)遷移,還能根據(jù)需要對服務(wù)做擴縮容。

Docker swarm是什么

Docker 和 k8s 的關(guān)系是什么?

還記得之前的文章里提到的 k8s 嗎?它會在多臺 Node 服務(wù)器上調(diào)度 Pod,進行部署和擴縮容。

k8s的node內(nèi)部

每個 Pod 內(nèi)部可以含有多個 container,每個 container 本質(zhì)上就是一個服務(wù)進程。

pod內(nèi)部

是不是感覺k8s跟 Docker Swarm 做的事情很像?沒錯,其實 Docker Swarm 是 k8s 的競品,既然是競品,那它們做的事情其實區(qū)別就不大了?,F(xiàn)在回過頭來看 Docker 容器和 k8s 之間的關(guān)系,思路就清晰了。Docker 部署的容器,其實就是 k8s 調(diào)度的 Pod 里的 container,它們都叫容器,其實是一回事。只不過 k8s 除了支持 Docker 的容器外,還支持別人家的容器。Docker Compose 基于多個 container 創(chuàng)建的一整套服務(wù),其實就是 k8s 里的 pod。而 Docker Swarm 做的事情和 k8s 一樣,本質(zhì)上就是在調(diào)度 pod?;剡^頭來看下 k8s 的官方定義,叫容器編排引擎,將它理解為,以 API 編程的方式管理安排各個容器的引擎,是不是就特別精辟。

容器編排引擎的含義

現(xiàn)在,我們再回過頭來看下 Docker 的圖標,是一個個集裝箱,放在一艘船上,這一個個集裝箱指的就是互相隔離的容器,而 k8s 的圖標,則是一個輪船上的方向盤,意思是 k8s 控制著輪船的航向,其實指的就是調(diào)度容器。這波聯(lián)想就非常形象了。

Docker和k8s

現(xiàn)在大家通了嗎?

總結(jié)

  • ? Docker 本質(zhì)上就是一個將程序和環(huán)境打包并運行的工具軟件,而 Docker 容器本質(zhì)上只是個自帶獨立運行環(huán)境的特殊進程,底層用的其實是宿主機的操作系統(tǒng)內(nèi)核。
  • ? Docker 軟件 通過 Dockerfile 描述環(huán)境和應(yīng)用程序的依賴關(guān)系, docker build 構(gòu)建鏡像, docker pull/push 跟 Docker Registry 交互實現(xiàn)存儲和分發(fā)鏡像,docker run 命令基于鏡像啟動容器,基于容器技術(shù)運行程序和它對應(yīng)的環(huán)境,從而解決環(huán)境依賴導(dǎo)致的各種問題。
  • ? Docker 解決的是一個容器的部署問題,Docker Compose 解決的是多個容器組成的一套服務(wù)的部署問題,Docker Swarm 解決的是多個容器組成的一套服務(wù)在多臺服務(wù)器上的部署問題,k8s 則是 Docker Swarm 的競品,在更高維度上兼容了 Docker 容器,實現(xiàn)了容器編排調(diào)度。

最后

這篇文章的主題按理說寫個萬把字不成問題,但我壓縮了很多內(nèi)容,主打就是用最少的文字將技術(shù)原理通俗的講清楚。

責(zé)任編輯:姜華 來源: 小白debug
相關(guān)推薦

2015-08-03 10:20:39

大數(shù)據(jù)Hadoop

2024-11-27 16:37:57

2012-09-03 09:58:09

2018-03-18 07:44:47

云計算云存儲IT

2025-02-27 08:09:52

2020-08-21 07:18:21

KubernetesDocker

2016-07-08 14:41:28

云計算

2020-11-10 07:05:41

DockerK8S云計算

2017-10-23 14:40:01

2015-09-24 10:40:31

NFVSDN

2020-04-08 10:02:40

SDNOpenFlowOpenDayligh

2019-03-12 11:12:50

大數(shù)據(jù)HadoopSpark

2022-09-13 09:09:37

容器容器云容器化

2023-08-01 15:22:01

物聯(lián)網(wǎng)云計算

2022-04-22 13:32:01

K8s容器引擎架構(gòu)

2021-09-02 00:23:16

區(qū)塊鏈互聯(lián)網(wǎng)技術(shù)

2022-03-28 18:27:07

容器容器云PaaS

2020-02-27 08:52:51

NFVSDN網(wǎng)絡(luò)

2018-05-29 16:20:55

區(qū)塊鏈比特幣

2024-03-04 08:03:50

k8sClusterNode
點贊
收藏

51CTO技術(shù)棧公眾號