Docker之介紹與安裝
Docker 說明
本章,我們主要從Docker簡介
、Docker中幾個核心概念
和Docker安裝
這幾個方面對Docker進行介紹!
1、🍇 Docker 簡介
1.1、🍈 什麼是 Docker
Docker 官網://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 這個網站了//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
下載地址://www.docker.com/products/docker-desktop
3.4、🥝 安裝 Docker
-
雙擊剛才下載下來的Docker Desktop Installer.exe文件安裝即可,不需要任何設置,如下圖所示:
雙擊打開:
安裝中:
點擊
Close and restart
代表需要重啟電腦: -
電腦重啟後,我們可以在 CMD 中輸入如下命令查看安裝的 Docker 版本:
docker --version
-
電腦重啟後,Docker 會自動啟動,在啟動介面我們點擊
Accept
即可,如下圖所示: -
注意:如果啟動後出現如下圖所示的警告,請先下載 Linux 內核更新包進行安裝更新, 更新包下載地址://aka.ms/wsl2kernel(或者點擊彈出警告中的連接),更新後點擊
Restart
按鈕即可。安裝 WSL 更新包:
重啟 Docker:
-
重啟如果出現Docker.ApiServices.WSL2.WslKernelUpdateNotInstalledException這個異常錯誤,說明需要安裝WSL這個插件, 打開//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": [
"//registry.docker-cn.com",
"//hub-mirror.c.163.com",
"//docker.mirrors.ustc.edu.cn"
],
完整配置:
{
"registry-mirrors": [
"//registry.docker-cn.com",
"//hub-mirror.c.163.com",
"//docker.mirrors.ustc.edu.cn"
],
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"features": {
"buildkit": true
}
}
設置效果圖:
保存後的設置會存儲到C:\Users\quber\.docker\daemon.json
文件中。
更多設置請參考官網://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
,查看該文件架下是否有“,如果沒有,需要手動下載//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": [ "//registry.docker-cn.com", "//hub-mirror.c.163.com", "//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 docker
net 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
到//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 注意
如果遇到
//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
更多設置請參考微軟官方說明://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 管理端
此時我們在瀏覽器中訪問//localhost:9000/地址即可打開 Web 管理端:
初始打開的時候,需要創建帳號和密碼,密碼長度不少於 8 位。
創建用戶進入系統後,選擇第一個選項「Docker」,點擊「Connect」按鈕即可進入 Docker 的管理介面:
接下來我們就可以在 Docker 中拉取各種鏡像進行安裝了,如:Docker 中安裝 Redis