一. docker的架構

1.1 docker的架構

先來看docker官網給出的docker架構圖:

看官網,docker的架構描述: https://docs.docker.com/get-started/overview/

Docker使用客戶端-伺服器架構。Docker 客戶端與Docker 守護程序進行對話,該守護程序完成了構建,執行和分發Docker容器的繁重工作。Docker客戶端和守護程式可以 在同一系統上執行,也可以將Docker客戶端連線到遠端Docker守護程式。Docker客戶端和守護程式在UNIX套接字或網路介面上使用REST API進行通訊。

從上圖我們也可以看出, 整體分為三個部分: docker客戶端, docker後臺(相當於一個小型的linux), docker倉庫. 接下來一個一個看.

1. Docker客戶端--The Docker client

Docker客戶端是許多Docker使用者與Docker互動的主要方式。當您使用諸如之類的命令時docker run,客戶端會將這些命令傳送到dockerd,以執行它們。該docker命令使用Docker API。Docker客戶端可以與多個守護程式通訊。

2. Docker守護程式 -- The Docker daemon

Docker守護程式(dockerd)偵聽Docker API請求並管理Docker物件,例如影象,容器,網路和卷。守護程式還可以與其他守護程式通訊以管理Docker服務。

3. Docker倉庫 -- Docker registries

Docker registries儲存Docker映像。Docker Hub是任何人都可以使用的公共登錄檔,並且預設情況下,Docker已配置為在Docker Hub上查詢映像。您可以執行自己的私人登錄檔。如果使用Docker資料中心(DDC),則其中包括Docker可信registries(DTR)。

使用docker pulldocker run命令時,所需的影象將從配置的登錄檔中提取。使用該docker push命令時,會將映像推送到配置的登錄檔。

1.2 docker的基本元素 -- Docker物件

通過上面的架構圖, 我們可以看到docker主要包含: 映象, 容器, 倉庫. 下面就來具體看看這幾個概念

1. images

一個影象是用於建立一個碼頭工人容器指令的只讀模板。通常,一個映像基於另一個映像,並進行一些其他自定義。例如,您可以基於該ubuntu 映像構建映像,但是安裝Apache Web伺服器和您的應用程式,以及執行該應用程式所需的配置詳細資訊。

您可以建立自己的影象,也可以僅使用其他人建立並在登錄檔中釋出的影象。要構建自己的映像,您可以 使用簡單的語法建立一個Dockerfile,以定義建立映像並執行它所需的步驟。Dockerfile中的每個指令都會在映像中建立一個層。當您更改Dockerfile並重建映像時,僅重建那些已更改的層。與其他虛擬化技術相比,這是使映像如此輕巧,小型和快速的部分原因。

2. container

容器是影象的可執行例項。您可以使用Docker API或CLI建立,啟動,停止,移動或刪除容器。您可以將容器連線到一個或多個網路,將儲存連線到它,甚至根據其當前狀態建立新映像。

預設情況下,容器與其他容器及其主機之間的隔離程度相對較高。您可以控制容器的網路,儲存或其他基礎子系統與其他容器或與主機的隔離程度。

容器由其映像以及在建立或啟動時為其提供的任何配置選項定義。刪除容器後,未儲存在永續性儲存中的狀態更改將消失。

3. 倉庫

倉庫是存放映象的地方, 分為共有倉庫和私有倉庫

共有倉庫: dockerHub(國外) , 阿里雲(國內)

私有倉庫: 自定義的倉庫

二.docker的安裝及應用

1. docker支援的centos版本

2. docker安裝的前提條件

  • 目前centos僅發行版本的核心支援docker
  • docker執行在centos7上, 要求系統為64位,系統核心版本為3.10以上
  • docker執行在centos6.5或更高版本上,要求系統64位,系統核心版本為2.6.32-431或者更高版本

uname命令列印系統相關資訊

uname -r

我的伺服器版本是5.10.23, 64位

查詢系統版本

cat /etc/redhat-release    或者  cat /etc/os-release

3. centos6.5及以上的安裝docker

安裝docker, 我們主要藉助於幫助文件, 文件地址: https://docs.docker.com/engine/install/, 對照文件安裝

第一步: 解除安裝舊版本的docker

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

如上圖所示, 表示之前沒有安裝過docker, 如果安裝過, 會提示,解除安裝完畢.

第二步: 安裝docker

官網給出, 安裝docker有三種方法:

  • 第一種: 是從倉庫安裝,
  • 第二種是通過RPM包安裝,
  • 第三種是通過指令碼安裝.

我們這裡採用第一種從倉庫安裝

1. 安裝docker前需要安裝的依賴包

yum install -y yum-utils

2. 設定映象倉庫

在一臺新的主機上首次安裝docker engine之前, 需要先設定docker映象倉庫, 後面可以從映象倉庫安裝和更新docker.

映象倉庫官網給的是國外的, 我們儘量不用, 速度太慢

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

我們百度搜索, 找到阿里雲docker映象參考的地址, 國內使用這個

sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3. 安裝最新版docker引擎

安裝引擎之前, 先來安裝yml軟體包索引

yum makecache fast

這個命令什麼意思呢? 科普一下

我們在更新yum源或者出現配置yum源之後,通常都會使用yum makecache 生成快取

yum makecache fast
這個命令是將軟體包資訊提前在本地快取一份,用來提高搜尋安裝軟體的速度 yum clean all
yum 會把下載的軟體包和header儲存在cache中而不自動刪除。如果覺得佔用磁碟空間,可以使用yum clean指令清除快取。

然後安裝docker

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

這裡安裝了docker, docker-cli 和容器. docker-ce是社群版的意思, docker-ee是企業版. 通常我們使用的都是社群版的.

注意: 有很多朋友使用的linux伺服器, 這裡在執行這個命令的時候, 會報錯:

這裡報錯的原因是, 阿里雲作業系統是Alibaba Cloud Linux, 而不是存粹的centOS, 這時我們可以參考阿里雲提供的docker安裝文件: https://help.aliyun.com/document_detail/264695.html

4. 啟動docker

systemctl start docker

5. 檢查是否安裝成功

docker version

6. 拉取docker映象拉取helloworld

7. 配置阿里雲映象加速器

第一步:訪問國內阿里雲的網址

dev.aliyun.com

第二步:登入

第三步: 獲取映象地址

在產品與服務-->搜尋"容器映象服務" --> 映象工具 --> 映象加速器 --> 複製映象加速器地址

https://cr.console.aliyun.com/cn-hangzhou/instances/repositories

配置方法:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://6w5zrjdk.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

三. docker的底層原理

1. docker是怎麼工作的?

docker是一個client-server結構的系統,Docker的守護程序執行在主機上, 然後通過Socket連線從客戶端訪問, 守護程序從客戶端接受命令並管理執行在主機上的容器, 容器,是一個執行時環境, 就是我們前面說到的集裝箱

客戶端通過socket連線到後臺守護程序, 然後通過命令告訴守護程序, 呼叫容器. 可見容器和客戶端是互相隔離的. 我們可以把容器理解為一個小型的linux, 他有自己的埠號, 比如mysql容器埠號是3306, 容器中的埠, 通過客戶端是不能直接訪問的. 我們需要做埠對映.

2. 虛擬機器和容器的區別

docker將虛擬機器的Hypervisor和作業系統應將cpu, 記憶體等去掉了. 替換成了Docker Engine. 而這兩塊恰恰就是虛擬機器笨重的地方. docker共享了宿主機的作業系統, 核心, cpu. 省略了自己構建的過程.

docker容器 虛擬機器VM
作業系統 與宿主機共享OS 宿主機OS上執行虛擬機器OS
儲存大小 映象小, 便於儲存和傳輸 映象龐大(vmdk, vdi等)
執行效能 幾乎無額外效能損失 作業系統額外的CPU,記憶體消耗
移植性 輕便,靈活,適用於linux系統 笨重, 與虛擬機器技術耦合度高
硬體親和性 面向軟體開發者 面向硬體運維者
部署速度 快速, 秒級 較慢, 10s以上

以上是虛擬機器和容器的區別