【泡泡Docker樂園】手把手帶你走進Docker世界

2020-12-13 騰訊網

泡泡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】公眾號

相關焦點

  • 雲計算核心技術Docker教程:Docker Swarm 使用
    以下示例,均以 Docker Machine 和 virtualbox 進行介紹,確保你的主機已安裝 virtualbox。docker@swarm-manager:~$ docker service create --replicas 1 --name helloworld alpine ping docker.com查看 helloworld 服務運行在哪個節點上,可以看到目前是在 swarm-worker1 節點:
  • Docker 入門教程
    一、Docker的優點1.簡化配置虛擬機的最大好處是能在你的硬體設施上運行各種配置不一樣的平臺(軟體, 系統), Docker在降低額外開銷的情況下提供了同樣的功能.它能讓你將運行環境和配置放在代碼匯總然後部署, 同一個Docker的配置可以在不同的環境環境中使用, 這樣就降低了硬體要求和應用環境之間耦合度.2.代碼流水線管理代碼從開發者的機器到最終在生產環境上的部署, 需要經過很多的中堅環境.
  • docker下高並發和高可用之docker swarm使用
    ,操作步驟參考Linux下安裝和使用Docker安裝完,使用命令sudo systemctl start docker啟動docker,再通過命令docker version查看docker版本信息利用docker swarm 命令來指定其中一臺虛擬機為docker的Manager管理機docker swarm init --advertise-addr
  • 雲計算核心技術Docker教程:docker-compose build/pull命令介紹
    在下載安裝Docker Compose後通過創建 Dockerfile 文件就可以使用Docker Compose命令構建和啟動應用了,本文主要介紹docker-compose命令格式:docker-compose pull [options] [SERVICE...]拉取服務依賴的鏡像。
  • Docker 容器的網絡
    如果你通過 Docker 提供的用戶指南,你應該已經完成了構建你的第一個 Docker 容器,並且運行了示例應用。你已經構建了你自己的鏡像(images)。本部分的內容將會指導你如何對你的容器進行網絡配置。
  • Docker-compose實戰
    各位小夥伴們,我們前面的篇文章分享了、docker的基礎知識點、如何編寫一個Dockerfile、docker網絡是怎麼回事、如何編寫docker-compose.yml文件。已經為本文做好了充分的鋪墊。那麼這邊文章就和小夥本們分享如何將你自己的微服務項目進行服務的編排。
  • 雲計算核心技術Docker教程:Docker Compose的restart和rm命令詳解
    Docker-Compose restart命令可以重新啟動所有已停止並正在運行的服務,Docker-Compose rm命令可以刪除已經停止的容器,如果服務在運行,需要先docker-compose stop 停止容器。
  • 雲計算核心技術Docker教程:Docker 守護進程dockerd的LCOW選項
    例C:\> dockerd --storage-opt lcow.kirdpath=c:\path\to\fileslcow.kernel指定位於lcow.kirdpath路徑中的內核文件的文件名。默認為bootx64.efi。
  • 雲計算核心技術Docker教程:Docker Compose指定單個compose文件
    docker-compose可以使用該-f標誌通過命令行或通過在外殼程序或環境文件中設置COMPOSE_FILE環境變量來指定不在當前目錄中的Compose文件的路徑。
  • 雲計算核心技術Docker教程:docker-compose命令up,run以及start...
    通常,您需要docker-compose up。使用up啟動或重新啟動所有定義的服務docker-compose.yml。該docker-compose up命令匯總每個容器的輸出(本質上是docker-compose logs -f)。當命令退出時,所有容器都將停止。
  • 雲計算核心技術Docker教程:Docker Compose的pull和push命令詳解
    Docker-Compose pull命令可以拉取docker-compose.yml或者docker-stack.yml文件中定義的服務關聯的鏡像,Docker-Compose push命令可以將服務鏡像推送到registry/repository中。
  • 微服務部署到docker中
    可以看到項目根目錄下新增一個名為Dockerfile的文件6.通過Xftp將項目從Windows下的磁碟位置拷貝到Linux的root目錄下二、Linux下通過Docker構建應用1.通過Xshell連接上Linux虛擬機,進入到項目目錄下,然後通過docker
  • 樹莓派嘗試玩兒Docker虛擬機
    會出現莫名其妙的bug,如果你無所謂,那麼請自便。。哈哈Docker CE 不僅支持 x86_64 架構的計算機,同時也支持 ARM 架構的計算機,本小節內容以樹莓派為例講解 ARM 架構安裝 Docker CE。
  • Docker常用命令就該這麼學!
    /linux/centos/docker-ce.repo 1.3:安裝Docker (1)yum makecache fast (2)yum -y install docker-ce 1.4:啟動並設置為開機自動啟動
  • Docker 創建你自己的橋接網絡
    下面的例子顯示了如何創建一個橋接網絡:$ docker network create -d bridge my_bridge參數 -d 用於告訴 Docker 在新的網絡中使用橋接(bridge)驅動。
  • Windows下通過DockerToolbox安裝Docker
    想要在Windows下安裝Docker,首先需要檢查你當前的windows系統是否符合要求,為了運行Docker,你的機器必須是windows7或以上版本的64位系統。13、在命令行中我們輸入命令docker run hello-world並按回車鍵,如果docker配置成功的話,我們將會看到命令行中輸出信息,如下圖所示:
  • 快速把你拉入Docker 的門裡|原力計劃
    作者 | 桌前明月責編 | 夕顏前言學習一門東西你要先搞懂怎麼使用它。以及使用它的一些操作用語。就好比你去駕校學車,教練首先給你講這個是方向盤、這個是油門、這個是剎車一定要記住,關鍵時刻可以保命。然後開始教你怎麼讓車啟動並慢慢跑起來。
  • 雲計算核心技術Docker教程:rm/rmi命令詳解
    在docker客戶端命令行中我們可以使用rm刪除一個或多個容器,使用rmi刪除本地一個或多少鏡像。示例:docker rm :刪除一個或多個容器。例如,強制刪除容器 db01、db02,命令如下:$ docker rm -f db01 db02移除容器 nginx01 對容器 db01 的連接,連接名 db:$ docker rm -l db刪除容器
  • 阿里華為Dockerfile命令規範及最佳實踐
    有以下倆種格式:Shell格式RUN apt-get install -y vimCMD echo "hello docker"ENTRYPOINT echo "hello docker"Dockerfiledocker build -t javaedge/centos-shell
  • 雲計算核心技術Docker教程:pull/push命令詳解
    來源:TechWeb.com.cn在docker客戶端命令行中我們可以使用pull從鏡像倉庫中拉取或者更新指定鏡像,使用push將本地的鏡像上傳到鏡像倉庫。示例:docker pull : 從鏡像倉庫中拉取或者更新指定鏡像語法:docker pull [OPTIONS] NAME[:TAG|@DIGEST]OPTIONS說明: