2021-05-12 14:32:11
揭開Docker的面紗 - 基礎理論梳理和安裝流程演示
前言
? 本文將圍繞以下幾個方面來揭開docker的面紗:
- 什麼是docker?
- 為什麼需要docker?
- docker的核心概念
什麼是docker?
?基於Linux而言,docker是在其中執行應用的一款開源工具,可以認為是一種輕量級的虛擬機器。docker的logo是一條載著集裝箱的鯨魚(舊版的logo),新版的logo則是直接簡化了細節,更改了顏色,如下圖。
從圖片中就可以看出來,docker的建立和開發者們的意圖。鯨魚——宿主機,塊狀箱——隔離的容器(後面介紹什麼是docker容器)。而docker的宗旨:Build、Ship and Run Any APP,Anywhere。具體而言,就是通過對應應用元件的封裝、發布、部署、執行等生命週期的管理,從而達到應用元件級別的“一次封裝、處處執行”的目的。
? 舉個例子就好比自己開發了一款應用軟體,希望它在任何地點,任何時間、任何作業系統中都可以使用的時候,就可以將它基於docker來實現。當然,對於docker而言,這個元件可以是一個應用,也可以是一個設定,甚至可以是一個完整的作業系統。
為什麼需要docker?
?其實docker的出現對於開發人員是莫大的福音。設想目前或未來基於雲平台的應用或軟體的開發,脫離了底層的硬體,而使用者需要在任何時間、任何地點都可以獲取相關的資源,那麼docker便可以提供這樣的訴求。
下面直接給出docker容器與傳統虛擬機器的比較
特性 | Docker容器 | 虛擬機器 |
---|---|---|
啟動速度 | 秒級 | 分鐘級 |
計算機效能損耗 | 幾乎不損耗 | 損耗一半左右 |
效能 | 接近原生 | 弱之 |
系統支援量 | 上千個 | 幾十個 |
隔離性 | 資源限制 | 完全隔離 |
? docker核心解決的問題是利用容器實現類似VM的功能,從而以更加節省的硬體資源給使用者提供更多的計算資源,並且docker操作方便,還可以通過Dockerfile組態檔支援靈活的自動化建立和部署。
?接下來看一下Docker與傳統虛擬機器架構的對比:
? 通過上圖發現,虛擬機器是在物理資源層面實現的隔離,相對於虛擬機器,Docker是基於APP層面實現的隔離,並且省去了虛擬機器作業系統,從而節省了一部分的系統資源。
? Docker守護行程可以直接與主作業系統進行通訊,為各個Docker容器分配資源;它還可以將容器與主作業系統隔離(為了安全),並將各個容器互相隔離。虛擬機器啟動需要數分鐘,而Docker容器可以在數毫秒內啟動。由於沒有臃腫的從作業系統,Docker可以節省大量的磁碟空間以及其他系統資源。
? 簡單來說,虛擬機器和docker的區別就在於虛擬機器需要通過Hypervisor對硬體資源也進行虛擬化,而docker是直接使用宿主機的硬體資源的,因此虛擬機器的隔離性更加徹底,而docker的隔離性次之。
Docker的核心概念
1、映象——image
? 可以理解為類似我們虛擬機器中的快照,是建立容器的基礎,可以說無映象,不容器。
2、容器——container
? 基於映象建立的執行範例,可以被啟動、停止和刪除。每個容器之間都是相互隔離、互不可見的。
3、倉庫——repository
? 儲存映象的地方,可以理解為映象囤積地。可以將自己建立的進行推播到倉庫中,方便隨時隨地拉取使用。
? 倉庫註冊伺服器(registry)是存放倉庫的地方,其中包含了多個倉庫,每個倉庫中存放一類映象,並且使用不同的標籤(tag)來區分。目前最大的公共倉庫就是Docker Hub,其中存放了數量龐大的映象給使用者下載使用。
這邊補充說明一下docker架構:
? Docker使用用戶端-伺服器架構。Docker 用戶端與Docker 守護行程進行對話,該守護行程完成了構建,執行和分發Docker容器的繁重工作。Docker用戶端和守護程式可以 在同一系統上執行,或者您可以將Docker用戶端連線到遠端Docker守護程式。Docker用戶端和守護程式在UNIX通訊端或網路介面上使用REST API進行通訊。
架構圖示:
Docker的安裝流程
基於Linux/CentOS7的安裝部署流程如下:
作業系統版本:centos7.7
1、環境部署
[root@localhost ~]# hostnamectl set-hostname docker
[root@localhost ~]# su
[root@docker ~]# cat /etc/RedHat-release
CentOS Linux release 7.7.1908 (Core)
[root@docker ~]# systemctl stop firewalld && systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.Fedoraproject.FirewallD1.service.
[root@docker ~]# setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
[root@docker ~]# echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf #開啟路由轉發
[root@docker ~]# sysctl -p #載入路由轉發功能
net.ipv4.ip_forward = 1
[root@docker ~]# systemctl restart network
2、安裝依賴包
[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
...
更新完畢:
lvm2.x86_64 7:2.02.185-2.el7_7.2
作為依賴被升級:
device-mapper.x86_64 7:1.02.158-2.el7_7.2 device-mapper-event.x86_64 7:1.02.158-2.el7_7.2
device-mapper-event-libs.x86_64 7:1.02.158-2.el7_7.2 device-mapper-libs.x86_64 7:1.02.158-2.el7_7.2
lvm2-libs.x86_64 7:2.02.185-2.el7_7.2
完畢!
說明:
安裝yum-utils軟體包是為了提供一個yum-config-manager單元,同時安裝的device-mapper-persistent-data和lvm2用於儲存裝置對映必須的兩個軟體包。
3、設定穩定的儲存庫
[root@docker ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
已載入外掛:fastestmirror, langpacks
adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
[root@docker ~]# ls /etc/yum.repos.d/ #檢視是否加入了一個docker源
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo
CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo docker-ce.repo
4、安裝docker引擎
[root@docker ~]# yum install -y docker-ce
...
已安裝:
docker-ce.x86_64 3:19.03.8-3.el7
作為依賴被安裝:
container-selinux.noarch 2:2.107-3.el7 containerd.io.x86_64 0:1.2.13-3.1.el7
docker-ce-cli.x86_64 1:19.03.8-3.el7
完畢!
5、建立docker目錄,設定映象加速服務
[root@docker ~]# mkdir /etc/docker -p
[root@docker ~]# tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://5m9y9qbl.mirror.aliyuncs.com"]
> }
> EOF
{
"registry-mirrors": ["https://5m9y9qbl.mirror.aliyuncs.com"]
}
說明:tee命令——從標準輸入寫往檔案和標準輸出,即把標準輸入的資料複製到每一個檔案FILE, 同時送往標準輸出。
6、開啟服務,檢視版本
[root@docker ~]# systemctl daemon-reload
[root@docker ~]# systemctl restart docker.service
[root@docker ~]# docker -v
Docker version 19.03.8, build afacb8b
[root@docker ~]# docker version
Client: Docker Engine - Community
Version: 19.03.8
API version: 1.40
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:27:04 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.8
API version: 1.40 (minimum version 1.12)
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:25:42 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
總結
? 本文主要介紹了docker的作用,將之與傳統虛擬機器進行特性對比,以及架構層面的對比,接著講述有關docker的核心三大組成,最終給出基於Linux下Centos7作業系統中docker的安裝流程。
相關文章