泡泡Docker樂園,帶你進入Docker的狂歡派對
簡介:泡泡機器人的新欄目【泡泡Docker樂園】旨在為大家提供包裝好配置系統和運行環境的Docker Image項目,主要覆蓋機器人SLAM和深度學習領域。本期我們主要為大家帶來一份熱騰騰的Docker實戰教程,主要介紹Docker的主要功能和使用場合,以及分享常見的命令。最後我們附上本欄目第一個Docker Image項目,用於雙目視覺視差估計的FADNet。
編譯:王強
審核:邱笑晨,吳奇,劉富強
歡迎個人轉發朋友圈;其他機構或自媒體如需轉載,後臺留言申請授權
前言
本教程旨在為Docker新手開發者提供一個易於上手和操作的手冊,同時也可以作為cheat list方便查詢。Docker技術具備即插即用、管理方便、安全性高等優點,一般而言Docker下的image系統跟宿主機系統在類型和版本可以允許不同,類似於虛擬機的獨立隔離屬性,但它比傳統的虛擬機更加輕量,運行性能和效率更好。
在這個文檔中,我們主要會覆蓋以下幾個比較常見的使用場景和開發流程:
(1) 初始化base image。通常是將dockerhub上已有的集成image拉到本地做二次開發。
(2) 啟動和管理container。container是image的實例。通常我們可以通過實例化一個container後進入並做二次開發。
(3) 製作和提交image。當我們將需要的環境,包括代碼、運行庫、系統組件依賴等集成到container實例後,我們可以將它製作為image,並發布到dockerhub上,既可以進行項目版本的維護,又可供他人學習和使用。
一般來說,掌握了以上基本流程已能夠支持普通開發者的需求。如有更高級的開發需求請讀者自行查閱官方資料。
初始化base image
目前dockerhub已有第三方開發者(大部分是企業和研究機構)發布了大量image,這些image作為基礎開發環境和組件一般來說已足夠完善。普通開發者可以通過拉取(pull)已有的image並在上面做二次開發,以下是一些例子。
Ubuntu系統官方鏡像:
https://hub.docker.com/_/ubuntu?tab=tags
PyTorch深度學習環境鏡像:
https://hub.docker.com/r/pytorch/pytorch/tags
我們可以發現大部分項目有多個tags,這個類似於github的tags概念,主要就是區別於同一項目下的不同分支和版本。
(C1)拉取(pull)鏡像的命令為:
$ - docker pull
$USER_ID/$IMAGE_NAME:$TAG
其中,$USER_ID是發布項目的用戶名或者組織名,是一個可選項,通常我們以用戶的ID或者組織ID進行命名。$IMAGE_NAME是項目名稱,是必選項。$TAG是版本名稱,默認為latest。
(C2)以Ubuntu為例,我們將它的image拉取下來:
$ - docker pull ubuntu
我們可以看到這裡ubuntu是鏡像名,沒有用戶名,這裡的tag是latest,等同於ubuntu:latest。
(C3)我們也嘗試拉取pytorch的1.4版本,支持cuda10.1和cudnn7:
$ - docker pullpytorch/pytorch:
1.4-cuda10.1-cudnn7-devel
我們可以看到這裡的組織名是pytorch,項目名稱也是pytorch,tag是1.4-cuda10.1-cudnn7-devel。一般我們可以看到這些組織為同一項目創建了不同版本的image,以適配用戶的開發需求。
通過命令「docker images」,便可以看到拉下來的image:
啟動和管理container
當我們把需要的鏡像拉下來之後,我們便可以通過以下的命令創建新的container並進入其中。
(C4)這裡我們以創建一個有Ubuntu 16.04核心系統組件的container為例:
$ - docker run -it --name=base_ubuntu
ubuntu:16.04 /bin/bash
這裡-it和--name都是啟動container時的可選參數。-it指的是啟動container後進入交互模式。如果在這裡使用的是-itd的話,啟動的container會進入後臺守護模式,可以理解為一個後臺伺服器,一般是用於部署一些web service,配置好帳戶的話也可以通過ssh命令進入該container。--name是指定container的名字,這裡我們使用base_ubuntu,不指定的情況下系統會隨機指定一些單詞組成的名字。之後,我們會緊跟著用於創建container的image名稱,這裡是ubuntu:16.04,指的是使用ubuntu這個image下tag為16.04的版本。如果系統找不到指定的image名稱,系統會嘗試搜索dockerhub並拉取。最後接著的是進入container後執行的指令,這裡我們是啟動默認的/bin/bash命令行交互。
我們可以看到,我們在container中的用戶名是root,默認進入的是系統的根目錄。在該容器中,我們擁有root權限,可以對container中的內容進行任意的修改,且不會影響到宿主機,一定程度上解決了很多開發者由於沒有root權限帶來的不便。
之後,我們便可以在這個container裡面進行環境配置以及正常的開發工作,如下,我們簡單使用ubuntu的apt安裝了vim和git,一般我們需要先使用apt update更新庫內容。
另外,如果要退出container到宿主機,命令是ctrl+p+q,這樣退出後container仍然在後臺運行,而且修改內容得以保存。而如果通過ctrl+d或直接在系統敲打exit命令亦可退出,但需要注意此時container會被stop,且之前的修改內容會全部撤銷不會生效,這點需要萬分注意。退出container後我們可以通過docker ps -a命令來查看所有的container。
可以看到我們的container仍在運行,且有著唯一的container id。
(C5)如要刪除這個container,則使用以下命令:
$ - docker stop $CONTAINER_ID
$ - docker rm $CONTAINER_ID
這裡首先我們需要先用stop命令來停止container的運行,之後再使用rm命令來刪除container。操作container時,可以通過container id或者container的名稱來指定對象。
製作和提交image
接下來,我們就要將我們配置好的container製作為新的image並進行提交。
(C6)我們通過以下命令來實現這一操作:
$ - docker commit -m="$MESSAGE"
-a="AUTHOR"
$CONTAINER_ID $USER_ID/$IMAGE_NAME:$TAG
其中,-m和-a是可選函數,類似於github的-m和-a,主要就是用於加入更新日誌和作者信息。之後我們需要指定用於製作image的container id,最後是image的名稱,與之前的類似,一般也是需要用戶名,鏡像名稱和tag。
(C7)當然,如果你想修改container的版本號或者名字,也可以用以下命令:
$ - docker tag $OLD_NAME $NEW_NAME
其中的old_name便是舊的鏡像名稱(需包括全名和tag),new_name是新的鏡像名稱。這樣,我們便可以使用docker images查看我們製作好的鏡像。
接著就是最激動人心的一刻,提交自己的鏡像,首先,你需要在dockerhub建立一個你的個人帳號,比如筆者的是blackjack2015:
然後,我們需要在dockerhub創建一個新的repository,即一個新的項目,這裡我們創建base_ubuntu。在界面上,我們也可以看到dockerhub會有一些上傳鏡像的命令提示。
一般來說,dockerhub會默認項目的用戶名是用戶的帳戶名稱(這裡是blackjack2015),後面緊跟著base_ubuntu。這樣創建的項目,全網就會用blackjack2015/base_ubuntu來定位到這個項目。
接著,我們需要在本地登陸我們的帳號,通過docker login進行登陸。
我們假設本地即將上傳的項目名稱也是blackjack2015/base_ubuntu:latest(必須與dockerhub創建的相同)。
(C8)我們通過以下命令將我們本地的該項目提交上去:
$ - docker push
blackjack2015/my_ubuntu:latest
我們便可以把我們的項目上傳到dockerhub上,由於同一項目可以有不同的tag,也就方便我們進行不同版本image的維護,上傳時也可以上傳同一項目的不同tag分支。
FADNet項目鏡像
最後,我們為小夥伴們帶來本期的,也是該欄目第一個推薦的Docker項目——FADNet。
簡介:這個項目是ICRA2020年一篇做雙目視覺深度估計文章的項目代碼。它僅使用2D卷積網絡就可以在準確率上跟主流的3D卷積網絡媲美,且在推理速度上比3D卷積網絡快10倍以上。作者也將幾個做相同方向的深度網絡(DispNet系列,PSMNet,GANet)做了集成,便於復現和比較。
連結:
https://hub.docker.com/repository/docker/paopaorobot/fadnet
簡易上手:
請先注意看項目的Readme,了解需要的硬體配置哦!
(1)啟動container($是用戶設定的數據目錄):
$ - docker run --runtime=nvidia -it
-v $:/data --ipc=host
--name=fadnet
paopaorobot/fadnet:v1 /bin/bash
(2)啟動訓練腳本:
$ - cd /root/FADNet
$ - dnn=fadnet ./train.sh
如果你對本文感興趣,想要下載完整文章進行閱讀,可以關注【泡泡機器人SLAM】公眾號。