本系列教學主要是為了弄清楚容器化的原理,紙上得來終覺淺,絕知此事要躬行,理論始終不及動手實踐來的深刻,所以這個系列會用go語言實現一個類似docker的容器化功能,最終能夠容器化的執行一個程序。
本系列原始碼已經上傳到githuhub,地址如下:
https://github.com/HobbyBear/tinydocker
在開始寫程式碼之前,先介紹下我的實驗環境,本地開發環境是arm64 mac m1,為了能方便的在linux上進行偵錯,我買了一個amd64的雲linux 伺服器,其實也可以本地搭建一個linux虛擬機器器代。 程式碼編輯器選擇了goland,並在goland設定了遠端編譯,這樣便能在本地編寫偵錯 適合amd64 linux環境的程式碼了。
下面是我設定的詳細步驟。
我建立了一個名為tidydocker的專案,然後用goland開啟,進入到goland設定介面設定sftp
設定遠端的部署路徑,注意我已經在linux伺服器上提前建立好了projects和tinydocker 目錄了。到時候goland在尋找部署目錄時會根據上一個截圖的root path 和下面截圖的Deployment path 結合起來尋找部署目錄。
接著設定go remote,這樣到時候我們便能夠遠端偵錯程式碼。
在接著設定goland之前,還需要在遠端linux機器上部署偵錯工具。
首先肯定要有golang環境
root@ecs-295280:~# go version
go version go1.20.3 linux/amd64
root@ecs-295280:~#
接著安裝dlv偵錯工具
go install github.com/go-delve/delve/cmd/dlv@latest
寫一個簡單hello world程式
設定遠端編譯,編譯的選項選擇run on 在我們遠端linux主機上。
注意編譯時候設定-o引數這樣能讓我們編譯後的檔名稱為tinydocker,不然就是goland為我們自動生成的一串很長的檔名。
點選manager targets 設定編譯後的檔案輸出目錄
這下設定就算全部完成了,點選編譯,goland便會將程式碼自動上傳到遠端,然後執行編譯過程。
上一步完成後,登入到遠端看看,可以發現已經生成了tinydocker的可執行檔案
root@ecs-295280:~/projects/tinydocker# ls
go.mod main.go ReadMe.md tinydocker
root@ecs-295280:~/projects/tinydocker# pwd
/root/projects/tinydocker
root@ecs-295280:~/projects/tinydocker#
接著遠端執行偵錯命令
root@ecs-295280:~/projects/tinydocker# dlv exec tinydocker --headless --listen=:2345 --api-version=2 --accept-multiclient
API server listening at: [::]:2345
2023-05-02T01:27:04+08:00 warning layer=rpc Listening for remote connections (connections are not authenticated nor encrypted)
然後本地goland 給hellow world 程式打上斷點 執行remote
可以看到斷點已經生效了,這樣便設定完成了goland的遠端編譯偵錯環境。