認識那條鯨魚 - Docker 初探
by 王仲昀
cloud@seabunny.tech
王仲昀 / Cloud
Github ID: fatcloud
用途不明的技能練得很多,從電
子電路到機械甚至光學都摸過一
陣子,都能自幹一些東西。
練的最深的技能仍然是寫程式
I come, I see, I conquer. 
- Emperor Seabunny
拍.電.視.時間 (Python Computer Vision time)
臉書描述:
一個企圖把對 Python + OpenCV 有興趣的人類聚集起來,讓大家一起挖坑跳坑、
Demo 斷頭 project,分享一些用途不明的新奇技術,以及堆積整體開發實力的社團
目前狀態:
● 有人挖坑 + 跳坑 [||..............]
● Demo 斷頭 project [||..............]
● 分享一些用途不明的新奇技術 [||||||||........]
● 堆積整體開發實力 [||||............]
一個每一到三星期就會舉辦分享活動,討論較深較有趣的軟體技術的社團。
成就回顧
● 挖坑 / 跳坑 + Demo 斷頭 project 記錄
○ 雷射筆畫螢幕 => 自挖自跳自 Demo
■ 製做完整的火焰效果
■ 做成 chrome 的 plug-in 讓它能在簡報時直接使用 (?)
● 分享 / 試玩新技術
○ 動作顯微鏡
○ 類神經致敬神器
○ 天社福肉 (TensorFlow) 土魠魚油 (tutorial)
● 堆積整體開發實力
○ TechTree!
警告
以下按鈕請不要現場點擊,要也在回到家中夜深人靜的時候再嘗試
警告
以下按鈕請不要現場點擊,要也在回到家中夜深人靜的時候再嘗試
因為這個功能是呼叫 Github 的 API 實現,一分鐘限呼叫六次
現在人數太多,大家一起去按只會下載到空的 .zip 檔
想要嘗試可以直接下載 PyCV-time 的 Github 不要走 TechTree
歡迎加入
● TechTree 的研發團
○ 軍師
○ 武將
○ 工兵
● 揪團打怪
● 有趣的講題分享
[預告] 下星期將會以 Shadertoy 為出發點帶大家認識 OpenGL / WebGL 這類的語
言,學著自己寫 Shader 跑圖出來!!
繼續之前,回想一下 TechTree 這東西
● 這概念聽起來不是只限於 Python + OpenCV 可用
● 環境的安裝將是主要的進入障礙
● 剛才執行的指令是不是有點長看起來怪怪的?
回顧剛才執行 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
今日的主菜
● 介紹自己、介紹拍電視時間、介紹 TechTree
● 執行比較簡單的程式
○ 基本動作教學
● 比較麻煩的程式:
○ 用到 GUI 的程式
○ 用到 webcam 的程式
○ 用到 GPU 的程式
Docker 基本動作教學
參考資料:《Docker —— 從入門到實踐-》正體中文版
基本概念
● Docker 讓你在同一台電腦上的平行世界執行程式
● 關於平行世界的詞彙有兩個
○ container
○ image
● 一個 container 就是一個平行世界的分支
● 一個 image 則是一種 container 的樣板
● 用法大致就是
○ <要執行的指令> 改成 docker <一堆參數設定> <平行世界名稱> <要執行的指令>
○ 以 firefox http://ppt.cc/7KJuO 為例
創造平行世界分支(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.
從樣板出發創造平行世界分支 (container)
● 執行 docker images ⇒ 顯示有名為 ubuntu 的 image
● 執行 docker run ubuntu bash 就會在 ubuntu 的環境執行 bash
● 沒有反應?因為它發生在平行世界裡我們看不到阿~~
● 執行 docker run -it ubuntu bash 才會把異世界的訊息接到當前的 terminal 上
● 再開一個 terminal 執行 docker ps 就可以看到現正運行的 container
進到異世界胡搞瞎搞 (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 <被自動取的名子> 反應會跟第一次執行一樣
把現實世界的檔案掛載到 container 裡
● 在執行 docker run 的時候使用 -v <本機資料夾>:<掛載路徑>
● docker run -it -v ~/Desktop/:/hahaha ubuntu bash
● 這樣養在異世界裡的程式就可以對這資料夾裡的檔案為所欲為啦!
● 已經忘記是在哪看到,見過一個資訊說掛載要掛資料夾,不要掛單一檔案
儲存異世界的狀態
● 把剛才執行好要儲存為樣板的 container 找出來 docker ps -a
● docker commit <要存的 container 名稱> -m “說明訊息” <樣板命名>
● 有 docker hub 帳號的話可以 docker pull 放到網路上
執行比較麻煩的案例
執行 GUI 環境
● 我的做法來自這篇教學以及下方的留言
● X11 是一支在原生作業系統上執行的程式,負責執行視窗
● 所有的程式想要開出視窗來都要拜託 X11
● X11 表示:欸你誰阿?
● 你執行的程式表示:我 root 啦我超大
● X11:root 是誰阿沒聽過,掰(掛電話)
執行 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
其實要顧的事項還不只於此
● 執行前要把環境變數給好
○ -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
執行要使用 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
執行使用 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 設定
小抄
能上 shadertoy 的 container
docker run -it -e DISPLAY -v $HOME/.Xauthority:/home/developer/.Xauthority --
net=host --privileged fatcloud/ar-sandbox firefox
只要每次都把這些參數加上去
我們就可以做出一個毫無安全性可言的 docker container 啦!
謝謝大家

認識那條鯨魚 Docker 初探

  • 1.
    認識那條鯨魚 - Docker初探 by 王仲昀 cloud@seabunny.tech
  • 2.
    王仲昀 / Cloud GithubID: fatcloud 用途不明的技能練得很多,從電 子電路到機械甚至光學都摸過一 陣子,都能自幹一些東西。 練的最深的技能仍然是寫程式
  • 4.
    I come, Isee, I conquer.  - Emperor Seabunny
  • 5.
    拍.電.視.時間 (Python ComputerVision time) 臉書描述: 一個企圖把對 Python + OpenCV 有興趣的人類聚集起來,讓大家一起挖坑跳坑、 Demo 斷頭 project,分享一些用途不明的新奇技術,以及堆積整體開發實力的社團 目前狀態: ● 有人挖坑 + 跳坑 [||..............] ● Demo 斷頭 project [||..............] ● 分享一些用途不明的新奇技術 [||||||||........] ● 堆積整體開發實力 [||||............] 一個每一到三星期就會舉辦分享活動,討論較深較有趣的軟體技術的社團。
  • 6.
    成就回顧 ● 挖坑 /跳坑 + Demo 斷頭 project 記錄 ○ 雷射筆畫螢幕 => 自挖自跳自 Demo ■ 製做完整的火焰效果 ■ 做成 chrome 的 plug-in 讓它能在簡報時直接使用 (?) ● 分享 / 試玩新技術 ○ 動作顯微鏡 ○ 類神經致敬神器 ○ 天社福肉 (TensorFlow) 土魠魚油 (tutorial) ● 堆積整體開發實力 ○ TechTree!
  • 7.
  • 9.
    警告 以下按鈕請不要現場點擊,要也在回到家中夜深人靜的時候再嘗試 因為這個功能是呼叫 Github 的API 實現,一分鐘限呼叫六次 現在人數太多,大家一起去按只會下載到空的 .zip 檔 想要嘗試可以直接下載 PyCV-time 的 Github 不要走 TechTree
  • 10.
    歡迎加入 ● TechTree 的研發團 ○軍師 ○ 武將 ○ 工兵 ● 揪團打怪 ● 有趣的講題分享 [預告] 下星期將會以 Shadertoy 為出發點帶大家認識 OpenGL / WebGL 這類的語 言,學著自己寫 Shader 跑圖出來!!
  • 11.
    繼續之前,回想一下 TechTree 這東西 ●這概念聽起來不是只限於 Python + OpenCV 可用 ● 環境的安裝將是主要的進入障礙 ● 剛才執行的指令是不是有點長看起來怪怪的?
  • 12.
    回顧剛才執行 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
  • 14.
    今日的主菜 ● 介紹自己、介紹拍電視時間、介紹 TechTree ●執行比較簡單的程式 ○ 基本動作教學 ● 比較麻煩的程式: ○ 用到 GUI 的程式 ○ 用到 webcam 的程式 ○ 用到 GPU 的程式
  • 15.
    Docker 基本動作教學 參考資料:《Docker ——從入門到實踐-》正體中文版
  • 16.
    基本概念 ● Docker 讓你在同一台電腦上的平行世界執行程式 ●關於平行世界的詞彙有兩個 ○ container ○ image ● 一個 container 就是一個平行世界的分支 ● 一個 image 則是一種 container 的樣板 ● 用法大致就是 ○ <要執行的指令> 改成 docker <一堆參數設定> <平行世界名稱> <要執行的指令> ○ 以 firefox http://ppt.cc/7KJuO 為例
  • 17.
    創造平行世界分支(container)之前要有樣板(image) ● 搜尋: dockersearch <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.
  • 18.
    從樣板出發創造平行世界分支 (container) ● 執行docker images ⇒ 顯示有名為 ubuntu 的 image ● 執行 docker run ubuntu bash 就會在 ubuntu 的環境執行 bash ● 沒有反應?因為它發生在平行世界裡我們看不到阿~~ ● 執行 docker run -it ubuntu bash 才會把異世界的訊息接到當前的 terminal 上 ● 再開一個 terminal 執行 docker ps 就可以看到現正運行的 container
  • 19.
    進到異世界胡搞瞎搞 (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 <被自動取的名子> 反應會跟第一次執行一樣
  • 20.
    把現實世界的檔案掛載到 container 裡 ●在執行 docker run 的時候使用 -v <本機資料夾>:<掛載路徑> ● docker run -it -v ~/Desktop/:/hahaha ubuntu bash ● 這樣養在異世界裡的程式就可以對這資料夾裡的檔案為所欲為啦! ● 已經忘記是在哪看到,見過一個資訊說掛載要掛資料夾,不要掛單一檔案
  • 21.
    儲存異世界的狀態 ● 把剛才執行好要儲存為樣板的 container找出來 docker ps -a ● docker commit <要存的 container 名稱> -m “說明訊息” <樣板命名> ● 有 docker hub 帳號的話可以 docker pull 放到網路上
  • 22.
  • 23.
    執行 GUI 環境 ●我的做法來自這篇教學以及下方的留言 ● X11 是一支在原生作業系統上執行的程式,負責執行視窗 ● 所有的程式想要開出視窗來都要拜託 X11 ● X11 表示:欸你誰阿? ● 你執行的程式表示:我 root 啦我超大 ● X11:root 是誰阿沒聽過,掰(掛電話)
  • 24.
    執行 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
  • 25.
    其實要顧的事項還不只於此 ● 執行前要把環境變數給好 ○ -eDISPLAY=$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
  • 26.
    執行要使用 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
  • 27.
    執行使用 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 設定
  • 28.
    小抄 能上 shadertoy 的container docker run -it -e DISPLAY -v $HOME/.Xauthority:/home/developer/.Xauthority -- net=host --privileged fatcloud/ar-sandbox firefox 只要每次都把這些參數加上去 我們就可以做出一個毫無安全性可言的 docker container 啦!
  • 29.