如何使用Go SDK for Docker运行Docker Run?

6
我想运行以下docker命令:docker run ajaycs14/hello-world -p 1527:80 -d
如何使用Docker Go SDK实现上述操作?
下面是一个运行镜像的示例代码,它来自官方文档。请问如何修改下面的代码以获取端口和分离模式等选项?请帮我修改以下代码,使其能够执行上述命令(docker run ajaycs14/hello-world -p 1527:80 -d)?
package main

import (
  "fmt"
  "io"
  "os"

  "github.com/docker/docker/api/types"
  "github.com/docker/docker/api/types/container"
  "github.com/docker/docker/client"
  "golang.org/x/net/context"
)

func main() {
  ctx := context.Background()
  cli, err := client.NewEnvClient()
  if err != nil {
    panic(err)
  }

  imageName := "bfirsh/reticulate-splines"

  out, err := cli.ImagePull(ctx, imageName, types.ImagePullOptions{})
  if err != nil {
    panic(err)
  }
  io.Copy(os.Stdout, out)

  resp, err := cli.ContainerCreate(ctx, &container.Config{
    Image: imageName,
  }, nil, nil, "")
  if err != nil {
    panic(err)
  }

  if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
    panic(err)
  }

  fmt.Println(resp.ID)
}
1个回答

13
在方法ContainerCreate中,第三个参数是HostConfig,您需要使用它。如果您想设置端口,则应查看PortBindings字段。此外,您需要为容器指定公开的端口。您可以通过将ExposedPorts提供到容器配置(第二个参数)来实现这一点。
我假设您使用API而非cli工具启动容器时,默认情况下会以daemon模式启动。
以下是一个可行的示例:
package main

import (
    "context"

    "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() {
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    ctx := context.Background()
    resp, err := cli.ContainerCreate(ctx, &container.Config{
        Image:        "mongo",
        ExposedPorts: nat.PortSet{"8080": struct{}{}},
    }, &container.HostConfig{
        PortBindings: map[nat.Port][]nat.PortBinding{nat.Port("8080"): {{HostIP: "127.0.0.1", HostPort: "8080"}}},
    }, nil, "mongo-go-cli")
    if err != nil {
        panic(err)
    }

    if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
        panic(err)
    }
}

在运行docker ps --all命令时,我可以在输出中看到我的端口:PORTS 127.0.0.1:8080->8080/tcp, 27017/tcp


是的,容器以守护进程模式启动。如果您提供示例代码将会很有帮助。 - ajayramesh
resp,err:= cli.ContainerCreate(ctx,&container.Config { Image:imageName, },&container.HostConfig { PortBindings:{"9300:80"}, },nil,“”) 如果出现错误,则{ panic(err) } - ajayramesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接