基於docker的caffe環境搭建與使用示例

0. 引言

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的 Linux 機器上。因此,Docker給應用提供了一個從開發到上線均一致的代碼環境,讓代碼的流水線變得簡單不少。

以下是基於docker的caffe環境搭建過程,並給出使用示例。

1. 安裝Docker

Docker的安裝可以參考官方文檔:
https://docs.docker.com/engine/installation/linux/ubuntulinux/
本文安裝的時候選擇了Ubuntu 14.04的版本。

2. 基於Docker安裝Caffe

在caffe官網上已經提供了創建caffe鏡像所需的Dockerfile,並且在docker hub上也能找到:https://hub.docker.com/r/elezar/caffe/
1) 通過以下命令即可在本地創建caffe鏡像:

$ docker pull elezar/caffe:cpu

注意,如果要創建GPU版本,則將上述命令中的cpu改成gpu。

2) 下載完成後,測試是否安裝正確。
輸入:

$ docker run -ti elezar/caffe:cpu caffe --version

會看到如下輸出,說明安裝成功:

libdc1394 error: Failed to initialize libdc1394
caffe version 1.0.0-rc3

也可以輸入:

$ docker images

可以看到本地多了一個caffe鏡像。
這裏寫圖片描述

3. Docker下caffe的使用

3.1 在交互模式下運行caffe容器:

$ sudo docker run -t -i elezar/caffe:cpu /bin/bash
  • docker run 運行一個容器
  • -t 分配一個(僞)tty (link is external)
  • -i 交互模式 (so we can interact with it)
  • elezar/caffe:cpu 使用 elezar/caffe:cpu 鏡像創建容器
  • /bin/bash 運行命令 bash shell

這時我們就可以發現我們已經進入了剛剛創建的容器中,hostname已經變成root@c5f24e953610,其中@後面的這一串數字是當前容器的ID。搭建好的caffe文件夾在/opt/caffe/目錄下:
這裏寫圖片描述
然後就可以正常使用了。

3.2 以mnist爲例,獲取mnist數據:

$ cd /opt/caffe/data/mnist/
$ ./get_mnist.sh

可以看到當前目錄下生成了新的mnist數據:
這裏寫圖片描述

是不是和直接在linux系統上使用caffe完全一樣呢?是的,通過交互模式的設定,在docker的容器中使用caffe就和直接在linux系統上一樣一樣滴~~當然,還是有不一樣的地方,請看下回分解 ↓↓↓

3.3 容器中數據如何保存

按ctrl+D 或 exit 退出當前容器。
退出後,如果你想重新使用之前的容器,可以通過以下命令重啓,回到之前的狀態:

$ docker start container_ID
$ docker attach container_ID

另外要注意,如果你新運行caffe鏡像的一個容器,你會發現在之前那個容器中生成的數據都沒有啦!

要理解這一點,首先我們需要知道Docker的文件系統是如何工作的。Docker鏡像是由多個文件系統(只讀層)疊加而成。當我們啓動一個容器的時候,Docker會加載只讀鏡像層並在其上添加一個讀寫層。如果運行中的容器修改了現有的一個已經存在的文件,那該文件將會從讀寫層下面的只讀層複製到讀寫層,該文件的只讀版本仍然存在,只是已經被讀寫層中該文件的副本所隱藏。當刪除Docker容器,並通過該鏡像重新啓動時,之前的更改將會丟失。(在Docker中,只讀層及在頂部的讀寫層的組合被稱爲Union File System,聯合文件系統)。

那麼如何保存這種修改呢?有兩種方式,一種是通過docker commit來擴展一個新的image,另一種是通過docker volume,繞過默認的聯合文件系統,將更改的文件以正常的文件或者目錄的形式保存於宿主機上。

3.3.1 docker commit

$ docker commit c5f24e953610 mycaffe

其中c5f24e953610是我們之前所使用容器的ID,可以通過docker ps -a查看;mycaffe是新生成的鏡像的名稱。
這時候我們再使用docker images命令查看現有鏡像,發現除了原始的elezar/caffe外,還多了一個名爲mycaffe的鏡像,即爲我們剛創建的鏡像:
這裏寫圖片描述
如果我們現在爲mycaffe創建一個容器,並查看data/mnist/目錄,就會發現之前生成的mnist數據存在了,說明容器中的數據被我們保存下來了:

$ docker run -ti mycaffe /bin/bash
$ cd /opt/caffe/data/mnist/
$ ls

這裏寫圖片描述

3.3.2 docker Volume

要實現主機和容器之間的數據交互,需要通過docker Volume來完成。
首先在主機中創建一個用於存儲數據的文件夾,並在其中新增一個文件作爲測試:

$ mkdir dockerData
$ cd dockerData
$ touch test-file

這裏寫圖片描述

然後將該文件夾掛載到新的容器中,在運行時使用-v來聲明Volume:

$ docker run -ti -v /home/elaine/dockerData:/dockerData elezar/caffe:cpu

以上命令會將主機中的/home/elaine/dockerData目錄掛載到容器中的/dockerData目錄下,這樣我們就可以在容器中看到這個目錄了,並且可以看到我們事先存放的test-file:
這裏寫圖片描述

我們可以在主機上直接操作該目錄,比如在主機上再增加一個文件,我們也可以馬上在容器中看到變化:
這裏寫圖片描述

我們也可以在容器中給這個目錄添加數據,如caffe訓練後的model等,任何在/dockerData路徑的文件都可以在主機中訪問到。

3.4 附:Docker刪除指令

//刪除指定容器
$ docker rm container_ID/name
//刪除所有已經停止的容器
$ docker rm $(docker ps -a -q)
//刪除指定鏡像
$ docker rmi image_name

reference:

[1] Docker Docs
[2] 非常詳細的 Docker 學習筆記
[3] 深入理解Docker Volume(一)
[4] 深入理解Docker Volume(二)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章