這裡我們需要先使用命令: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 協議》,轉載必須註明作者和本文連結