Pete, Moore, Fields 等人依照前天 Cash 給的 Docker 快速入門,依樣畫葫蘆,大家發現幾個問題,是必須注意的:
Gavin 訝異 docker 似乎沒有安全機制,Cash 解釋 docker 基本上不是 VM,在生產環境下,會搭配其他的機制管理,我們還處在做練習階段,先不理會安全機制。
大家討論了一下,port 大家就依之前協議 分配 port,命名在後面加上自己的英文名子,例如 Pete 要啟動 Mxnet
docker run -t -i --runtime=nvidia \
-p 8588:8888 -p 6506:6006 \ #協議Pete用85xx Port,但是docker內部可維持Jupyter 8888
--name=mxnet_pete \ #命名加 『_NAME』
-v ~:/media \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
--workdir /media \
mxnet/python:1.3.0_gpu_cu92_py3 \
bash
對了忘記講為何有兩個 port 需要暴露給外面呢?那是因為 Jupyter 預設用8888;而許多機器學習(例如 mxnet)長達幾天甚至術週訓練過程的,會採用 Tensorflow 提供的 Tensorboard來呈現進展。而Tensorboard預設的 port 是 6006。我們假設都不改變預設 port,要避開衝突是由 -p 這個參數來進行。
如果要建立新的 image,其後標籤就採用英文名,例如:
docker commit mxnet_pete mxnet:pete
這樣幾個人共用 Server 的 GPU 就可以避免衝突。
另外在docker因為是相當精簡的Linux,會遇到一些便利性的問題,Cash 請大家嘗試連上自己的docker container後,如同連到 Ubuntu Server 做一些設定
docker start -i mxnet_pete
apt update
apt install nano #預設 docker container沒有vi, nano 等編輯軟體, 所以必須安裝
nano .bash_aliases #可參考 https://ithelp.ithome.com.tw/articles/10203114
alias py36='source activate py36'
alias py27='source activate py27'
alias deactivate='source deactivate'
另外 Pete 馬上想到,如果自己辛苦設定好的 image 是否可以給其他Server 的同事用, Cash 請大家連到 hub.docker.com ,如果沒有機密的問題,可以考慮先註冊一個帳號,比方說是tsoftpete,然後
export DOCKER_ID_USER="tsoftpete” #後續在 docker hub 是以 tsoftpete 帳號進行, 可加進 .bashrc
docker login
docker tag IMAGE_NAME $DOCKER_ID_USER/IMAGE_NAME
docker push $DOCKER_ID_USER/IMAGE_NAME #要上傳數百MB, 甚或數GB
這樣全世界都可以拉下來使用。
docker pull tsoftpete/IMAGE_NAME #或者用下方指令直接啟動
docker run -t -i … … tsoftpete/IMAGE_NAME bash
如果Image裡內含有機密問題,可以採用一些商業方案,我們以後有用到再談。
另外也可考慮採用
docker export CONTAINER_NAME > CONTAINER_NAME.tar
拿到其他機器後導入
docker import CONTAINER_NAME.tar
docker images #查看新導入的 image id
docker tag IMAGE_ID NEW_IMAGE_NAME:TAG #給予新的 image 名稱
以上的指令都可以在官網查到細節。
Fields 說他觀察到許多在github上公開的框架都有看到 Dockerfile , 感覺很像 Conda 的 environment 檔案,都是用來製作一個新的開發環境。Cash 也覺得這對要製作給團隊一個標準環境來講,藉由編寫一個 Dockerfile 再發布給其他人,是很有效率的作法,不過要講解其內部指令要花一點時間,等大家對 docker 使用熟練後再詳談會比較有幫助。
專案緣起記錄在 【UP, Scrum 與 AI專案】