一. 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 pull
或
docker 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版本
- Centos7(64-bit)
- Centos6.5(64-bit)
- 阿裡雲伺服器:Alibaba Cloud Linux 參考阿裡雲安裝docker文檔:https://help.aliyun.com/document_detail/264695.html
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以上 |
以上是虛拟機和容器的差別