Docker 說明
本章,我們主要從Docker簡介、Docker中幾個核心概念和Docker安裝這幾個方面對Docker進行介紹!
1、?? Docker 簡介
1.1、?? 什么是 Docker
Docker 官網:https://www.docker.com

Docker 是一個開源的應用容器引擎,是一個輕量級容器技術,
Docker 支持將軟體編譯成一個鏡像,然后在鏡像中各種軟體做好配置,將鏡像發布出去,其他使用者可以直接使用這個鏡像,
運行中的這個鏡像稱為容器,容器啟動是非常快速的,
Docker 的英文意思是碼頭工人,意思就是搬運東西的意思,其實這和 Docker 的特點是一樣的,Docker 提供的就是一種容器化搬運東西(我們的軟體或程式)的程序,Docker 自己本來是運行在作業系統上一個程式軟體,它會提供一個容器環境,使我們的程式獨立地運行在容器中,所以說,官方給 Docker 起的這個名字也真是應景,
1.2、?? Docker 的特點
1.2.1、更高效的利用系統資源
Docker 對系統資源的利用率很高,無論是應用執行速度,記憶體損耗或者檔案存盤速度,都要比傳統虛擬機技術更高效,因此,對比虛擬化技術,一個相同配置的主機往往可以運行更多數量的應用,
1.2.2、更快速的啟動時間
傳統的虛擬化技術啟動應用服務往往需要數分鐘,而 Docker 容器應用,由于直接運行于宿主內核,無需啟動完整的作業系統,因此可以做到秒級,甚至毫秒級的啟動時間,大大節約了開發測驗,部署的時間,
1.2.3、一致的運行環境
開發程序中常見的一個問題是環境一致問題,由于開發環境、測驗環境、生產環境不一致,導致有些 Bug 并未在開發程序中發現,而 Docker 的鏡像提供了除內核外完整的運行時環境,確保環境一致性,從而不會在出現這段代碼在我機器上沒問題這類問題,
1.2.4、持續支付和部署
對開發和運維人員來說,最希望就是一次創建和部署,可以在任意地方運行,而且使用 Docker File 使鏡像構建透明化,不僅僅開發團隊可以理解應用運行環境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像,
1.2.5、更輕松的遷移
由于 Docker 確保了執行環境的一致性,使得應用的遷移更加容易,Docker 可以在很多平臺上運行,無論是物理機、虛擬機、公有云、私有云,甚至是筆記本、其運行結果是一致的,因此用戶可以很輕易的將在一個平臺上運行的應用,遷移到另一個平臺上,而不用擔心運行環境的變化導致應用無法正常運行的情況,
1.2.6、更輕松的維護和擴展
Docker 使用的分層存盤以及鏡像技術,使得應用重復部分的復用更為容易,也使得應用的維護更新更加簡單,基于基礎鏡像進一步擴展鏡像也變得十分簡單,此外,Docker 團隊同各個開源專案團隊一起維護了一大批高質量的官網鏡像,既可以直接在生產環境使用,又可以作為基礎進一步定制,大大降低了應用服務的鏡像制作成本,
1.3、?? Docker 和虛擬機
Docker 是一個能把開發的應用程式自動部署到容器的開源引擎,Docker 在概念上可以理解為一個虛擬機,但卻不是真正意義上的虛擬機,
-
虛擬機是在一臺物理機上,利用虛擬化技術,虛擬出來多個作業系統,每個作業系統之間是隔離的,Docker 是開源的應用容器引擎,依然需要先在電腦上安裝作業系統,然后安裝 Docker 容器管理器;
-
虛擬機是在硬體級別進行虛擬化,而 Docker 是在作業系統的層面虛擬化;
-
虛擬機是通過模擬硬體搭建作業系統,而 Docker 則是復用作業系統;
-
虛擬機實作了作業系統之間的隔離,Docker 只是行程之間的隔離,所以虛擬機的隔離級別更高,安全性更強;
-
Docker 的運行速度更快;
-
Docker 的檔案要小得多,虛擬機要大得多,
所以,從運作原理上來看,Docker 更加的輕量級,虛擬機更加的笨重,Docker 啟動也十分的快,部署起來也方便,所以越來越多的人開始使用 Docker,
2、?? Docker 中幾個核心概念
2.1、?? 鏡像(Image)
鏡像到底是個什么東西呢,很多人在學習 Docker 的時候都是一頭霧水的,可能是歪果仁對鏡像情有獨鐘吧,好多東西都有鏡像的概念,比如我們安裝系統的.iso檔案,其實就是鏡像,這里你就可以把鏡像認為是一種模板,我們可以使用 Docker 根據這個模板創建容器來運行,其實更可以理解為鏡像是好比 Github 上的倉庫一樣,我們可以克隆下來源代碼然后運行,運行起來的代碼可以是一個網站、一個應用程式啥的,這就可以叫做容器,說白了,鏡像就是一堆靜態的模板,運行起來的鏡像就是容器,鏡像一般需要我們拉取下來,是只讀的,這個我們克隆 Github 上的倉庫是一樣一樣的,
Docker 鏡像中有分層的概念,就是一個鏡像可能基于好幾個鏡像,比如一個 Web 運行環境可能需要作業系統 Ubuntu、Mysql、.Net Core Runtime 運行時等,那我們拉取的這個鏡像就會包好這幾個鏡像,這就好像我們前邊說的打包好的運行環境一樣,直接就拉下來一個小電腦一樣,
2.2、?? 容器(Container)
當我們拉取了一個鏡像,然后 Run 一下,就會根據這個鏡像運行出來一個容器,運行的容器就好像我們的應用程式一樣,可以訪問可以停止,我們運用多次 Run 命令,就運行了很多很多容器,也可以說是鏡像的實體,從這個角度來看,我們可以把鏡像看作是類,容器看作 new 出來的實體,也是很合適的,
2.3、?? 倉庫(Repository)
存放鏡像的地方就是倉庫,就好比存放代碼的地方是 Github 一樣,我們就把 Github 稱為代碼的倉庫,Github 算是最大的倉庫,那么存放 Docker 鏡像的地方我們叫做 DockerHub,是 Docker 的中央倉庫,其實已經有 DockerHub 這個網站了https://hub.Docker.com,這就是存放 Docker 鏡像的官方倉庫,好多官方的也保存在這里,保證了鏡像的安全性和可靠性,我們可以從上邊拉取一下鏡像來運行我們的軟體,當然我們也可以制作好我們自己鏡像推送上去,不過這些肯定是要官方審核的,防止有些人寫入一些惡意代碼,不過我們可以推到我們自己的 DockerHub 上去,供我們自己使用,這個就好我們的 Github 賬號一樣了,屬于私有鏡像了,

2.4、?? 資料卷(Volumn)
實際上我們的容器就好像是一個簡易版的作業系統,只不過系統中只安裝了我們的程式運行所需要的環境,前邊說到我們的容器是 new 出來的實體,既然是 new 出來的實體那就會銷毀,那如果銷毀了我們的程式產生出的需要持久化的資料怎么辦呢,容器運行的時候我們可以進容器去查看,容器一旦銷毀就什么都沒有了,所以資料卷就是來解決這個問題的,是用來做資料持久化到我們的宿主機上容器間的資料共享,簡單的說就是將宿主機的目錄映射到容器中的目錄,應用程式在容器中的目錄讀寫資料會同步到宿主機上,這樣容器產生的資料就可以持久化了,比如我們的資料庫容器,就可以把資料存到我們宿主機上的真實磁盤上了,
3、?? Docker 安裝
接下來我們以在 Windows 中安裝 Docker 為例進行介紹,其他環境類似,
3.1、?? 啟用 Windows 虛擬化
打開任務管理器,點擊性能,查看虛擬化是否已啟用,如下圖所示:

3.2、?? 啟用 Hyper-v
打開控制面板,點擊程式和功能,點擊啟用或關閉 Windows 功能,勾選 Hyper-v,確定即可(安裝完 Hyper-v 后,可能需要重啟電腦),如下圖所示:


3.3、?? 下載 Docker
下載地址:https://www.docker.com/products/docker-desktop

3.4、?? 安裝 Docker
-
雙擊剛才下載下來的Docker Desktop Installer.exe檔案安裝即可,不需要任何設定,如下圖所示:
雙擊打開:

安裝中:

點擊
Close and restart代表需要重啟電腦:
-
電腦重啟后,我們可以在 CMD 中輸入如下命令查看安裝的 Docker 版本:
docker --version
-
電腦重啟后,Docker 會自動啟動,在啟動界面我們點擊
Accept即可,如下圖所示:

-
注意:如果啟動后出現如下圖所示的警告,請先下載 Linux 內核更新包進行安裝更新,? 更新包下載地址:https://aka.ms/wsl2kernel(或者點擊彈出警告中的連接),更新后點擊
Restart按鈕即可,

安裝 WSL 更新包:
?

重啟 Docker:
?

-
重啟如果出現Docker.ApiServices.WSL2.WslKernelUpdateNotInstalledException這個例外錯誤,說明需要安裝WSL這個插件,? 打開https://czf-net.xyz/res,下載 wsl.msi 檔案,然后安裝即可,再次打開 Docker Desktop 就正常了,
?

?

-
如果重啟后出現如下所示的錯誤警告,在 CMD 中執行如下命令并重啟電腦:
netsh winsock reset?

?

Docker.Core.DockerException: Failed to start 在 Docker.Engines.LinuxkitDaemonStartup.<WaitAsync>d__5.MoveNext() 位置 C:\workspaces\4.12.x\src\github.com\docker\pinata\win\src\Docker.Engines\LinuxkitDaemonStartup.cs:行號 54 --- 引發例外的上一位置中堆疊跟蹤的末尾 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Docker.Engines.WSL2.LinuxWSL2Engine.<DoStartAsync>d__26.MoveNext() 位置 C:\workspaces\4.12.x\src\github.com\docker\pinata\win\src\Docker.Engines\WSL2\LinuxWSL2Engine.cs:行號 170 --- 引發例外的上一位置中堆疊跟蹤的末尾 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Docker.ApiServices.StateMachines.TaskExtensions.<WrapAsyncInCancellationException>d__0.MoveNext() 位置 C:\workspaces\4.12.x\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\TaskExtensions.cs:行號 29 --- 引發例外的上一位置中堆疊跟蹤的末尾 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Docker.ApiServices.StateMachines.StartTransition.<DoRunAsync>d__5.MoveNext() 位置 C:\workspaces\4.12.x\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\StartTransition.cs:行號 67 --- 引發例外的上一位置中堆疊跟蹤的末尾 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 Docker.ApiServices.StateMachines.StartTransition.<DoRunAsync>d__5.MoveNext() 位置 C:\workspaces\4.12.x\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\StartTransition.cs:行號 92
3.5、?? 啟動 Docker
正常啟動 Docker 的效果如下圖所示:
?
3.6、?? 登錄 Docker
我們可以點擊表單的右上角登錄按鈕登錄自己的 Docker 賬號,如下圖所示:
?
3.7、?? 配置鏡像加速地址
我們可以配置國內鏡像加速下載地址,點擊右上角的設定按鈕,點擊 Docker Engine 選項,增加如下配置,然后點擊Apply & Restart按鈕即可:
增加的配置:
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
完整配置:
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"features": {
"buildkit": true
}
}
設定效果圖:
?
保存后的設定會存盤到C:\Users\quber\.docker\daemon.json檔案中,
更多設定請參考官網:https://docs.docker.com/engine/reference/commandline/dockerd
3.8、?? 修改 Docker 資料存盤位置
-
由于 Docker 默認安裝在 C 盤(C:\Program Files\Docker),這里我們需要將 Docker 的資料存盤轉移到其他盤,如 D:\Net_Program\Net_Docker,先退出 Docker Desktop,如下圖所示:
?

-
新建目錄 D:\Net_Program\Net_Docker,執行如下命令匯出備份資料到 D:\Net_Program\Net_Docker
wsl --export docker-desktop-data "D:\Net_Program\Net_Docker\docker-desktop-data.tar"?

說明:D:\Net_Program\Net_Docker為備份的地址,docker-desktop-data.tar為備份的名稱
-
執行如下命令洗掉原有資料:
wsl --unregister docker-desktop-data?

-
執行如下命令更改資料存盤盤并恢復資料:
wsl --import docker-desktop-data "D:\Net_Program\Net_Docker" "D:\Net_Program\Net_Docker\docker-desktop-data.tar" --version 2?

說明:"D:\Net_Program\Net_Docker"為更改的資料存盤盤地址,"D:\Net_Program\Net_Docker\docker-desktop-data.tar"為匯入的資料備份檔案地址(即上面我們備份的檔案地址),匯入完成后在D:\Net_Program\Net_Docker下會生成一個 ext4.vhdx 的虛擬磁盤路徑
4、?? 安裝完成
到此,Windows 中安裝 Docker 就完成了,
?
?
?
5、??Windows Server 中安裝 Docker
這里我們以在 Windows Server 2016 Datacenter 為例進行介紹,
由于 Windows Server 中不支持使用 Docker Desktop 直接安裝,因此,需要按照一下步驟進行安裝,
5.1、?? 下載更新
在運行中輸入sconfig打開引數設定選單:
?
?
然后輸入數字 6 并確定(下載并安裝更新),在彈出的黑色對話框中選擇A,讓它下載更新并重啟,此操作必須進行,否則后續安裝會失敗或者各種報錯類似于 Linux 各種軟體版本依賴:
?
?
?
以管理員身份運行 PowerShell,由于 Windows Server 2016 中文版不支持安裝的 NuGet,需要使用命令將原有的 Tls一級修改為二級才能安裝 NuGet 服務,執行如下命令:
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;
?
5.2、?? 安裝 NuGet 服務
執行如下命令指定 NuGet 安裝包最小版本:
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
?
?
安裝 Docker 模塊:
Install-Module -Name DockerMsftProvider -Force
?
安裝 Docker 包:
Install-Package -Name docker -ProviderName DockerMsftProvider -Force
?
:::danger 注意
如果這一步安裝失敗,大概的錯誤是Install-Package :找不到路徑“C:\Users\xxxx……\AppData\Local\DockerMsftProvider\Docker-17-05-2-ee-13.zip”……,
定位到路徑C:\Users\Administrator\AppData\Local\Temp\DockerMsftProvider,查看該檔案架下是否有``,如果沒有,需要手動下載https://dockermsft.blob.core.windows.net/dockercontainer/docker-1-12-2-cs2-ws-beta.zip放到這個檔案夾下,
?
最后再執行安裝 Docker 包命令即可:
Install-Package -Name docker -ProviderName DockerMsftProvider -Force
:::
安裝完成后重啟計算機生效(注意,執行如下命令將重啟電腦,請謹慎操作):
Restart-Computer -Force
?
5.3、?? 驗證 Docker
重啟后,我們在 PowerShell 中輸入如下命令可查看 Docker 的版本資訊,
查看 Docker 的版本號或版本資訊:
docker --version
?
docker version
?
查看 Docker 的資訊:
docker info
?
5.4、?? 修改 Docker 配置
-
找到檔案
C:\ProgramData\docker\config\daemon.json,如果沒有該檔案就創建,填入如下配置:?

{ "builder": { "gc": { "defaultKeepStorage": "20GB", "enabled": true } }, "experimental": false, "features": { "buildkit": true }, "registry-mirrors": [ "https://registry.docker-cn.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn" ], "graph": "E:\\03Docker\\Docker" }說明:
registry-mirrors 代表鏡像加速地址;
graph 代表 Docker 資料存盤地址;
如果出現鏡像拉取失敗“no matching manifest for windows/amd64 10.0.18362 in the manifest list entries”,需要將“experimental”設定為“true”,如果拉取鏡像還是出現上述錯誤,請嘗試在拉取命令后面加上
:nanoserver(如 docker pull redis:nanoserver),再次拉取鏡像即可成功;PS:
nanoserver是基于 Windows 上的虛擬化實踐,?

-
在 PowerShell 中分別執行如下命令重啟 Docker 服務:
net stop dockernet start docker?

或者直接執行
Restart-Service docker重啟 Docker 服務:
5.5、?? 測驗
我們以安裝 Redis 為例,在 CMD 中執行如下命令拉取 Redis 鏡像:
docker pull redis
如果出現“no matching manifest for windows/amd64 10.0.14393 in the manifest list entries”的錯誤提示,請將C:\ProgramData\docker\config\daemon.json組態檔中的experimental設定為true,然后重啟 Docker 服務,再次拉取鏡像即可成功!
?
?
如果拉取鏡像還是出現上述錯誤,請在拉取鏡像命令最后加上:nanoserver,再次拉取鏡像即可成功!
docker pull redis:nanoserver
?
?
PS:nanoserver是基于 Windows 上的虛擬化實踐,
5.6、Hyper-V 安裝 Liunx Container
-
打開
服務器管理器,滑鼠右鍵選擇Hyper-V 管理器,如下圖所示:?

-
在彈出的表單中選擇
虛擬交換機管理器,如下圖所示:?

-
在彈窗的表單中選擇
創建虛擬交換機,如下圖所示:?

-
然后填寫名稱和說明等資訊,如下圖所示:
?

-
下載 Docker-Machine
到https://github.com/docker/machine/releases去下載docker-machine-Windows-x86_64.exe,下載下來后重命名為
docker-machine.exe,然后將``放入D:\01Software\Docker檔案夾下,如下圖所示:?

?

-
以管理員身份運行
CMD,并定位到D:\01Software\Docker,然后執行如下命令:docker-machine create -d hyperv --hyperv-virtual-switch "DockerNat" VM8說明:命令中的
DockerNat就是剛才我們新建的虛擬機名稱,然后等待命令執行完成,如下圖所示:
:::danger 注意
如果遇到
https://github.com/boot2docker/boot2docker/releases/download/v19.03.12/boot2docker.iso一直下載不下來,我們可以手動下載該檔案,然后將該檔案放入C:\Users\Administrator\.docker\machine\cache目錄內,然后再重新執行上述命令即可,?

?

:::
?

-
執行如下命令,把當前主機設定為默認 Docker 命令運行的主機:
docker-machine.exe env VM8?

-
執行如下命令:
@FOR /f "tokens=*" %i IN ('docker-machine env vm8') DO @%i?

6、?? 設定 Vmmem 記憶體占用配置
默認情況下,當開啟 Docker 后,Windows 中的 Vmmem 行程占用的記憶體非常高,如下圖所示:
?
6.1. ?? 修改.wslconfig配置
查看C:\Users\quber下是否有.wslconfig檔案,沒有則新建一個,
然后設定如下配置:
[wsl2]
# 設定最大占用記憶體為2GB
memory=2GB
更多設定請參考微軟官方說明:https://docs.microsoft.com/en-us/windows/wsl/wsl-config#configuration-setting-for-wslconfig
6.2. ?? 在 CMD 中運行如下命令
wsl --shutdown
?
6.3. ?? 然后重啟 Docker Desktop
?
我們再看設定后的效果:
?
7、?? Portainer 安裝
Portainer 的作用就相當于 Docker Desktop,只不過為 Web 端進行管理,
7.1、?? 拉取 Portainer 鏡像
執行如下命令拉取 Portainer 鏡像:
docker pull portainer/portainer
?
7.2、?? 創建 Portainer 容器
新建目錄D:\Net_Program\Net_Docker\Portainer\Data,用于存盤 Portainer 的相關資料,
執行如下命令創建 Portainer 容器并運行:
docker run -d --name=portainer -p 8000:8000 -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v D:/Net_Program/Net_Docker/Portainer/Data:/data portainer/portainer
?
?
7.3、?? 運行 Web 管理端
此時我們在瀏覽器中訪問http://localhost:9000/地址即可打開 Web 管理端:
?![web]
初始打開的時候,需要創建賬號和密碼,密碼長度不少于 8 位,
創建用戶進入系統后,選擇第一個選項“Docker”,點擊“Connect”按鈕即可進入 Docker 的管理界面:
?
?
?
接下來我們就可以在 Docker 中拉取各種鏡像進行安裝了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/519292.html
標籤:其他
上一篇:盤它!基于CANN的輔助駕駛AI實戰案例,輕松搞定車輛檢測和車距計算!
下一篇:資料結構:線段樹基礎詳解
