Docker筆記
Docker 是什么
Docker 是一個應用打包、分發、部署的工具
你也可以把它理解為一個輕量的虛擬機,它只虛擬你軟件需要的運行環境,多余的一點都不要,
而普通虛擬機則是一個完整而龐大的系統,包含各種不管你要不要的軟件。
本文檔課件配套 視頻教程
跟普通虛擬機的對比
| 特性 | 普通虛擬機 | Docker |
|---|---|---|
| 跨平臺 | 通常只能在桌面級系統運行,例如 Windows/Mac,無法在不帶圖形界面的服務器上運行 | 支持的系統非常多,各類 windows 和 Linux 都支持 |
| 性能 | 性能損耗大,內存占用高,因為是把整個完整系統都虛擬出來了 | 性能好,只虛擬軟件所需運行環境,最大化減少沒用的配置 |
| 自動化 | 需要手動安裝所有東西 | 一個命令就可以自動部署好所需環境 |
| 穩定性 | 穩定性不高,不同系統差異大 | 穩定性好,不同系統都一樣部署方式 |
打包、分發、部署
打包:就是把你軟件運行所需的依賴、第三方庫、軟件打包到一起,變成一個安裝包
分發:你可以把你打包好的“安裝包”上傳到一個鏡像倉庫,其他人可以非常方便的獲取和安裝
部署:拿著“安裝包”就可以一個命令運行起來你的應用,自動模擬出一摸一樣的運行環境,不管是在 Windows/Mac/Linux。

Docker 部署的優勢
常規應用開發部署方式:自己在 Windows 上開發、測試 --> 到 Linux 服務器配置運行環境部署。
問題:我機器上跑都沒問題,怎么到服務器就各種問題了
用 Docker 開發部署流程:自己在 Windows 上開發、測試 --> 打包為 Docker 鏡像(可以理解為軟件安裝包) --> 各種服務器上只需要一個命令部署好
優點:確保了不同機器上跑都是一致的運行環境,不會出現我機器上跑正常,你機器跑就有問題的情況。
例如 易文檔,SVNBucket 的私有化部署就是用 Docker,輕松應對客戶的各種服務器。
Docker 通常用來做什么
- 應用分發、部署,方便傳播給他人安裝。特別是開源軟件和提供私有部署的應用
- 快速安裝測試/學習軟件,用完就丟(類似小程序),不把時間浪費在安裝軟件上。例如 Redis / MongoDB / ElasticSearch / ELK
- 多個版本軟件共存,不污染系統,例如 Python2、Python3,Redis4.0,Redis5.0
- Windows 上體驗/學習各種 Linux 系統
重要概念:鏡像、容器
鏡像:可以理解為軟件安裝包,可以方便的進行傳播和安裝。
容器:軟件安裝后的狀態,每個軟件運行環境都是獨立的、隔離的,稱之為容器。
安裝
桌面版:https://www.docker.com/products/docker-desktop
服務器版:https://docs.docker.com/engine/install/#server
啟動報錯解決
報錯截圖

解決方法:
控制面板->程序->啟用或關閉 windows 功能,開啟 Windows 虛擬化和 Linux 子系統(WSL2)

命令行安裝 Linux 子系統(這步可能不需要,因為 docker 安裝時有說自動安裝 wsl)
wsl --install -d Ubuntu
命令行安裝可能太慢,你也可以打開微軟商店 Microsoft Store 搜索 Linux 進行安裝
設置開機啟動 Hypervisor
bcdedit /set hypervisorlaunchtype auto
注意要用管理員權限打開 PowerShell
確保 BIOS 已開啟虛擬化,下圖檢查是否已開啟好
如果是已禁用,請在開機時按 F2 進入 BIOS 開啟一下,不會設置的可以網上搜索下自己主板的設置方法,Intel 和 AMD 的設置可能稍有不同

出現下圖錯誤,點擊鏈接安裝最新版本的 WSL2
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

鏡像加速源
| 鏡像加速器 | 鏡像加速器地址 |
|---|---|
| Docker 中國官方鏡像 | https://registry.docker-cn.com |
| DaoCloud 鏡像站 | http://f1361db2.m.daocloud.io |
| Azure 中國鏡像 | https://dockerhub.azk8s.cn |
| 科大鏡像站 | https://docker.mirrors.ustc.edu.cn |
| 阿里云 | https://<your_code>.mirror.aliyuncs.com |
| 七牛云 | https://reg-mirror.qiniu.com |
| 網易云 | https://hub-mirror.c.163.com |
| 騰訊云 | https://mirror.ccs.tencentyun.com |

掛載
現存問題
- 使用 Docker 運行后,我們改了項目代碼不會立刻生效,需要重新
build和run,很是麻煩。 - 容器里面產生的數據,例如 log 文件,數據庫備份文件,容器刪除后就丟失了。
目錄掛載解決以上問題
本文檔課件配套 視頻教程
幾種掛載方式
bind mount直接把宿主機目錄映射到容器內,適合掛代碼目錄和配置文件。可掛到多個容器上volume由容器創建和管理,創建在宿主機,所以刪除容器不會丟失,官方推薦,更高效,Linux 文件系統,適合存儲數據庫數據。可掛到多個容器上tmpfs mount適合存儲臨時文件,存宿主機內存中。不可多容器共享。
文檔參考:https://docs.docker.com/storage/

掛載演示
bind mount` 方式用絕對路徑 `-v D:/code:/app
volume` 方式,只需要一個名字 `-v db-data:/app
示例:
docker run -p 8080:8080 --name test-hello -v D:/code:/app -d test:v1
多容器通信
學習目標
項目往往都不是獨立運行的,需要數據庫、緩存這些東西配合運作。
這節我們把前面的 Web 項目增加一個 Redis 依賴,多跑一個 Redis 容器,演示如何多容器之間的通信。
本文檔課件配套 視頻教程
創建虛擬網絡
要想多容器之間互通,從 Web 容器訪問 Redis 容器,我們只需要把他們放到同個網絡中就可以了。
文檔參考:https://docs.docker.com/engine/reference/commandline/network/
演示
創建一個名為test-net的網絡:
docker network create test-net
運行 Redis 在 test-net 網絡中,別名redis
docker run -d --name redis --network test-net --network-alias redis redis:latest
修改代碼中訪問redis的地址為網絡別名

運行 Web 項目,使用同個網絡
docker run -p 8080:8080 --name test -v D:/test:/app --network test-net -d test:v1
查看數據
http://localhost:8080/redis
容器終端查看數據是否一致
更多相關命令
docker ps 查看當前運行中的容器
docker images 查看鏡像列表
docker rm container-id 刪除指定 id 的容器
docker stop/start container-id 停止/啟動指定 id 的容器
docker rmi image-id 刪除指定 id 的鏡像
docker volume ls 查看 volume 列表
docker network ls 查看網絡列表


浙公網安備 33010602011771號