go 開發容器 docker(第一步)
總所周知 Docker 和 Kubernetes 等的雲端計算專案都是用 Go 語言寫的。docker 的技術出現,的確為實施人員解決了讓他們頭痛的問題。 最近新專案也想用 docker 將開發環境部署到開發人員機器上,從而了節省開發人員搭建繁瑣的開發環境的時間。因此才想花些業餘時間,學習學習 docker。在學習過程中,也感受到 docker 的 magic。今天就給大家簡單地介紹一下。
由於 Docker 直接運行於宿主核心,無需啟動完整的作業系統,因此可以做到秒級、甚至毫秒級的啟動時間。
同時對 docker 是怎麼寫出來的產出興趣,由此蒐集一些資料來學習 docker 是如何實現的。想嘗試自己寫一個簡單容器。
當我們執行 docker 時
docker: docker run <容器> 命令 引數(docker run hello-world)
實現: go run main.go run 命令 引數

圖
建立一個 go 專案,建立 main.go 檔案。
引入所需要包,有關 os 包的具體使用方法,我會隨後在我公眾號中,推送給大家分享。

圖
在 main 入口方法中,根據執行時輸入 第一個引數的值 來判斷是否執行 run 方法。

圖
在 run 方法中,首先從第二個引數列印到最後引數為止的所有引數。
接下來執行命名,有關 exec 的使用方法,下一次通過具體示例為大家介紹。
must 方法對異常進行處理。

圖
我們現在就可以執行一下程式,在終端輸入下圖中的命令

圖

圖
哈哈 我們到此為止已經邁出了第一步。

圖
接下來我們再嘗試執行 go run main.go run /bin/bash


圖
然後進入命令列,可以輸入一些命令,最後通過 exit 退出。
但是現在我們進入的 容器 還不是 隔離 的,如下圖中,當進入後我們檢視 hostname,然後 hostname 修改使用者名稱後退出(exit)容器,我們再次用 hostname 命令檢視使用者名稱,發現這時系統的 hostname 也發隨著發生改變。這說明我們沒有隔離容器與系統。

為了解決這個問題,我們需要調整一下程式碼。

引入 syscall 這個可以呼叫底層的包,有關 syscall 的具體的用法,隨後為大家分享。

然後用syscall 將 UTS 複製一份以達到隔離目的

再次執行程式,檢視結果大家可能已經發現了這次在容器中修改 hostname 不會再影響到系統的 hostname 了
