Go控制Docker啟動MongoDB

ice_moss發表於2022-03-17

這裡我們需要先使用命令:docker pull mongo:4.4將mongo:4.4拉下來

在此之前我們需要了解這幾個方法:

  1. client.NewClientWithOpts()

    函式宣告:

    func client.NewClientWithOpts(ops ...client.Opt) (*client.Client, error)
    NewClientWithOpts 使用預設值初始化一個新的 API 客戶端。 它需要仿函式在建立它時修改值,例如`NewClientWithOpts(WithVersion(…))` 它還初始化自定義 http 標頭以新增到每個請求中。
    
    如果版本號為空,它不會傳送任何版本資訊。 強烈建議您設定一個版本,否則如果伺服器升級,您的客戶端可能會中斷。
    
  2. context.Background()

    函式宣告:

    func context.Background() context.Context
    返回一個非零的空上下文。 它永遠不會被取消,沒有價值,也沒有最後期限。 它通常由主函式、初始化和測試使用,並作為傳入請求的頂級上下文。
  3. c.ContainerCreate()

    函式宣告:

    func (*client.Client).ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *v1.Platform, containerName string) (container.ContainerCreateCreatedBody, error)
    ContainerCreate 根據給定的配置建立一個新容器。 它可以與名稱相關聯,但這不是強制性的。
  4. c.ContainerStart()

    函式宣告:

    func (*client.Client).ContainerStart(ctx context.Context, containerID string, options types.ContainerStartOptions) error
    ContainerStart 向 docker 守護程式傳送請求以啟動容器。
  5. c.ContainerInspect()

    函式宣告:

    func (*client.Client).ContainerInspect(ctx context.Context, containerID string) (types.ContainerJSON, error)
    ContainerInspect 返回容器資訊。
  6. c.ContainerRemove()

    函式宣告:

    func (*client.Client).ContainerRemove(ctx context.Context, containerID string, options types.ContainerRemoveOptions) error
    ContainerRemove 殺死並從 docker 主機中刪除一個容器。

然後我們就可以實現使用docker開啟資料庫

package main

import (
    "context"
    "fmt"
    "time"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/api/types/container"
    "github.com/docker/docker/client"
    "github.com/docker/go-connections/nat"
)

func main() {

    c, err := client.NewClientWithOpts()
    if err != nil {
        panic(err)
    }

    ctx := context.Background()
    //開啟docker service埠,埠始終是27017,27017埠對映到Host埠
    resp, err := c.ContainerCreate(ctx, &container.Config{
        Image: "mongo:4.4",
        ExposedPorts: nat.PortSet{
            "27017/tcp": {},
        },
    }, &container.HostConfig{
        PortBindings: nat.PortMap{
            "27017/tcp": []nat.PortBinding{
                {
                    HostIP:   "127.0.0.1",
                    HostPort: "0", //0,系統分配埠
                },
            },
        },
    }, nil, nil, "")
    if err != nil {
        panic(err)
    }
    //開啟docker service
    err = c.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{})
    if err != nil {
        panic(err)
    }
    inspRes, err := c.ContainerInspect(ctx, resp.ID)
    if err != nil {
        panic(err)
    }
  //列印監聽埠資訊
    fmt.Printf("listen: %+v\n", inspRes.NetworkSettings.Ports["27017/tcp"][0])
    fmt.Println("conainer staert")
    time.Sleep(5 * time.Second)
    fmt.Println("container kill")
    //kill docker service
    err = c.ContainerRemove(ctx, resp.ID, types.ContainerRemoveOptions{
        Force: true,
    })
    if err != nil {
        panic(err)
    }
}

這樣我們就實現了一個自動開啟MongoDB service,監聽埠並且定期kill掉埠。

列印結果:

listen: {HostIP:127.0.0.1 HostPort:55007}
conainer staert
container kill

我們在終端使用docker ps命令:

MacBook-Pro:~/src/coolcar/server] feng% docker ps
CONTAINER ID   IMAGE                                    COMMAND                  CREATED          STATUS          PORTS                                                                                                                                 NAMES
b8e5e090bbdb   mongo:4.4                                "docker-entrypoint.s…"   22 seconds ago   Up 5 seconds   127.0.0.1:55007->27017/tcp    ```這麼我們看到是55007埠對映到了27017埠```                                                                                                stoic_hawking
5e8c1e0598f5   ccr.ccs.tencentyun.com/coolcar/coolenv   "start.sh"               3 days ago       Up 3 days       4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 15691-15692/tcp, 18001/tcp, 0.0.0.0:18000->18000/tcp, 25672/tcp, 0.0.0.0:27017->27017/tcp   gallant_beaver
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章