package mainimport ("context""fmt""github.com/docker/docker/api/types""github.com/docker/docker/api/types/container""github.com/docker/docker/client""github.com/docker/go-connections/nat""time")func main() {cli, err := client.NewClientWithOpts()if err != nil {panic(err)}ctx := context.Background()resp, err := cli.ContainerCreate(ctx,&container.Config{Image: "mongo:latest", // 1 没有的镜像不会自动拉取ExposedPorts: nat.PortSet{"27017/tcp": {},},},&container.HostConfig{PortBindings: nat.PortMap{"27017/tcp": []nat.PortBinding{{HostIP: "127.0.0.1",HostPort: "0", // 2 会自动找一个本机没有占用的端口做映射},},},},nil,nil,"Test",)if err != nil {panic(err)}err = cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{})if err != nil {panic(err)}fmt.Println("container started")time.Sleep(10 * time.Second)inspRes, err := cli.ContainerInspect(ctx, resp.ID)if err != nil {panic(err)}fmt.Printf("listening at %+v\n", inspRes.NetworkSettings)fmt.Println("killing container")err = cli.ContainerRemove(ctx, resp.ID, types.ContainerRemoveOptions{Force: true,})if err != nil {panic(err)}}
go 有这种能力惊艳到了我,可以写出各种强大的功能,比如,写测试用例时起一个新的数据库容器,测试完成自动清理调,完全自动化了。

