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 了

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