我的GitHub | 我的博客 | 我的微信 | 我的郵箱 |
---|---|---|---|
baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
目錄
Docker 加速鏡像
- 官方:https://registry.docker-cn.com
- 網易雲:http://hub-mirror.c.163.com
- 七牛雲:https://reg-mirror.qiniu.com
- ustc:https://docker.mirrors.ustc.edu.cn
- 阿里雲
- daocloud
- 時速雲:https://hub.tenxcloud.com/
基於 WSL 2 的 Docker Desktop
通過啟用基於 WSL 2 的引擎,你可以在同一台計算機上的 Docker Desktop
中同時運行 Linux 和 Windows 容器。
Docker 容器
Docker 是一種工具
,用於創建、部署和運行應用程序
(通過使用容器)。容器使開發人員可以將應用與需要的所有部件(庫、框架、依賴項等)打包為一個包一起交付。使用容器可確保此應用的運行與之前相同,而不受任何自定義設置或運行該應用的計算機上先前安裝的庫的影響
(運行應用的計算機可能與用於編寫和測試應用代碼的計算機不同)。這使開發人員可以專注於編寫代碼,而無需操心將運行代碼的系統。
Docker 容器與虛擬機類似,但不會創建整個虛擬操作系統
。 相反,Docker 允許應用使用與運行它的系統相同的 Linux 內核。 這使得應用包能夠僅要求主計算機上尚未安裝的部件,從而降低包大小以及提高性能。
將 Docker 容器與 Kubernetes
等工具結合使用以實現持續可用性
是容器普及的另一個原因。這樣就可以在不同的時間創建應用容器的多個版本。 並且每個容器(及其特定的微服務
)均可以動態更換
,而無需停止整個系統進行更新或維護
。你可以准備一個包含所有更新的新容器,將該容器設置用於生產,並在新容器准備就緒后直接指向該容器。你還可以使用容器對不同版本的應用進行存檔,如有需要,還可將其作為安全回退保持運行。
為何要用 WSL 2
在 WSL 版本 1 中,由於 Windows 和 Linux 之間的基本差異,Docker 引擎無法直接在 WSL 內運行
,因此 Docker 團隊開發了使用 Hyper-v
Vm 和 LinuxKit 的替代解決方案。
在 WSL 版本 2 中,因為 WSL 2 現在運行在具有完全系統調用容量的 Linux 內核上,所以 Docker 可以在 WSL 2 中完全運行
。這意味着 Linux 容器可以在無需模擬的情況下運行,從而在 Windows 和 Linux 工具之間實現更好的性能和互操作性
。
先決條件
- 確保你的計算機運行的是 Windows 10,並已更新到 18362 或更高版本
- 啟用 WSL、安裝 Linux 分發版和更新到 WSL 2
- 下載並安裝 Linux 內核更新包
可選
- 安裝 Visual Studio Code,這將提供最佳體驗,包括在遠程 Docker 容器內進行代碼和調試並連接到 Linux 分發的功能
- 安裝 Windows 終端,這會提供最佳體驗,包括在同一接口中自定義和打開多個終端的任何內容
- 在 Docker Hub 上注冊 DOCKER ID
安裝 Docker Desktop
- 下載 Docker Desktop 並按照安裝說明進行操作
- 安裝完成后,啟動 Docker Desktop,確保
設置 - 常規
中選中 "使用基於 WSL 2 的引擎" - 轉到
設置 - 資源 - WSL 集成
,從已安裝的 WSL 2 分發中選擇要啟用 Docker 集成
Docker 命令大全
基本命令
docker # 列出 Docker CLI 中可用的命令
docker info [OPTIONS] # 查看docker系統信息
docker version [OPTIONS] # 查看docker版本信息
docker -v #只顯示版本信息【Docker version 20.10.2, build 2291f61】
docker <COMMAND> --help # 列出特定命令的使用幫助信息
docker images # 列出計算機上的 docker 映像
docker container ls --all # 列出計算機上的容器,或【docker ps -a】
容器生命周期管理
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] # 創建一個新的容器並運行一個命令
docker start/stop/restart [OPTIONS] CONTAINER [CONTAINER...] # 啟動/停止/重啟容器
docker kill [OPTIONS] CONTAINER [CONTAINER...] # 殺掉一個運行中的容器
docker rm [OPTIONS] CONTAINER [CONTAINER...] # 刪除一個或多個容器
docker pause/unpause [OPTIONS] CONTAINER [CONTAINER...] # 暫停/恢復容器中所有的進程
docker create [OPTIONS] IMAGE [COMMAND] [ARG...] # 創建一個新的容器但不啟動它
docker exec [OPTIONS] CONTAINER COMMAND [ARG...] # 在運行的容器中執行命令
容器操作
docker ps [OPTIONS] # 查看正在運行的容器
docker inspect [OPTIONS] NAME|ID [NAME|ID...] # 獲取容器/鏡像的元數據
docker top [OPTIONS] CONTAINER [ps OPTIONS] # 查看容器中運行的進程信息,支持 ps 命令參數
docker attach [OPTIONS] CONTAINER # 連接到正在運行中的容器
docker events [OPTIONS] # 從服務器獲取實時事件
docker logs [OPTIONS] CONTAINER # 獲取容器的日志
docker wait [OPTIONS] CONTAINER [CONTAINER...] # 阻塞運行直到容器停止,然后打印出它的退出代碼
docker export [OPTIONS] CONTAINER # 將文件系統作為一個tar歸檔文件導出到STDOUT
docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]] # 列出指定的容器的端口映射,或者查找將PRIVATE_PORT NAT到面向公眾的端口
容器 rootfs 命令
rootfs:Root FileSystem,Linux系統中的
根文件系統
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] # 從容器創建一個新的鏡像
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- # 用於容器與主機之間的數據拷貝
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH # 用於容器與主機之間的數據拷貝
docker diff [OPTIONS] CONTAINER # 檢查容器里文件結構的更改
鏡像倉庫
docker login/logout [OPTIONS] [SERVER] # 登陸/出到一個Docker鏡像倉庫,如果未指定鏡像倉庫地址,默認為官方倉庫 Docker Hub
docker pull [OPTIONS] NAME[:TAG|@DIGEST] # 從鏡像倉庫中拉取或者更新指定鏡像
docker push [OPTIONS] NAME[:TAG] # 將本地的鏡像上傳到鏡像倉庫,要先登陸到鏡像倉庫
docker search [OPTIONS] TERM # 從Docker Hub查找鏡像
本地鏡像管理
docker images [OPTIONS] [REPOSITORY[:TAG]] # 查看本地鏡像列表,等價於【docker image ls】
docker container ls # 查看所有容器
docker rmi [OPTIONS] IMAGE [IMAGE...] # 刪除本地一個或多少鏡像,等價於【docker image rm [image]】
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG] # 標記本地鏡像,將其歸入某一倉庫
docker build [OPTIONS] PATH | URL | - # 使用 Dockerfile 創建鏡像
docker history [OPTIONS] IMAGE # 查看指定鏡像的創建歷史
docker save [OPTIONS] IMAGE [IMAGE...] # 將指定鏡像保存成 tar 歸檔文件
docker load [OPTIONS] # 導入使用 docker save 命令導出的鏡像
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] # 從歸檔文件中創建鏡像
docker image prune # 清理臨時的、沒有被使用的鏡像文件
Docker 鏡像命令詳解
常見的 Linux Docker 鏡像大小:
REPOSITORY TAG IMAGE ID VIRTUAL SIZE
alpine latest 4e38e38c8ce0 4.799 MB
debian latest 4d6ce913b130 84.98 MB
ubuntu latest b39b81afc8ca 188.3 MB
centos latest 8efe422e6104 210 MB
下載鏡像
如果我們想要在本地運行容器,就必須保證本地存在對應的鏡像。所以,第一步,我們需要下載鏡像。當我們嘗試下載鏡像時,Docker 會嘗試先從默認的鏡像倉庫Docker Hub
去下載,當然了,用戶也可以自定義配置想要下載的鏡像倉庫。
下載鏡像
鏡像是運行容器的前提,我們可以使用 docker pull[IMAGE_NAME]:[TAG]
命令來下載鏡像,其中 IMAGE_NAME
表示的是鏡像的名稱,而 TAG
是鏡像的標簽,也就是說我們需要通過 鏡像 + 標簽 的方式來下載鏡像。
注意: 您也可以不顯式地指定 TAG, 它會默認下載
latest
標簽,也就是下載倉庫中最新版本的鏡像。這里並不推薦您下載 latest 標簽,因為該鏡像的內容會跟蹤鏡像的最新版本,並隨之變化,所以它是不穩定的。在生產環境中,可能會出現莫名其妙的 bug,推薦您最好還是顯示的指定具體的 TAG。
舉個例子,如我們想要下載一個 Mysql 5.7
鏡像,可以通過命令來下載:
docker pull mysql:5.7
當有 Downloaded 字符串輸出的時候,說明下載成功了!!
驗證
讓我們來驗證一下,本地是否存在 Mysql5.7
的鏡像,運行命令:
docker images
docker image ls --all
可以看到本地的確存在該鏡像,確實是下載成功了!
Docker 通過前綴地址的不同,來保證不同倉庫中,重名鏡像的唯一性。
PULL 子命令
命令行中輸入:
docker pull --help
我們可以看到主要支持的子命令有:
-a,--all-tags=true|false
: 是否獲取倉庫中所有鏡像,默認為否;--disable-content-trust
: 跳過鏡像內容的校驗,默認為 true;
查看鏡像信息
列出鏡像
通過使用如下兩個命令,列出本機已有的鏡像:
docker images
docker image ls
λ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wiznote/wizserver latest 9f3a85de84a7 4 weeks ago 2.55GB
字段解釋:
- REPOSITORY:來自於哪個倉庫
- TAG:鏡像的標簽信息,比如 5.7、latest 表示不同的版本信息
- IMAGE ID:鏡像的 ID, 如果您看到兩個 ID 完全相同,那么實際上,它們指向的是同一個鏡像,只是標簽名稱不同罷了
- CREATED:鏡像最后的更新時間
- SIZE:鏡像的大小,優秀的鏡像一般體積都比較小,這也是我更傾向於使用輕量級的
alpine
版本的原因
注意:鏡像大小信息只是
邏輯上
的大小信息,因為一個鏡像是由多個鏡像層layer
組成的,而相同的鏡像層本地只會存儲一份,所以,真實情況下,占用的物理存儲空間大小,可能會小於邏輯大小。
為鏡像添加標簽
通常情況下,為了方便在后續工作中,快速地找到某個鏡像,我們可以使用 docker tag
命令,為本地鏡像添加一個新的標簽。
λ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wiznote/wizserver latest 9f3a85de84a7 4 weeks ago 2.55GB
λ docker tag wiznote/wizserver:latest wiz_bqt:2021.01.22
λ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wiz_bqt 2021.01.22 9f3a85de84a7 4 weeks ago 2.55GB
wiznote/wizserver latest 9f3a85de84a7 4 weeks ago 2.55GB
可以看到,本地多了一個 wiz_bqt:2021.01.22
的鏡像,並且其和 wiznote/wizserver:latest
的鏡像 ID 是一模一樣的,說明它們是同一個鏡像,只是別名不同而已。
docker tag
命令功能更像是, 為指定鏡像添加快捷方式一樣。
查看鏡像詳細信息
通過 docker inspect
命令,我們可以獲取鏡像的詳細
信息,其中,包括創建者,各層的數字摘要等。
docker inspect wiznote/wizserver:latest
docker inspect
返回的是 JSON
格式的信息,如果您想獲取其中指定的一項內容,可以通過 -f
來指定,如獲取鏡像大小:
docker inspect -f {{".Size"}} wiznote/wizserver:latest
查看鏡像歷史
前面的小節中,我們知道了,一個鏡像是由多個層layer
組成的,那么,我們要如何知道各個層的具體內容呢?
通過 docker history
命令,可以列出各個層的創建信息:
λ docker history wiznote/wizserver:latest
IMAGE CREATED CREATED BY SIZE COMMENT
9f3a85de84a7 4 weeks ago /bin/sh -c #(nop) CMD ["bash" "/wiz/app/ent… 0B
<missing> 4 weeks ago /bin/sh -c rm -rf /wiz/scripts 0B
<missing> 4 weeks ago /bin/sh -c #(nop) COPY dir:301e72c63979d9907… 350MB
<missing> 4 weeks ago /bin/sh -c #(nop) COPY dir:ac1a83721450cb93f… 249kB
<missing> 3 months ago /bin/sh -c bash /wiz/scripts/buildProdScript… 1.89GB
<missing> 3 months ago /bin/sh -c #(nop) COPY dir:250434bb223ccf67b… 102MB
<missing> 3 months ago /bin/sh -c #(nop) ENV PKG_CONFIG_PATH=/usr/… 0B
<missing> 3 months ago /bin/sh -c #(nop) ENV PATH=/wiz/server/node… 0B
<missing> 3 months ago /bin/sh -c #(nop) MAINTAINER support@wiz.cn 0B
<missing> 17 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 17 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 17 months ago /bin/sh -c #(nop) ADD file:4e7247c06de9ad117… 202MB
可以看到,上面過長的信息,為了方便展示,后面都省略了,如果您想要看具體信息,可以通過添加 --no-trunc
選項,如下面命令:
docker history --no-trunc wiznote/wizserver:latest
搜索鏡像
您可以通過docker search
命令進行搜索:
docker search [option] keyword
比如,您想搜索倉庫中 mysql
相關的鏡像,可以輸入如下命令:
docker search mysql
search
支持的子命令有:
-f,--filter filter
: 過濾輸出的內容--limitint
:指定搜索內容展示個數--no-index
: 不截斷輸出內容--no-trunc
:不截斷輸出內容
舉個列子,比如我們想搜索官方提供的 mysql 鏡像,命令如下:
λ docker search --filter=is-official=true mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10380 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3848 [OK]
percona Percona Server is a fork of the MySQL relati… 519 [OK]
再比如,我們想搜索 Stars 數超過 100 的 mysql 鏡像:
docker search --filter=stars=100 mysql
刪除鏡像
通過標簽刪除鏡像
通過如下兩個都可以刪除鏡像:
docker rmi [image]
docker image rm [image]
支持的子命令如下:
-f,-force
: 強制刪除鏡像,即便有容器引用該鏡像-no-prune
: 不要刪除未帶標簽的父鏡像
例如,我們想刪除上章節創建的 wiz_bqt:2021.01.22
鏡像,命令如下:
λ docker rmi wiz_bqt:2021.01.22
Untagged: wiz_bqt:2021.01.22
從上面章節中,我們知道 wiz_bqt:2021.01.22
和 wiznote/wizserver:latest
實際上指向的是同一個鏡像,那么,您可以能會有疑問,我刪除了其中一個鏡像,會不會將另一個鏡像也給刪除了?
實際上,當同一個鏡像擁有多個標簽時,執行 docker rmi
命令,只是會刪除了該鏡像眾多標簽中,您指定的標簽
而已,並不會影響原始的那個鏡像文件。
但是,如果某個鏡像不存在多個標簽,當且僅當只有一個標簽時
,執行刪除命令時,您就要小心了,這會徹底刪除鏡像
。
通過 ID 刪除鏡像
除了通過標簽名稱來刪除鏡像,我們還可以通過制定鏡像 ID, 來刪除鏡像,如:
docker rmi ee7cbd482336
一旦指定了通過 ID 來刪除鏡像,它會先嘗試刪除所有指向該鏡像的標簽
,然后在刪除鏡像本身。
刪除鏡像的限制
刪除鏡像很簡單,但也不是我們何時何地都能刪除的,它存在一些限制條件。
當通過該鏡像創建的容器未被銷毀時,鏡像是無法被刪除的。
為了驗證這一點,我們來做個試驗。首先,我們通過 docker pull alpine
命令,拉取一個最新的 alpine
鏡像, 然后啟動鏡像,讓其輸出 hello,docker!
:
λ docker run alpine echo 'hello, docker!'
'hello, docker!'
接下來,我們來刪除這個鏡像試試:
λ docker rmi alpine
Error response from daemon: conflict: unable to remove repository reference "alpine" (must force) - container f20b252c08ce is using its referenced image 7731472c3f2a
可以看到提示信息,無法刪除該鏡像,因為有容器正在引用他!同時,這段信息還告訴我們,除非通過添加 -f
子命令,也就是強制刪除,才能移除掉該鏡像!
docker rmi -f alpine
但是,我們一般不推薦這樣暴力的做法,正確的做法應該是:先刪除引用這個鏡像的容器,再刪除這個鏡像。
也就是,根據上圖中提示的,先對引用該鏡像的容器f20b252c08ce
執行刪除命令,然后再執行刪除鏡像的命令:
docker rm f20b252c08ce
docker rmi alpine
這個時候,就能正常刪除了!
清理鏡像
我們在使用 Docker 一段時間后,系統一般都會殘存一些臨時的、沒有被使用的鏡像文件,可以通過以下命令進行清理:
docker image prune
它支持的子命令有:
-a,--all
: 刪除所有沒有用的鏡像,而不僅僅是臨時文件-f,--force
:強制刪除鏡像文件,無需彈出提示確認
導出 & 加載鏡像
通常我們會有下面這種需求,需要將鏡像分享給別人,這個時候,我們可以將鏡像導出成tar
包,別人直接通過加載這個 tar 包,快速地將鏡像引入到本地鏡像庫。
導出鏡像
例如,我們想要將 alpine
鏡像導出來,執行命令:
docker save -o alpine_bqt.tar alpine:latest
執行成功后,查看當前目錄,可以看到 alpine_bqt.tar
鏡像文件已經生成。接下來,你可以將它通過復制的方式,分享給別人了!
加載鏡像
別人拿到了這個 tar
包后,可以通過執行如下兩種命令導入到本地的鏡像庫:
docker load -i alpine_bqt.tar
docker load < alpine_bqt.tar
導入成功后,查看本地鏡像信息,你就可以獲得別人分享的鏡像了!
2020-06-04