在 Go 语言中,我们可以使用 github.com/docker/docker/client 包来创建和管理 Docker 容器,并设置容器的健康检查。下面是一个示例代码,展示如何使用容器健康检查:
package main
import (
"context"
"fmt"
"time"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/strslice"
"github.com/docker/docker/client"
)
func main() {
ctx := context.Background()
cli, err := client.NewClientWithOpts(client.FromEnv)
if err != nil {
panic(err)
}
containerConfig := &container.Config{
Image: "nginx",
AttachStdout: true,
AttachStderr: true,
Tty: true,
Healthcheck: &container.HealthConfig{
Test: strslice.StrSlice{"/usr/bin/curl", "-f", "http://localhost"},
Interval: time.Duration(10) * time.Second,
Timeout: time.Duration(5) * time.Second,
StartPeriod: time.Duration(0) * time.Second,
Retries: 3,
},
}
hostConfig := &container.HostConfig{}
resp, err := cli.ContainerCreate(ctx, containerConfig, hostConfig, nil, "")
if err != nil {
panic(err)
}
fmt.Println("Container ID:", resp.ID)
err = cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{})
if err != nil {
panic(err)
}
statusCh, errCh := cli.ContainerWait(ctx, resp.ID, container.WaitConditionNotRunning)
select {
case err := <-errCh:
if err != nil {
panic(err)
}
case status := <-statusCh:
fmt.Println("Container exited with status:", status.StatusCode)
}
}
上面的示例中,我们使用 container.HealthConfig 结构体来定义容器的健康检查配置。通过设置 Test 字段,我们可以指定一个命令或脚本来测试容器的健康状态。在这个例子中,我们使用 /usr/bin/curl -f http://localhost 命令来测试容器是否能够访问本地主机。
除了 Test 字段之外,还有其他几个字段可以用于调整健康检查的行为:
Interval: 容器健康检查的间隔时间。Timeout: 每次健康检查的超时时间。StartPeriod: 在容器启动后多少秒开始进行第一次健康检查。Retries: 当连续失败几次后认为容器不可用。
设置完容器的健康检查配置后,我们可以使用 cli.ContainerCreate 函数创建容器,并在其中包含配置信息。然后使用 cli.ContainerStart 函数启动容器,并使用 cli.ContainerWait 函数等待容器退出并返回状态信息。
需要注意的是,在运行具有长期运行服务(例如 Web 服务器)的 Docker 容器时,请务必确保正确设置健康检查和自动重启策略以确保高可用性。




