如何使用Go SDK配置Docker容器运行时的环境变量、网络、端口与卷
Go SDK 对应 docker run 命令实现示例
首先需要先安装Docker官方Go SDK依赖:
go get github.com/docker/docker/client github.com/docker/docker/api/types github.com/docker/go-connections/nat
完整实现代码
package main import ( "context" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/network" "github.com/docker/docker/client" "github.com/docker/go-connections/nat" ) func main() { // 初始化Docker客户端,默认连接本地Docker daemon cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { panic(err) } defer cli.Close() ctx := context.Background() // 配置端口映射 对应CLI的 -p 参数 // 声明容器要暴露的端口 exposedPorts := nat.PortSet{ "12345/tcp": struct{}{}, "8080/tcp": struct{}{}, } // 配置宿主机到容器的端口绑定规则 portBindings := nat.PortMap{ "12345/tcp": []nat.PortBinding{ { HostIP: "0.0.0.0", HostPort: "12345", }, }, "8080/tcp": []nat.PortBinding{ { HostIP: "0.0.0.0", HostPort: "8080", }, }, } // 容器基础配置 config := &container.Config{ Image: "mydocker/image_name:latest", // 对应CLI的镜像名参数 Hostname: "myhost", // 对应CLI的 --hostname 参数 Env: []string{ // 对应CLI的 -e 参数,每个元素格式为 环境变量名=值 "myvar1=myval1", "myvar2=myval2", }, ExposedPorts: exposedPorts, Cmd: []string{ // 对应CLI镜像名后面的启动命令 "command1", "command2", "command3", }, } // 宿主机相关配置 hostConfig := &container.HostConfig{ NetworkMode: container.NetworkMode("mynet"), // 对应CLI的 --net 参数 PortBindings: portBindings, Binds: []string{ // 对应CLI的 -v 参数,每个元素直接填 -v 后面的字符串即可 "my/path/to/data1", "my/second-path/to/data2", }, } // 网络配置,基础场景直接传nil即可,复杂网络配置可在此处自定义 networkConfig := &network.NetworkingConfig{} // 创建容器 对应CLI的 --name 参数 resp, err := cli.ContainerCreate(ctx, config, hostConfig, networkConfig, nil, "myname") if err != nil { panic(err) } // 启动容器 对应CLI的 -d 参数,后台启动 if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil { panic(err) } }
疑问点专项说明
- 环境变量配置:所有
-e传入的键值对都直接按KEY=VALUE的字符串格式,填入config.Env切片即可,支持任意数量的环境变量 - 网络配置:如果只是指定容器加入已存在的网络,直接修改
hostConfig.NetworkMode为对应网络名称即可;如果需要配置固定IP等高级网络参数,可在networkConfig中自定义 - 多端口映射:要同时配置
config.ExposedPorts(声明容器要暴露的端口)和hostConfig.PortBindings(配置宿主机映射规则),有多少个端口要映射就加多少条对应记录即可,支持TCP/UDP协议指定 - 卷配置:所有
-v参数后面的内容直接按原字符串填入hostConfig.Binds切片即可,支持匿名卷、宿主机绑定挂载、具名卷三种常用格式
内容的提问来源于stack exchange,提问作者Ugty
相关产品推荐
相关产品推荐

