【问题标题】:How to check if docker daemon is running?如何检查 docker daemon 是否正在运行?
【发布时间】:2017-10-14 04:47:57
【问题描述】:

我正在尝试创建一个 bash 实用程序脚本来检查 docker 守护程序是否在我的服务器中运行。 除了运行这样的代码之外,还有更好的方法来检查 docker 守护进程是否在我的服务器中运行?

ps -ef | grep docker
root      1250     1  0 13:28 ?        00:00:04 /usr/bin/dockerd --selinux-enabled
root      1598  1250  0 13:28 ?        00:00:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --runtime docker-runc
root     10997 10916  0 19:47 pts/0    00:00:00 grep --color=auto docker

我想创建一个 bash shell 脚本来检查我的 docker 守护进程是否正在运行。如果它正在运行,则什么也不做,如果没有,则启动 docker 守护进程。

我的伪代码是这样的。我正在考虑解析我的 ps -ef 的输出,但我只是想知道是否有更有效的方法来处理我的伪代码。

如果(docker 没有运行)

          run docker

结束

附: 我不是 linux 专家,我只需要在自己的环境中执行此实用程序。

【问题讨论】:

    标签: bash shell docker


    【解决方案1】:

    我编写了一个小脚本 (Mac Osx),通过检查 docker stats 的退出代码来确保 Docker 正在运行。

    #!/bin/bash
    #Open Docker, only if is not running
    if (! docker stats --no-stream ); then
      # On Mac OS this would be the terminal command to launch Docker
      open /Applications/Docker.app
     #Wait until Docker daemon is running and has completed initialisation
    while (! docker stats --no-stream ); do
      # Docker takes a few seconds to initialize
      echo "Waiting for Docker to launch..."
      sleep 1
    done
    fi
    
    #Start the Container..
    

    【讨论】:

    • 这太棒了
    • 不错!我们可以使用(! docker stats --no-stream &> /dev/null) 在等待时将错误消息静音。
    【解决方案2】:

    这适用于我在 Ubuntu 上

    $ systemctl status docker
    

    【讨论】:

      【解决方案3】:

      在几乎所有 Linux 系统上都有一个名为 pgrep 的实用程序。

      你可以这样做:

      pgrep -f docker > /dev/null || echo "starting docker"
      

      用您的 docker 启动命令替换 echo 命令。

      【讨论】:

      • 我知道这个问题并不要求这个,但在 mac pgrep 总是找到一个进程,因为当 docker 没有运行时com.docker.vmne 仍然存在
      • 对于@ScottAnderson 的观点,如果 MacOS 上的“Docker Desktop”没有运行,pgrep -f docker 将返回一个具有低(例如 3 位)pid 的值。在 MacOS 上运行“Docker Desktop”时,相同的命令将返回更高(5 位)pid 的列表。因此,对于特定于 MacOS 的用例,我认为 pgrep -f Docker.app 是您想要的。
      【解决方案4】:

      如果安装了 git bash,以下内容适用于 macOS 和 Windows。在 macOS 上,open /Applications/Docker.app 将启动 docker 守护进程。但是在 Windows 上还没有看到类似的东西。

      ## check docker is running at all
      ## based on https://stackoverflow.com/questions/22009364/is-there-a-try-catch-command-in-bash
      {
        ## will throw an error if the docker daemon is not running and jump
        ## to the next code chunk     
        docker ps -q
      } || {
        echo "Docker is not running. Please start docker on your computer"
        echo "When docker has finished starting up press [ENTER} to continue"
        read
      }
      

      【讨论】:

      【解决方案5】:

      您也可以只检查/var/run/docker.pid 的存在。

      【讨论】:

      • 我认为这应该是 macOS 的/var/run/docker.sock
      • 即使 docker 没有运行,这个符号链接似乎也存在:/
      【解决方案6】:

      你可以简单地:

      docker version > /dev/null 2>&1
      

      该命令的退出代码将存储到$?,因此您可以检查它是否为0,然后docker正在运行。

      docker versionexit 1 如果守护程序没有运行。如果遇到其他问题,比如 docker 根本没有安装,退出代码会有所不同。

      但归根结底,如果安装了 docker 并且守护程序正在运行,则退出代码将为 0。

      2>&1stderr 重定向到stdout> /dev/nullstdout 重定向到/dev/null 实际上使输出静音,无论执行结果如何。

      【讨论】:

        【解决方案7】:
        if curl -s --unix-socket /var/run/docker.sock http/_ping 2>&1 >/dev/null
        then
          echo "Running"
        else
          echo "Not running"
        fi
        

        参考:Docker api v1.28

        【讨论】:

          【解决方案8】:

          一个函数可能是这样的:

          isRunning {
              `ps -ef | grep "[d]ocker" | awk {'print $2'}`
          }
          

          我创建了一个脚本来启动、停止、重启一个 mongodb-server。 您只需要更改脚本中的一些路径,我也为您工作: Script

          【讨论】:

          • ps -C docker -opid=
          【解决方案9】:

          我确定你想启动 docker 守护进程,所以这里是在执行 Docker 运行语句之前启动它的代码:

          sudo systemctl start docker
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-09-29
            • 2021-08-15
            • 2019-11-28
            • 2022-12-23
            • 2022-12-03
            • 2016-10-21
            • 1970-01-01
            • 2016-02-07
            相关资源
            最近更新 更多