• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    浅谈Docker run 容器处于created状态问题

    在最近遇到的一次问题中,有这样一种现象:

    系统有一个测试脚本会不断的执行docker run命令来运行容器,在测试过程中发现有一个情况是,有时候容器没有完全被运行到"Up"状态,而是处于"created"状 态,现象十分奇怪。

    上环境首先查看了"created"状态的容器,以及dockerd日志:

    (1) dockerd的日志中只有"post create"请求,但是居然没有收到该容器的"post start"请求;

    (2) 手动执行docker start是可以将此容器拉起到"Up"状态,说明容器、镜像本身没有问题。

    综合上面现象,怀疑是"docker run"流程没有执行完毕,docker run就退出了导致。立刻翻阅"docker run"在cli/command/container/run.go中对于"docker run"命令的处理函数func runRun()的实现中有如下情况:

    func runRun(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts *runOptions, copts *runconfigopts.ContainerOptions) error {
     。。。。。。
     createResponse, err := createContainer(ctx, dockerCli, config, hostConfig, networkingConfig, hostConfig.ContainerIDFile, opts.name)
     。。。。。。
     if err := client.ContainerStart(ctx, createResponse.ID, types.ContainerStartOptions{}); err != nil {)
     。。。。。
    }

    如果在执行完createContainer()函数后"docker run"命令异常退出(如遇到kill信号),此时ContainerStart()函数无法继续运行。这就会导致容器虽然创建成功处于"created"状态,但是并没有真正的给dockerd"post start",最终造成上述现象。

    因而在日常生产过程中有必要对"docker run"命令进行监控,比如判断它是否执行成功,是否异常退出,退出时返回值是否为0等等。

    补充:docker运行容器后处于运行状态三种方法

    第一种解决方法

    我们在运行docker容器的时候很多时候处于 Exited状态。

    比如下面的命令 docker run -d --name nginx -P nginx /bin/bash 这种交互形式在运行完之后就会退出,重新docker start的也没有用;

    如果想在运行之后容器处于运行状态只需把/bin/bash去掉即可。

    第二种解决方法

    docker run -it --name nginxit -P nginx

    现在容器nginxit处于退出状态;

    只要我们用docker启动下就可以使用

    docker start nginxit

    第三种和第二种类似:

    docker run -it --name nginxit2 -P nginx /bin/bash

    前后台交互需要退出:

    root@de4dbb27f905:/# exit

    然后再重启:

    docker start nginxit2
    

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    上一篇:docker logs-查看docker容器日志的实现
    下一篇:docker 查看进程, 内存, cup消耗的情况
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    浅谈Docker run 容器处于created状态问题 浅谈,Docker,run,容器,处于,