go语言操作docker创建容器
开启远程api的方式 https://www.cnblogs.com/guangdelw/p/17562539.html
代码部分
package main
import (
"context"
"fmt"
"os"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/mount"
"github.com/docker/docker/client"
"github.com/docker/go-connections/nat"
)
func main() {
// 设置远程Docker守护进程的地址
remoteDockerURL := "tcp://10.0.0.12:2376" // 将remote-docker-host替换为远程Docker守护进程的IP地址或域名
// 创建Docker客户端,并指定远程Docker守护进程地址
cli, err := client.NewClientWithOpts(
client.WithHost(remoteDockerURL),
// client.WithVersion("1.41"),
client.WithAPIVersionNegotiation(),
)
if err != nil {
fmt.Println("创建docker客户端失败:", err)
os.Exit(1)
}
// 配置要启动的容器
containerConfig := &container.Config{
Image: "nginx:latest", // 指定要使用的镜像
// Cmd: []string{"echo", "Hello, Docker!"}, // 指定容器启动时要执行的命令
}
// 配置容器自动重启
hostConfig := &container.HostConfig{
RestartPolicy: container.RestartPolicy{
Name: "always", // 设置重启策略为"always",容器将总是自动重启
// 可选的重启策略:
// - "no":无重启策略
// - "always":容器总是自动重启
// - "on-failure":容器在非零退出状态时重启(默认最多重启3次)
// - "unless-stopped":除非手动停止,否则容器总是自动重启
},
PortBindings: nat.PortMap{
"80/tcp": []nat.PortBinding{{HostIP: "0.0.0.0", HostPort: "8080"}}, // 将容器的80端口映射到宿主机的8080端口
},
Mounts: []mount.Mount{
{
Type: mount.TypeBind,
Source: "/data/html", // 宿主机上要挂载的文件夹路径
Target: "/usr/share/nginx/html", // 容器内挂载的路径
ReadOnly: false, // 是否只读
},
},
}
// 设置容器名称
containerName := "nginx111"
// 创建并启动容器
resp, err := cli.ContainerCreate(context.Background(), containerConfig, hostConfig, nil, nil, containerName)
if err != nil {
fmt.Println("容器创建失败:", err)
return
}
// 启动容器
if err := cli.ContainerStart(context.Background(), resp.ID, types.ContainerStartOptions{}); err != nil {
fmt.Println("容器启动失败:", err)
return
}
fmt.Println("容器ID:", resp.ID)
// 关闭Docker客户端连接
defer cli.Close()
}
创建了一个名字为 nginx111
的容器,镜像是使用的 nginx:latest
,映射了端口 8080:80
,映射了文件夹 /data/html:/usr/share/nginx/html
映射文件夹的时候需要注意,宿主机的文件夹一定要提前存在,否则无法创建
本文来自博客园,作者:厚礼蝎,转载请注明原文链接:https://www.cnblogs.com/guangdelw/p/17565293.html