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

新手上路,请多包涵

我想在 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 命令。

为什么会这样,我该如何克服这个额外的步骤?

原文由 ndequeker 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 720
2 个回答

Docker.app 附带的 Docker 版本的更新

自发布此答案以来,macOS 上的 Docker 体验得到了改善:

  • 现在唯一的先决条件是 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 的有用答案 显示了要添加到 Bash 配置文件 ( ~/.bash_profile ) 的命令,以在打开交互式 shell 时自动初始化 Docker。

请注意,您始终可以通过打开应用程序 /Applications/Docker/Docker Quickstart Terminal.app (例如,通过 Spotlight)在 的 shell 选项卡/窗口中初始化 Docker。

在现有的 shell 中,您可以将其调用为 open -a 'Docker Quickstart Terminal.app' (这也会打开一个 的 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 中全局可用性)。

Note : The functions work in bash , ksh , and zsh , but in ksh you have to rename them so as not to include函数名称中的“-”。

 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."
}

原文由 mklement0 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

原文由 Kevan Ahlquist 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题