Docker操作實踐(2):Docker的安裝及架構介紹
- 2019 年 10 月 8 日
- 筆記

上篇我們分享了一下容器的演進,然後用進程隔離、文件隔離、namespace、cgroups、libcontainer的幾個角度展開容器的本質,本篇文章會對Docker的版本安裝進行講解並簡介Docker的技術架構。
如果你還沒看過前面的內容:
Docker版本
Docker在1.13之後,採用時間線作為版本號標識。Docker的版本分為社區版(CE)和企業版(EE)。企業版會提供額外的收費服務,比如包括一些經過官方認證的插件、容器等。
社區版又分為三種版本:
穩定版本:stable。一般我們使用此版本。
預發佈版:test
待發佈版:nightly
Docker安裝
1. 卸載docker
卸載主機上已有的docker版本

2. 安裝前準備
配置yum
1. 安裝yum工具及devicemapper存儲驅動

2. 配置yum

yum makecache的過程中,可以看到可以安裝使用的包是dockerr-ce-stable版本,也就是repo中默認只開啟stable倉庫。
此時如果我們需要安裝test或nightly版本,可以使用yum-config-manger –enable docker-ce-test開啟此倉庫。
安裝docker
可以使用yum list查看倉庫中docker的版本:

1. 安裝docker

2. 啟動docker
systemctl start docker
systemctl enable docker
3. 查看docker版本

Docker鏡像下載加速器的配置
可配置阿里鏡像加速器,配置方法參考鏈接:
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
針對docker客戶端版本大於1.10.0的,可通過修改/etc/docker/daemon.json文件來使用加速器。
如果該文件不存在,則直接創建。
操作命令:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["鏡像加速器地址(可從上面阿里雲鏈接地址中獲取)"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker架構
Docker採用了傳統的client-server架構模式,總架構圖如下:

用戶通過docker client與docker daemon建立通信,並將請求發送給後者。Docker daemon中的模塊是松耦合結構,各模塊各司其職並有機組合,完成用戶的請求。
API:用於接收docker client的請求,然後根據不同的請求分發給daemon的不同模塊執行相關的工作。
Docker client:是一個泛稱,用來向指定的docker daemon發起請求。可以是docker命令行工具,也可以是任何遵循了docker api的客戶端。
Graph:作為容器鏡像的保管者。不論是docker下載的鏡像,還是docker構建的鏡像,都由graph統一管理。
Execdriver:是對linux操作系統的namespace、cgroups、apparmor、SELinux等容器運行所需的系統操作進行的一層二次封裝,其本質作用類似於LXC,但是功能要更全面。這也就是為什麼LXC會作為execdriver的一種實現而存在。不過目前,execdriver最主要的實現也是默認的實現是libcontainer庫
Networkdriver:對容器網絡環境操作所進行的封裝。對於容器來說,網絡設備的配置相對比較獨立,並且應該允許用戶進行更多的配置,所以在docker中,這一部分是單獨作為一個driverr來設計和實現的。這些操作具體包括創建容器通信所需的網絡,這個網絡所需的虛擬網上,分配通信所需的IP,服務訪問的端口和容器與宿該機之間的端口映射,設置hosts、resolv.conf、iptables等。
Graphdriver:是所有與容器鏡像相關操作的最終執行者。包括從遠程docker registry上下載鏡像並進行存儲,也包括本地構建完鏡像後的存儲。當用戶下載指定的容器鏡像時,graphdriver將容器鏡像分層存儲在本地的指定目錄下;同時當用戶需要使用指定的容器鏡像來創建容器時,graphdriver從本地鏡像存儲目錄中獲取指定的容器鋁合金,並按特定規則為容器準備rootfs;另外,當用戶需要通過指定dockerfile構建全新鏡像時,graphdriver會負責新鏡像的存儲管理。目前graphdriver支持對接四種不同的文件存儲:aufs、btrfs、vfs、devmapper。
Docker VS 虛擬機
1. Docker與虛擬機的架構對比
Docker架構與虛擬機架構對比情況如下圖。最直觀的差別在於docker容器中是沒有獨立的os,而是與宿主機共用同一個內核。然後通過隔離技術,讓我們在進入每一個容器時,所看到的內容和操作的環境就像是在一個虛擬機中一樣。

2. 容器與虛擬機的優劣對比
容器與虛擬機的對比情況如下:

在安全性上,虛擬機肯定是比容器要好的,顯而易見,虛擬機畢竟擁有着獨立的操作系統。
在計算資源開銷和鏡像大小對比上,容器優勢更大,從而實現了硬件資源的節約。
在啟動速度、快速擴展能力上,容器優勢更大,從而實現了容器化應用的快速部署/擴容,從而提高業務的敏捷性
在跨平台遷移能力上,容器優勢更大,這對於容器化應用在企業的不同雲環境之間的遷移提供了非常大的便利性。
基於以上的種種優勢,容器實現了對微服務架構和devops的更好的支持。
作者:沈曉龍

好文推薦
業務複雜、數據龐大、應用廣怎辦?了解下分佈式事務的解決思路!