Go控制Docker启动MongoDB
这里我们需要先使用命令:docker pull mongo:4.4
将mongo:4.4拉下来
在此之前我们需要了解这几个方法:
client.NewClientWithOpts()
函数声明:
func client.NewClientWithOpts(ops ...client.Opt) (*client.Client, error)
NewClientWithOpts 使用默认值初始化一个新的 API 客户端。 它需要仿函数在创建它时修改值,例如`NewClientWithOpts(WithVersion(…))` 它还初始化自定义 http 标头以添加到每个请求中。 如果版本号为空,它不会发送任何版本信息。 强烈建议您设置一个版本,否则如果服务器升级,您的客户端可能会中断。
context.Background()
函数声明:
func context.Background() context.Context
返回一个非零的空上下文。 它永远不会被取消,没有价值,也没有最后期限。 它通常由主函数、初始化和测试使用,并作为传入请求的顶级上下文。
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 根据给定的配置创建一个新容器。 它可以与名称相关联,但这不是强制性的。
c.ContainerStart()
函数声明:
func (*client.Client).ContainerStart(ctx context.Context, containerID string, options types.ContainerStartOptions) error
ContainerStart 向 docker 守护进程发送请求以启动容器。
c.ContainerInspect()
函数声明:
func (*client.Client).ContainerInspect(ctx context.Context, containerID string) (types.ContainerJSON, error)
ContainerInspect 返回容器信息。
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 协议》,转载必须注明作者和本文链接