【Docker学习】重启容器的docker restart

命令:

docker container restart

描述:

重启一个或多个容器

用法:

docker container restart [OPTIONS] CONTAINER [CONTAINER...]

别名:

docker restart(docker的一些命令可以简写,docker restart就等同于docker container restart)

选项:

选项 描述
-s, --signal 给容器发送信号
-t, --time 在容器启动后,等待多少秒之后,如果容器没有按预期运行,则自动终止(kill)容器

实战:

如上图所示,我通过docker ps -a显示所有停止的容器,通过docker restart nginx重启nginx容器,最后docker ps显示nginx的状态为Up。

--signal,--time:

经过多次测试,没有迹象表明这个选项起了作用。网上查询,没有发现有对restart的这个-s选项的任何实战说明。为了一探究竟,只能查看docker源码了。

docker分为客户端和服务器两部分,其中客户端有关restart部分关键源码如下所示:

func runRestart(ctx context.Context, dockerCli command.Cli, opts *restartOptions) error {
	var errs []string
	var timeout *int
	if opts.timeoutChanged {
		timeout = &opts.timeout
	}
	for _, name := range opts.containers {
		err := dockerCli.Client().ContainerRestart(ctx, name, container.StopOptions{
			Signal:  opts.signal,
			Timeout: timeout,
		})
		if err != nil {
			errs = append(errs, err.Error())
			continue
		}
		_, _ = fmt.Fprintln(dockerCli.Out(), name)
	}
	if len(errs) > 0 {
		return errors.New(strings.Join(errs, "\n"))
	}
	return nil
}

可以看到Signal和Timeout都是处于StopOptions结构体内。

// StopOptions holds the options to stop or restart a container.
type StopOptions struct {
	// Signal (optional) is the signal to send to the container to (gracefully)
	// stop it before forcibly terminating the container with SIGKILL after the
	// timeout expires. If not value is set, the default (SIGTERM) is used.
	Signal string `json:",omitempty"`

	// Timeout (optional) is the timeout (in seconds) to wait for the container
	// to stop gracefully before forcibly terminating it with SIGKILL.
	//
	// - Use nil to use the default timeout (10 seconds).
	// - Use '-1' to wait indefinitely.
	// - Use '0' to not wait for the container to exit gracefully, and
	//   immediately proceeds to forcibly terminating the container.
	// - Other positive values are used as timeout (in seconds).
	Timeout *int `json:",omitempty"`
}

从结构体成员Signal上面的的注释可以看到,只有重启失败,经过timeout时间后,signal才会起作用,优雅地停止容器,然后再用 SIGKILL 强制终止容器。如果没有设置值,则使用默认值(SIGTERM)。

若是自己的容器项目经常因为一些原因而停止,这时可以使用这两个选项控制停止时长,以更快地进行后面的调试(这是我能想到的使用这个选项的一种情境)。

关于--signal和--time的使用,在我上一篇【Docker学习】docker stop深入研究有更为深入的使用,这里就不再演示了。

相关推荐
Young_2022020226 分钟前
学习笔记——KMP
笔记·学习
行然梦实42 分钟前
学习日记_20241110_聚类方法(K-Means)
学习·kmeans·聚类
马船长1 小时前
制作图片木马
学习
sam-1231 小时前
k8s上部署redis高可用集群
redis·docker·k8s
秀儿还能再秀1 小时前
机器学习——简单线性回归、逻辑回归
笔记·python·学习·机器学习
WCF向光而行1 小时前
Getting accurate time estimates from your tea(从您的团队获得准确的时间估计)
笔记·学习
wang09072 小时前
工作和学习遇到的技术问题
学习
Fanstay9852 小时前
在Linux中使用Nginx和Docker进行项目部署
linux·nginx·docker
ggaofeng3 小时前
通过命令学习k8s
云原生·容器·kubernetes
Li_0304063 小时前
Java第十四天(实训学习整理资料(十三)Java网络编程)
java·网络·笔记·学习·计算机网络