假如伺服器上沒有 Docker 環境,你還能愉快的拉取容器鏡像嗎?

  • 2019 年 11 月 28 日
  • 筆記

你是否曾經遇到過需要在沒有安裝任何 Docker 客戶端的機器上拉取容器鏡像這樣變態的需求呢?如果有,你當時又是如何解決的呢?今天我們就來給大家介紹幾種另闢蹊徑的方法來實現這樣的需求。

使用 docker-drag 實現

根據官網介紹:docker-drag 是一個用於與 Docker Hub 交互的工具,並且不需 Docker 客戶端本身支援。它主要是通過與 Docker HubHTTPS API 進行交互來實現相應功能。

項目地址:https://github.com/NotGlop/docker-drag

安裝 docker-drag

docker-drag 其實就是一個 Python 腳本,目前版本總共才 168 行程式碼。你只需要去官網倉庫直接下載就可以使用了,非常的簡單。

$ wget https://raw.githubusercontent.com/NotGlop/docker-drag/master/docker_pull.py

使用 docker-drag

我們先來看一下官方給出的演示效果。

docker-drag 的使用也是非常簡單的,基本上和 docke pull 命令使用方法一致。其主要是藉助 PythonRequest 庫和 HTTPS API 直接從倉庫中拉取鏡像,並保存為 TAR 文件。

# 直接在官方倉庫拉取官方鏡像  $ python docker_pull.py nginx:alpine    # 直接在官方倉庫拉取三方鏡像  $ python docker_pull.py mysql/mysql-server:8.0    # 直接在三方倉庫拉取鏡像  $ python docker_pull.py mcr.microsoft.com/windows/nanoserver@sha256:ae443bd9609b9ef06d21d6caab59505cb78f24a725cc24716d4427e36aedabf2

鏡像下載完成後,你可以直接使用 docker load -i 命令對 TAR 文件進行載入。由於不在依賴容器工具本身,在一些實際使用場景中,例如:CICD 流程。這個小工具或許能助你解決大問題喲!

使用 download-frozen-image-v2 實現

docker-drag 類似的工具,還有一個 SHELL 腳本的實現 download-frozen-image-v2,該腳本隸屬於 Moby 項目。

項目地址:https://github.com/moby/moby

它的使用基本上和 docker-drag 類似,大致有如以下幾步所示。

  1. 下載對應的腳本
$ wget https://raw.githubusercontent.com/moby/moby/master/contrib/download-frozen-image-v2.sh
  1. download-frozen-image-v2 腳本使用語法
download-frozen-image-v2.sh target_dir image[:tag][@digest] ...
  1. 一個完整的使用實例
# 下載 Ubuntu 容器鏡像  $ bash download-frozen-image-v2.sh ubuntu ubuntu:latest    # download-frozen-image-v2 這裡要稍為複雜點,需要自己手動打成 TAR 包  $ tar -C 'ubuntu' -cf 'ubuntu.tar' .    # 導入容器鏡像  $ docker load -i ubuntu.tar    # 導入容器鏡像完成後,運一個容器  $ docker run --rm -ti ubuntu bash  root@1dd5e62113b9:/#

使用 dp 實現

dp 同樣也是一個實現上述類似需求的小工具。dp 使用 Go 語言開發,天生具有良好的跨平台性。相對於前兩個工具來說更容易在多平台上部署使用,而且 dp 還支援將多個鏡像打包在一起。

項目地址:https://github.com/zhangguanzhang/dp/

安裝 dp

dp 的安裝非常簡單,只需在官方倉庫 Releases 頁面直接下載各平台對應的版本,解壓後即可使用。

使用 dp

dp 使用起來也是很容易的,下面我們就來看幾個實例。

# 從官方倉庫拉取一個容器鏡像  $ dp pull nginx:alpine    # 從官方倉庫拉取一個容器鏡像並打包到壓縮文件  $ dp pull -o nginx.tar.gz nginx:alpine    # 使用 sha256 拉取一個容器鏡像  $ dp pull mcr.microsoft.com/windows/nanoserver@sha256:ae443bd9609b9ef06d21d6caab59505cb78f24a725cc24716d4427e36aedabf2    # 一次從官方倉庫拉取多個容器鏡像並打包到壓縮文件  $ dp pull -o project.tar.gz nginx:alpine nginx:1.17.5-alpine-perl    # 從三方鏡像倉庫拉取多個容器鏡像並打包到壓縮文件  $ dp pull -o project.tar.gz nginx:alpine gcr.io/google_containers/pause-amd64:3.1

至此,我們就演示完了如何在不需要 Docker 客戶端的前提下拉取容器鏡像的方法。如果你還有更多更好的方法,歡迎大家積極留言喲!

參考文檔

  1. https://www.google.com
  2. https://xbuba.com/questions/37905763
  3. https://blog.fleeto.us/post/pull-image-without-docker/