1. 程式人生 > 其它 >03 Docker的架構介紹及部署實戰

03 Docker的架構介紹及部署實戰

目錄

一.Docker架構分析

	如下圖所示,Docker採用的是 Client/Server 架構。客戶端向伺服器傳送請求,伺服器負責構建、執行和分發容器。

  客戶端和伺服器可以執行在同一個 Host 上,客戶端也可以通過socket或 REST API與遠端的伺服器通訊。
  
  推薦閱讀:
		https://docs.docker.com/get-started/overview/

1.Client

  Docker客戶端,最常用的Docker客戶端是docker命令。通過docker我們可以方便地在Host上構建和執行容器。
      
  docker支援很多操作(docker命令列工具),使用者也可以通過REST API與伺服器通訊。
      
  Client和Docker daemon通訊可使用https/http協議進行通訊,為了安全起見,預設使用的就是https協議。

2.Docker-Host

	Docker daemon:  
    Docker daemon是伺服器元件,即Docker守護程序伺服器,以Linux後臺服務的方式執行。
    Docker daemon執行在Docker host上,負責建立、執行、監控容器,構建、儲存映象。預設配置下,Docker daemon只能響應來自本地Host的客戶端請求。如果要允許遠端客戶端請求,需要在配置檔案中開啟TCP監聽(支援IPV4和IPV6)。
        
  Containers:   
    Docker容器,用於載入Docker映象。換句話說,Docker容器就是Docker映象的執行例項。我們知道映象(Image)是隻讀的,在啟動一個Container時,其實就是基於Image來新建一個專用的可寫倉供使用者使用。
        
  Image:   
    可將Docker映象看成只讀模板(它類似於虛擬機器使用的ISO映象檔案),通過它可以建立Docker容器。例如某個映象可能包含一個Ubuntu作業系統、一個Apache HTTP Server以及使用者開發的Web應用。
    映象有多種生成方法:
      (1)可以從無到有開始建立映象;
      (2)也可以下載並使用別人建立好的現成的映象
      (3)還可以在現有映象上建立新的映象
      (4)我們可以將映象的內容和建立步驟描述在一個文字檔案中,這個檔案被稱作Dockerfile,通過執行docker build <docker-file>命令可以構建出Docker映象。
    公開的映象倉庫有很多種,如下所示: 
      Docker官方映象地址:
        https://hub.docker.com/。
      阿里的docker映象地址:
        https://mirrors.aliyun.com/docker-ce/linux/
      清華大學docker映象地址:
       https://mirrors.tuna.tsinghua.edu.cn/docker-ce/

  溫馨提示:
    生產環境中,我們通常在公司內部部署有私有映象倉庫。如使用Harbor,Docker Registry等等。在後續的文章我們會逐一對其進行講解。

3.Registry

	我們去構建映象時,映象做好之後應該有一個統一存放位置,我們稱之為Docker倉庫,Registry是存放Docker映象的倉庫(官方預設倉庫在"https://hub.docker.com"),Registry分私有和公有兩種。

	Images和Registry之間預設使用的時https協議,當然如果你非要指定為http協議也是可以的。

	啟動容器時,docker daemon會試圖從本地獲取相關的映象;本地映象不存在時,其將從Registry中下載該映象並儲存到本地。  

	Registry用於儲存docker映象,包括映象的層次結構和元資料。使用者可自建Registry,也可使用官方的Docker Hub。  

	Docker Registry中的映象通常由開發人員製作,而後推送至"公共"或"私有"Registry上儲存,供其它人員使用,例如"部署"到生產環境。

	Docker Registry可分為以下幾類:    
    Sponsor Registry:
      第三方的registry,供客戶端和Docker社群使用。    
    Mirror Registry:
      第三方的registry,只讓客戶使用。    
    Vendor Registry:
      由釋出Docker映象的供應商提供的registry。    
    Private Registry:
      通過設有防火牆和額外的安全層的私有實體提供的registry。  

	Registry包括Repository和Index,詳細說明如下:    
		Repository:      
			由某特定的docker映象的所有迭代版本組成的映象倉庫;
			一個Registry中可以存在多個Repository:        
			Repository可分為"頂層倉庫"和"使用者倉庫";        
			使用者倉庫名稱格式為"使用者名稱/倉庫名"。      
			每個倉庫可以包含多個Tag(標籤),每個標籤對應一個映象;    
		Index:      
			維護使用者賬戶,映象的校驗以及公共名稱空間的資訊;      
			相當於為Registry提供了一個完成使用者認證等功能的檢索介面。

4.映象名稱判斷

	官方倉庫:
		官方映象:
        	nginx:1.20.1
        使用者上傳映象:
        	jasonyin2020/oldboyedu_birds:v1
        	
	第三方倉庫:
		使用者上傳映象:
			tuv7rqqq.mirror.aliyuncs.com/library/nginx:latest

5.docker、containerd的關係

	為了防止docker一家獨大,docker當年的實現被拆分出了幾個標準化的模組,標準化的目的是模組是可被其他實現替換的,不由任何一個廠商控制。

	docker由docker-client,dockerd,containerd,docker-shim,runc組成,所以containerd是docker的基礎元件之一,下面是從containerd引過來的一張圖。

	
	推薦閱讀:
		https://containerd.io/
		https://cloud.tencent.com/document/product/457/35747

二.部署docker環境

1.關閉並禁用防火牆

[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# 
[[email protected] ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[[email protected] ~]# 

2.停用並禁用selinux

[[email protected] ~]# getenforce 
Enforcing
[[email protected] ~]# 
[[email protected] ~]# setenforce 0
[[email protected] ~]# 
[[email protected] ~]# grep ^SELINUX= /etc/selinux/config
SELINUX=enforcing
[[email protected] ~]# 
[[email protected] ~]# sed -ri s'#(SELINUX=)enforcing#\1disabled#' /etc/selinux/config
[[email protected] ~]# 
[[email protected] ~]# grep ^SELINUX= /etc/selinux/config
SELINUX=disabled
[[email protected] ~]# 

3.解除安裝docker較舊的依賴項(如果您的作業系統是剛剛安裝完成的狀態,或者當前伺服器沒有安裝過docker環境,則可以跳過該步驟)

yum -y remove docker docker-client docker-client-latest docker-common docker-lastest docker-lastest-logrotate docker-logrotate  docker-engine


溫馨提示:
  (1)現在將Docker Engine軟體包稱為docker-ce,較舊的Docker Engine版本稱為docker或docker-engine。如果已安裝這些程式,請解除安裝它們以及相關的依賴項,因為新老docker版本並不相互相容喲;
  (2)如果您在之前沒有安裝過docker環境,則無需做當前步驟,如果您非要做該步驟,可能會出現如下圖所示的情況,屬於正常現象!

4.Docker engine常見的安裝方法概述

	您可以根據需要以不同的方式安裝Docker Engine:
    (1)大多數使用者會 設定Docker的儲存庫並從中進行安裝,以簡化安裝和升級任務。這是推薦的方法。
    (2)一些使用者下載並手動安裝RPM軟體包,並完全手動管理升級。這在諸如在無法訪問網際網路的空白系統上安裝Docker的情況下非常有用。
    (3)在測試和開發環境中,一些使用者選擇使用自動便利指令碼來安裝Docker。  
    
    溫馨提示:    
    	本篇部落格是基於儲存庫(需要配置軟體源)的方式進行安裝,即在新主機上首次安裝Docker Engine之前,需要設定Docker儲存庫。之後,您可以從儲存庫安裝和更新Docker。

5.切換國內的軟體源(本案例切換的是阿里源,當然,您也可以考慮使用其它的公網軟體源喲)

(1)備份CentOS官網的軟體源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

(2)下載阿里雲的軟體源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 


(3)非阿里雲ESC產品推薦操作該步驟
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

(4)生成本地快取
yum makecache


溫馨提示:
  上述的sed命令是可選操作,因為非阿里雲ECS使用者會出現"Could not resolve host: mirrors.cloud.aliyuncs.com; Unknown error"資訊,不影響使用。

參考連結:   
  https://developer.aliyun.com/mirror/centos

6.配置docker-ce的軟體源(也稱為"儲存庫")

(1)新增docker-ce的軟體源
	yum -y install yum-utils
	yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
	
(2)官方軟體源預設啟用了最新的軟體,您可以通過編輯軟體源的方式獲取各個版本的軟體包。例如官方並沒有將測試版本的軟體源置為可用,您可以通過以下方式開啟。同理可以開啟各種測試版本等。
	yum-config-manager --enable docker-ce-test  # 可選操作,若不啟用並不影響安裝docker-ce。
	yum-config-manager --enable docker-ce-nightly  # 可選操作

(3)如果您啟用了多個Docker儲存庫,則在未在yum installor yum update命令中指定版本的情況下進行安裝或更新將始終安裝可能的最高版本,這可能不適合您的穩定性需求,這個時候我們也可以來禁用最新的軟體源喲~
	yum-config-manager --disable docker-ce-test
	yum-config-manager --disable docker-ce-nightly
	
參考連結:
  https://developer.aliyun.com/mirror/docker-ce
  https://docs.docker.com/engine/install/centos/

7.安裝Docker Engine和容器

(1)若不指定安裝的docker版本,則預設安裝最新版本的Docker Engine和容器
	yum -y install docker-ce docker-ce-cli containerd.io

(2)要安裝特定版本的Docker Engine,請在儲存庫中列出可用版本,然後選擇並安裝。返回的列表取決於啟用的儲存庫,並且特定於您的CentOS版本(.el7此示例中的字尾表示)
	yum list docker-ce --showduplicates | sort -r
	
(3)通過其完全合格的軟體包名稱安裝特定版本,該軟體包名稱是軟體包名稱(docker-ce)加上版本字串(第二列),從第一個冒號(:)一直到第一個連字元,並用連字元(-)分隔。其語法格式如下所示。
	yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io  # 安裝特定docker版本的語法格式,下面有對應的案例喲~
	yum install docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io
	
溫馨提示:
	(1)此處我安裝了指定的版本,我們可以將"/etc/yum.conf"的"keepcache"進行快取即可。
	(2)將rpm包進行打包下發到其他節點
        [[email protected] ~]# mkdir docker_rpm_20.10
        [[email protected] ~]# 
        [[email protected] ~]# find /var/cache/yum/ -type f -name "*.rpm" | xargs mv -t docker_rpm_20.10
        [[email protected] ~]# 
        [[email protected] ~]# 
        [[email protected] ~]# tar zcf docker_rpm_20.10.tar.gz docker_rpm_20.10
        [[email protected] ~]# 
        [[email protected] ~]# ll -h
        總用量 109M
        drwxr-xr-x. 2 root root 4.0K 6月   9 21:00 docker_rpm_20.10
        -rw-r--r--. 1 root root 109M 6月   9 21:01 docker_rpm_20.10.tar.gz
        [[email protected] ~]# 

8.啟動docker守護程序並設定開機自啟動

[[email protected] ~]# systemctl start docker
[[email protected] ~]# 
[[email protected] ~]# systemctl enable docker

9.檢視docker的概要資訊

[[email protected] ~]# docker info

10.修改docker engine的預設Registry,建議使用國內的映象倉庫,國外的源網路會延遲較大

[[email protected] ~]# tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"]
> }
> EOF
{
"registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"]
}
[[email protected] ~]# 
[[email protected] ~]# 
[[email protected] ~]# cat /etc/docker/daemon.json 
{
"registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"]
}
[[email protected] ~]# 
[[email protected] ~]# systemctl daemon-reload
[[email protected] ~]# 
[[email protected] ~]# systemctl restart docker
[[email protected] ~]# 

參考連結:
  https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

三.dockers命令自動補全(新手必備)

1.為啥能自動補全

	Linux系統許多命令都會提供該命令自身的命令補齊指令碼,在安裝命令時會自動安裝自動補齊指令碼,如果有的話,該機制在Linux中被稱為bash-complete。

	如下圖所示,在/usr/share/bash-completion/completions/ 目錄下有許多命令自動補齊的指令碼,我們已經安裝了docker環境。
	

2.安裝相關依賴包

yum -y install bash-completion

source /usr/share/bash-completion/bash_completion

3.驗證補全功能

	如下圖所示,當我們輸入子命令不知道該如何是好的時候,就可以連續按兩下"tab"鍵即可。