无法连接到Mac OS X上的Docker守护程序

时间:2016-03-13 11:02:47

标签: macos docker docker-compose daemon

我想在Mac OS X El Capitan(v10.11.2)上使用docker-compose运行多容器应用程序。

但是,命令$ docker-compose up命令抱怨它无法连接到Docker守护程序。

  

错误:无法连接到Docker守护程序 - 您可能需要运行docker-machine start default

只有在执行$ eval "$(docker-machine env default)"后,我才能访问docker-compose命令。

为什么会这样,我怎样才能克服这个额外的步骤?

5 个答案:

答案 0 :(得分:34)

Docker.app

附带的Docker版本更新

自从发布此答案后,Docker在macOS上的体验有所改善:

  • 现在唯一的先决条件是Docker.app正在运行。请注意,按需启动它需要一段时间,因为必须启动基础Linux VM。

  • 然后任何shell都可以访问Docker功能。

默认情况下,Docker.app在登录时启动(您可以通过其偏好更改) 如果您更喜欢从命令行 按需启动和停止Docker ,则 bash脚本那样做, docker-startdocker-stop ;将它们放在$PATH的任何位置。

docker-start启动Docker.app时,它会一直等到Docker完成启动并准备就绪。

<强> docker-start

#!/usr/bin/env bash

case $1 in
  -h|--help)
    echo $'usage: docker-start\n\nStarts Docker (Docker.app) on macOS and waits until the Docker environment is initialized.'
    exit 0
    ;;
esac
(( $# )) && { echo "ARGUMENT ERROR: Unexpected argument(s) specified. Use -h for help." >&2; exit 2; }

[[ $(uname) == 'Darwin' ]] || { echo "This function only runs on macOS." >&2; exit 2; }

echo "-- Starting Docker.app, if necessary..."

open -g -a Docker.app || exit

# Wait for the server to start up, if applicable.  
i=0
while ! docker system info &>/dev/null; do
  (( i++ == 0 )) && printf %s '-- Waiting for Docker to finish starting up...' || printf '.'
  sleep 1
done
(( i )) && printf '\n'

echo "-- Docker is ready."

<强> docker-stop

#!/usr/bin/env bash

case $1 in
  -h|--help)
    echo $'usage: docker-stop\n\nStops Docker (Docker.app) on macOS.'    
    exit 0
    ;;
esac
(( $# )) && { echo "ARGUMENT ERROR: Unexpected argument(s) specified. Use -h for help." >&2; exit 2; }

[[ $(uname) == 'Darwin' ]] || { echo "This function only runs on macOS." >&2; exit 2; }

echo "-- Quitting Docker.app, if running..."

osascript - <<'EOF' || exit
tell application "Docker"
  if it is running then quit it
end tell
EOF

echo "-- Docker is stopped."
echo "Caveat: Restarting it too quickly can cause errors."

原创,过时的答案:

Kevan Ahlquist's helpful answer显示要添加到Bash配置文件(~/.bash_profile)的命令,以便在打开交互式shell时自动初始化Docker。

请注意,您始终可以通过打开应用程序/Applications/Docker/Docker Quickstart Terminal.app(例如,通过Spotlight)在 shell标签/窗口中初始化Docker。 在现有的shell中,您可以将其作为open -a 'Docker Quickstart Terminal.app'调用(它还会打开 new shell标签)。
这个答案提供的是在当前 shell中启动Docker的便捷方式。

在下面添加Bash shell函数 - docker-startdocker-stop - 改进了Kevan在以下方面的方法:

  • 您可以按需运行docker-start ,而无需在打开 shell上启动VM的开销(一旦Docker VM运行,初始化要快得多,但仍需要相当长的时间) (当然,您仍然可以选择直接从您的个人资料中调用docker-start。)

  • docker-stop允许停止Docker并按需清理环境变量。

  • 这些函数确保不会抑制Docker的错误消息,并且它们会通过Docker错误退出代码。

  • 提供了其他状态信息。

  • 您可以将VM名称作为参数传递;默认值为default

示例:

$ docker-start
-- Starting Docker VM 'default' (`docker-machine start default`; this will take a while)...
Starting "default"...
(default) Check network to re-create if needed...
(default) Waiting for an IP...
Machine "default" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
-- Setting DOCKER_* environment variables (`eval "$(docker-machine env default)"`)...
DOCKER_CERT_PATH="/Users/jdoe/.docker/machine/machines/default"
DOCKER_HOST="tcp://192.168.99.100:2376"
DOCKER_MACHINE_NAME="default"
DOCKER_TLS_VERIFY="1"
-- Docker VM 'default' is running.


$ docker-stop
-- Stopping Docker VM 'default' (`docker-machine stop default`)...
Stopping "default"...
Machine "default" was stopped.
-- Unsetting DOCKER_* environment variables (DOCKER_CERT_PATH, DOCKER_HOST, DOCKER_MACHINE_NAME, DOCKER_TLS_VERIFY)...
-- Docker VM 'default' is stopped.

用于按需启动和停止Docker的Shell函数(将它们放在例如~/.bash_profile中,以便在交互式shell中实现全局可用性)。

注意:这些功能适用于bashkshzsh,但在ksh中您必须重命名它们在函数名称中包含“ - ”。

function docker-start {
  typeset vm=${1:-default} sts
  case $vm in
    -h|--help)
      echo $'usage: docker-start [<vm>]\n\nEnsures that the specified/default Docker VM is started\nand the environment is initialized.'
      return 0
      ;;
  esac
  sts=$(docker-machine status "$vm") || return
  [[ $sts == 'Running' ]] && echo "(Docker VM '$vm' is already running.)" || { 
    echo "-- Starting Docker VM '$vm' (\`docker-machine start "$vm"\`; this will take a while)..."; 
    docker-machine start "$vm" || return
  }
  echo "-- Setting DOCKER_* environment variables (\`eval \"\$(docker-machine env "$vm")\"\`)..."
  # Note: If the machine hasn't fully finished starting up yet from a
  #       previously launched-but-not-waited-for-completion `docker-machine status`,
  #       the following may output error messages; alas, without signaling failure
  #       via the exit code. Simply rerun this function to retry.
  eval "$(docker-machine env "$vm")" || return
  export | grep -o 'DOCKER_.*'
  echo "-- Docker VM '$vm' is running."
}

function docker-stop {
  typeset vm=${1:-default} sts envVarNames fndx
  case $vm in
    -h|--help)
      echo $'usage: docker-stop [<vm>]\n\nEnsures that the specified/default Docker VM is stopped\nand the environment is cleaned up.'
      return 0
      ;;
  esac
  sts=$(docker-machine status "$vm") || return
  [[ $sts == 'Running' ]] && { 
    echo "-- Stopping Docker VM '$vm' (\`docker-machine stop "$vm"\`)...";
    docker-machine stop "$vm" || return
  } || echo "(Docker VM '$vm' is not running.)"
  [[ -n $BASH_VERSION ]] && fndx=3 || fndx=1 # Bash prefixes defs. wit 'declare -x '
  envVarNames=( $(export | awk -v fndx="$fndx" '$fndx ~ /^DOCKER_/ { sub(/=.*/,"", $fndx); print $fndx }') )
  if [[ -n $envVarNames ]]; then
    echo "-- Unsetting DOCKER_* environment variables ($(echo "${envVarNames[@]}" | sed 's/ /, /g'))..."
    unset "${envVarNames[@]}"
  else
    echo "(No DOCKER_* environment variables to unset.)"
  fi
  echo "-- Docker VM '$vm' is stopped."
}

答案 1 :(得分:20)

我的~/.bash_profile中有以下内容,因此我不必每次都运行env命令:

docker-machine start default 2>/dev/null # Hide output if machine is already running
eval `docker-machine env default`

答案 2 :(得分:0)

我的案例有帮助:停止+删除所有docker容器(Docker版本1.13.0-rc4)

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

在此“docker-compose up”运行之后没有错误“ERROR:无法连接到Docker守护程序。您可能需要启动Docker for Mac。”

在某些情况下,此错误消息可能仅由其他错误引起,即内存空间问题。

答案 3 :(得分:0)

在快速启动终端中,我重新启动了“默认”计算机,解决了我的问题

        if(Fragment.List.get(holder.getAdapterPosition()).isTrueBtnClicked){
            holder.btnPositive.setEnabled(false);
            holder.btnPositive.setBackgroundResource(R.color.darkGray);
            holder.btnNegative.setEnabled(false);
            holder.btnNegative.setBackgroundResource(R.color.darkGray);

        }else{
            holder.btnPositive.setEnabled(true);
            holder.btnPositive.setBackgroundResource(R.color.greenEnable);
            holder.btnNegative.setEnabled(true);
            holder.btnNegative.setBackgroundResource(R.color.greenEnable);
        }

然后我就可以开始使用docker-compose up -d --build

来构成我的容器了

答案 4 :(得分:0)

我已经在这里写了一个自制的水龙头:https://github.com/nejckorasa/mac-docker-go

它包含用于启动/重新启动Docker守护程序的脚本。

Usage: dckr [options]

Options:
  -k  | --kill        Kill Docker daemon
  -s  | --start       Start Docker daemon
  -r  | --restart     Restart Docker daemon
  -ka | --killall     Kill all running Docker containers
  -h                  Display help

  Defaults to restart if no options are present