Go控制Docker启动MongoDB

这里我们需要先使用命令: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 协议》,转载必须注明作者和本文链接
刻意学习
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
119
粉丝
100
喜欢
186
收藏
269
排名:343
访问:2.8 万
私信
所有博文
社区赞助商