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