日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

goland go test_七天用Go写个docker(第一天)

發布時間:2023/12/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 main

import (
"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=0
SET GOOS=linux
SET GOARCH=amd64
go build main.go

將main?放到Linux環境中運行,這里我用的是?Centos

4.2 測試能否隔離主機名

  • 給main文件添加可執行權限
  • chmod +x main
  • 查看當前主機名
  • 執行 main 文件
  • ./main

    4. 修改主機名

    hostname -b 新主機名

    再次查看主機名,我們看到已經將主機名修改為?test了5. 退出 shell,再次查看主機名

    這時我們發現,外部的主機名,并沒有被改變,說明該進程成功的將自己的hostname與外部的hostname進行隔離了。這也證明我們使用?uts namespace成功了。

    4.2 其他的隔離

    我們想對此進程進行那種隔離,只需要在Cloneflags中添加參數即可

    package main

    import (
    "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(第一天)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。