一. 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以上 |
以上是虛擬機和容器的區別