goland go test_七天用Go写个docker(第一天)
1. docker詳解
很多人剛接觸docker的時候就會感覺非常神奇,感覺這個技術非常新穎,其實并不然,docker使用到的技術都是之前已經存在過的,只不過舊酒換了新瓶罷了。簡單來說docker本質其實是一個特殊的進程,這個進程特殊在它被Namespace和Cgroup?技術做了裝飾,Namespace將該進程與Linux系統進行隔離開來,讓該進程處于一個虛擬的沙盒中,而Cgroup則對該進程做了一系列的資源限制,兩者配合模擬出來一個沙盒環境。
2. Namespace
Linux對線程提供了六種隔離機制,分別為:uts?pid?user?mount?network?ipc?,它們的作用如下:
- uts: 用來隔離主機名
- pid:用來隔離進程PID號的
- user: 用來隔離用戶的
- mount:用來隔離各個進程看到的掛載點視圖
- network: 用來隔離網絡
- ipc:用來隔離System V IPC 和 POSIX message queues
3. 環境配置
因為我們是在Windows里面寫代碼,然后將代碼編譯好,放到Linux中執行,所以這里我們要更改下我們goland的環境,因為在不同的環境中,go導入的文件也是不同,如果我們的環境使用的Windows,那么使用?os/exec?包時,導入的將是?exec_windows.go,而如果我們的環境是Linux,那么將會導入exec_linux.go文件,因為只有Linux才會給創建進程時提供這個隔離參數,所以我們需要把環境改成Linux。
4. Go實現進程隔離
4.1 隔離uts
package mainimport (
"log"
"os"
"os/exec"
"syscall"
)
func main() {
cmd := exec.Command("sh")
cmd.SysProcAttr = &syscall.SysProcAttr{
Cloneflags: syscall.CLONE_NEWUTS,
}
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
log.Fatal(err)
}
}
我們編譯一下,放到Linux中測試一下,windows中編譯需要先把GOOS改成Linux,然后再執行go build,編譯腳本如下
SET CGO_ENABLED=0SET GOOS=linux
SET GOARCH=amd64
go build main.go
將main?放到Linux環境中運行,這里我用的是?Centos
4.2 測試能否隔離主機名
4. 修改主機名
hostname -b 新主機名再次查看主機名,我們看到已經將主機名修改為?test了5. 退出 shell,再次查看主機名
這時我們發現,外部的主機名,并沒有被改變,說明該進程成功的將自己的hostname與外部的hostname進行隔離了。這也證明我們使用?uts namespace成功了。
4.2 其他的隔離
我們想對此進程進行那種隔離,只需要在Cloneflags中添加參數即可
package mainimport (
"log"
"os"
"os/exec"
"syscall"
)
func main() {
cmd := exec.Command("sh")
cmd.SysProcAttr = &syscall.SysProcAttr{
// 隔離 uts,ipc,pid,mount,user,network
Cloneflags: syscall.CLONE_NEWUTS |
syscall.CLONE_NEWIPC |
syscall.CLONE_NEWPID |
syscall.CLONE_NEWNS |
syscall.CLONE_NEWUSER |
syscall.CLONE_NEWNET,
// 設置容器的UID和GID
UidMappings: []syscall.SysProcIDMap{
{
// 容器的UID
ContainerID: 1,
// 宿主機的UID
HostID: 0,
Size: 1,
},
},
GidMappings: []syscall.SysProcIDMap{
{
// 容器的GID
ContainerID: 1,
// 宿主機的GID
HostID: 0,
Size: 1,
},
},
}
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
log.Fatal(err)
}
}
下期講解Cgroup知識,掃碼持續關注
??如果對你有所幫助,請幫忙點擊在看和轉發
掃碼關注更多精彩總結
以上是生活随笔為你收集整理的goland go test_七天用Go写个docker(第一天)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 稳了!索尼PS4/PS5之父操刀新一代P
- 下一篇: 御馔津最新御魂搭配方法