成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Docker 是什么? 和 K8s 之間是什么關系?

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

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

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

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

Docker是代碼和操作系統之間的中間層

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

Docker 是什么?

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

程序和環境

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

基礎鏡像是什么

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

基礎鏡像是什么

Dockerfile 是什么

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

# 指定基礎鏡像
FROM python:3.9

# 設置工作目錄
WORKDIR /app

# 復制依賴文件到容器中
COPY requirements.txt .

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

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

# 設置容器啟動時執行的命令
CMD ["python", "app.py"]

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

容器鏡像是什么

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

容器鏡像

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

Registry 是什么

服務器那么多,挨個將容器鏡像傳過去也不是不行,就是將壓力全給到發送方的網絡帶寬了。有沒有更好的解決方案?有。可以參考 github 代碼倉庫 的做法,我們通常會使用 git push 將代碼傳到 github,有需要的人自己通過 git pull 的方式將代碼從 github 拉到自己的機器上。

github倉庫

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

Registry是什么

容器是什么

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

容器是什么

Docker 和虛擬機的關系?

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

Docker和虛擬機的區別

所以說,容器本質上只是個自帶獨立運行環境的特殊進程,底層用的其實是宿主機的操作系統內核。

容器本質是一個特殊進程

Docker 的架構原理

現在,我們回到日常使用場景中,聊聊 Docker 的架構原理。它是經典的 Client/Server 架構。Client 對應 Docker-cli, Server 對應 Docker daemon。我們在命令行里敲 Docker 命令,使用的就是 Docker-cli。

Docker是C/S軟件架構

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

Docker daemon內部架構

不同的 Docker 命令會執行不同類型的 Job 任務。

docker build

如果你執行的是 docker build 命令,Job 則會根據 Dockerfile 指令,像包洋蔥皮似的一層層構建容器鏡像文件。

docker build執行邏輯

docker pull/push

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

docker pull/push執行邏輯

docker run

如果你執行的是 docker run 命令,Job 就會基于鏡像文件調用 containerd 組件,驅使 runC 組件創建和運行容器。

docker run執行邏輯

Docker 到底是什么?

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

Docker到底是什么

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

Docker Compose 是什么?

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

version: "3.8"

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

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

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

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

Docker compose原理

Docker Swarm 是什么?

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

Docker swarm是什么

Docker 和 k8s 的關系是什么?

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

k8s的node內部

每個 Pod 內部可以含有多個 container,每個 container 本質上就是一個服務進程。

pod內部

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

容器編排引擎的含義

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

Docker和k8s

現在大家通了嗎?

總結

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

最后

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

責任編輯:姜華 來源: 小白debug
相關推薦

2015-08-03 10:20:39

大數據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

云計算

2019-03-12 11:12:50

大數據HadoopSpark

2015-09-24 10:40:31

NFVSDN

2020-04-08 10:02:40

SDNOpenFlowOpenDayligh

2017-10-23 14:40:01

2020-11-10 07:05:41

DockerK8S云計算

2022-09-13 09:09:37

容器容器云容器化

2023-08-01 15:22:01

物聯網云計算

2021-09-02 00:23:16

區塊鏈互聯網技術

2022-04-22 13:32:01

K8s容器引擎架構

2020-02-27 08:52:51

NFVSDN網絡

2022-03-28 18:27:07

容器容器云PaaS

2018-05-29 16:20:55

區塊鏈比特幣

2024-03-04 08:03:50

k8sClusterNode
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国产精品99久久久久久丝袜 | 免费超碰 | 久久小视频 | 亚洲一区久久 | 一级毛片观看 | 亚洲一区二区免费视频 | 成人亚洲| 午夜av免费 | 日日久 | 日韩精品专区在线影院重磅 | 欧美一区二区三区视频在线播放 | 久久久久久国产精品mv | 中文字幕国产精品视频 | 久久精品亚洲精品国产欧美 | 欧美激情久久久 | 免费在线观看黄网站 | 欧产日产国产精品国产 | 四虎成人在线播放 | 超碰在线人人 | 欧日韩在线观看 | 久久久91精品国产一区二区精品 | 欧美日韩国产一区二区三区 | 狠狠插天天干 | www.国产| 欧美国产精品久久久 | 久久久av | 日本三级全黄三级三级三级口周 | 最新国产在线 | 亚洲精品不卡 | 精品91久久| 久精品久久 | 一级片在线观看 | 国产99久久精品一区二区永久免费 | 国产日韩欧美二区 | 亚洲成av人片在线观看无码 | 日韩精品一区二区三区中文字幕 | 亚洲国产专区 | 一级毛片免费完整视频 | 久久99精品久久久 | 日韩在线视频一区二区三区 | 精品久久av |