Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

認識那條鯨魚 Docker 初探

2,553 views

Published on

介紹 PyCV-time / TechTree
docker 操作基本功
在 docker container 中使用 GUI 介面 / webcam / GPU 前要做的處理

Published in: Technology

認識那條鯨魚 Docker 初探

  1. 1. 認識那條鯨魚 - Docker 初探 by 王仲昀 cloud@seabunny.tech
  2. 2. 王仲昀 / Cloud Github ID: fatcloud 用途不明的技能練得很多,從電 子電路到機械甚至光學都摸過一 陣子,都能自幹一些東西。 練的最深的技能仍然是寫程式
  3. 3. I come, I see, I conquer.  - Emperor Seabunny
  4. 4. 拍.電.視.時間 (Python Computer Vision time) 臉書描述: 一個企圖把對 Python + OpenCV 有興趣的人類聚集起來,讓大家一起挖坑跳坑、 Demo 斷頭 project,分享一些用途不明的新奇技術,以及堆積整體開發實力的社團 目前狀態: ● 有人挖坑 + 跳坑 [||..............] ● Demo 斷頭 project [||..............] ● 分享一些用途不明的新奇技術 [||||||||........] ● 堆積整體開發實力 [||||............] 一個每一到三星期就會舉辦分享活動,討論較深較有趣的軟體技術的社團。
  5. 5. 成就回顧 ● 挖坑 / 跳坑 + Demo 斷頭 project 記錄 ○ 雷射筆畫螢幕 => 自挖自跳自 Demo ■ 製做完整的火焰效果 ■ 做成 chrome 的 plug-in 讓它能在簡報時直接使用 (?) ● 分享 / 試玩新技術 ○ 動作顯微鏡 ○ 類神經致敬神器 ○ 天社福肉 (TensorFlow) 土魠魚油 (tutorial) ● 堆積整體開發實力 ○ TechTree!
  6. 6. 警告 以下按鈕請不要現場點擊,要也在回到家中夜深人靜的時候再嘗試
  7. 7. 警告 以下按鈕請不要現場點擊,要也在回到家中夜深人靜的時候再嘗試 因為這個功能是呼叫 Github 的 API 實現,一分鐘限呼叫六次 現在人數太多,大家一起去按只會下載到空的 .zip 檔 想要嘗試可以直接下載 PyCV-time 的 Github 不要走 TechTree
  8. 8. 歡迎加入 ● TechTree 的研發團 ○ 軍師 ○ 武將 ○ 工兵 ● 揪團打怪 ● 有趣的講題分享 [預告] 下星期將會以 Shadertoy 為出發點帶大家認識 OpenGL / WebGL 這類的語 言,學著自己寫 Shader 跑圖出來!!
  9. 9. 繼續之前,回想一下 TechTree 這東西 ● 這概念聽起來不是只限於 Python + OpenCV 可用 ● 環境的安裝將是主要的進入障礙 ● 剛才執行的指令是不是有點長看起來怪怪的?
  10. 10. 回顧剛才執行 TechTree 節點的動作 py27-cv2-ubuntu1404.py 其實是用來組出下面這個命令 docker run -it --rm -e DISPLAY -w /exp -v $HOME/.Xauthority:/home/developer/. Xauthority --net=host --privileged -v /home/cloud/Github/PyCV- time/experiments/augmented_reality:/exp fatcloud/py27-cv24-gui-camera python /exp/AR_realtime.py
  11. 11. 今日的主菜 ● 介紹自己、介紹拍電視時間、介紹 TechTree ● 執行比較簡單的程式 ○ 基本動作教學 ● 比較麻煩的程式: ○ 用到 GUI 的程式 ○ 用到 webcam 的程式 ○ 用到 GPU 的程式
  12. 12. Docker 基本動作教學 參考資料:《Docker —— 從入門到實踐-》正體中文版
  13. 13. 基本概念 ● Docker 讓你在同一台電腦上的平行世界執行程式 ● 關於平行世界的詞彙有兩個 ○ container ○ image ● 一個 container 就是一個平行世界的分支 ● 一個 image 則是一種 container 的樣板 ● 用法大致就是 ○ <要執行的指令> 改成 docker <一堆參數設定> <平行世界名稱> <要執行的指令> ○ 以 firefox http://ppt.cc/7KJuO 為例
  14. 14. 創造平行世界分支(container)之前要有樣板(image) ● 搜尋: docker search <keyword> ○ docker search tensoflow => 出現 xblaster/tensorflow-jupyter. ● 下載: docker pull <image_name> ○ docker pull xblaster/tensorflow-jupyter ● 撰寫 / 尋找野生的 Dockerfile ○ 例如這個 ● 然後建立:docker build <image_name> <Dockerfile> ● 檢查自己的電腦上現在有哪些 image:docker images.
  15. 15. 從樣板出發創造平行世界分支 (container) ● 執行 docker images ⇒ 顯示有名為 ubuntu 的 image ● 執行 docker run ubuntu bash 就會在 ubuntu 的環境執行 bash ● 沒有反應?因為它發生在平行世界裡我們看不到阿~~ ● 執行 docker run -it ubuntu bash 才會把異世界的訊息接到當前的 terminal 上 ● 再開一個 terminal 執行 docker ps 就可以看到現正運行的 container
  16. 16. 進到異世界胡搞瞎搞 (start, exec, stop) ● docker run -it ubuntu bash 成為新世界的 root 以後,現在要幹嘛咧? ● 胡亂做點改變再出去 ○ echo “haha” > a.txt ○ cat a.txt ● 重新執行一次 docker run -it ubuntu bash 成為新世界的神,剛剛那個檔案 a.txt 到哪去了? ● 把已經執行到停止的平行世界分支找回來 docker ps -a ● 啟動那個分支 docker start <被自動取的名子> ● 它還是在平行世界裡我們看不到 ● docker exec -it <被自動取的名子> bash 你就可以回去為所欲為了 ● 不過這次你要呼叫 docker stop <被自動取的名子> 才能讓它停下來 ● 其實也可以 docker start -i <被自動取的名子> 反應會跟第一次執行一樣
  17. 17. 把現實世界的檔案掛載到 container 裡 ● 在執行 docker run 的時候使用 -v <本機資料夾>:<掛載路徑> ● docker run -it -v ~/Desktop/:/hahaha ubuntu bash ● 這樣養在異世界裡的程式就可以對這資料夾裡的檔案為所欲為啦! ● 已經忘記是在哪看到,見過一個資訊說掛載要掛資料夾,不要掛單一檔案
  18. 18. 儲存異世界的狀態 ● 把剛才執行好要儲存為樣板的 container 找出來 docker ps -a ● docker commit <要存的 container 名稱> -m “說明訊息” <樣板命名> ● 有 docker hub 帳號的話可以 docker pull 放到網路上
  19. 19. 執行比較麻煩的案例
  20. 20. 執行 GUI 環境 ● 我的做法來自這篇教學以及下方的留言 ● X11 是一支在原生作業系統上執行的程式,負責執行視窗 ● 所有的程式想要開出視窗來都要拜託 X11 ● X11 表示:欸你誰阿? ● 你執行的程式表示:我 root 啦我超大 ● X11:root 是誰阿沒聽過,掰(掛電話)
  21. 21. 執行 GUI 程式 - 解法 ● 在異世界裡創一個帳號,和本機上的帳號有相同的 uid 及 gid ● 找出 uid/gid 的命令:id ● export uid=1000 gid=1000 && mkdir -p /home/developer && echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && echo "developer:x:${uid}:" >> /etc/group && echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && chmod 0440 /etc/sudoers.d/developer && chown ${uid}:${gid} -R /home/developer ● 換身份 su developer
  22. 22. 其實要顧的事項還不只於此 ● 執行前要把環境變數給好 ○ -e DISPLAY=$DISPLAY ● 護照也要用 -v 傳給 developer ○ -v $HOME/.Xauthority:/home/developer/.Xauthority ● 一般程式和 X11 溝通的通道也要接進去 ○ -v /tmp/.X11-unix:/tmp/.X11-unix ● 執行 firefox 要把對外的網路也連到 container 上 ○ --net=host(有這個設定就可以省略上一步) ● 直接抄答案:可以執行 firefox 的命令 ● docker run -it -e DISPLAY -v $HOME/.Xauthority:/home/developer/.Xauthority --net=host fatcloud/py27-cv24-gui-camera firefox
  23. 23. 執行要使用 webcam 的程式 ● 直接講結論:只有被加到 video 這個 group 的使用者才有資格使用 camera ● the webcam howto ● 當然也要掛載好 device -v /dev ● 通常用 --privilege 就會掛上去了,不過根據實測 kinect 不行,一定要 -v /dev ● docker run -it -e DISPLAY -v $HOME/.Xauthority:/home/developer/.Xauthority --net=host fatcloud/py27-cv24-gui-camera bash ● 執行 id 可以看到 video
  24. 24. 執行使用 GPU 的程式 ● 結論:要安裝適合自己 GPU 的 driver ● 假設你的本機已經裝好了 driver 的話 ○ 執行 glxinfo | grep "OpenGL version" 可以看到 NVIDIA 352.63 之類的字樣 ○ 可能要先裝相關的程式庫 sudo apt-get install mesa-utils ● 在 container 內執行 sudo apt-get install nvida-352 ● nvida-352 這裡要換成自己的 driver 版本 ● 執行前給一個 --privilidge 設定
  25. 25. 小抄 能上 shadertoy 的 container docker run -it -e DISPLAY -v $HOME/.Xauthority:/home/developer/.Xauthority -- net=host --privileged fatcloud/ar-sandbox firefox 只要每次都把這些參數加上去 我們就可以做出一個毫無安全性可言的 docker container 啦!
  26. 26. 謝謝大家

×