无法连接到 Mac OS X 上的 Docker 守护进程
Couldn't connect to Docker daemon on Mac OS X
我想 运行 在 Mac OS X El Capitan (v10.11.2) 上使用 docker-compose
多容器应用程序。
然而,命令 $ docker-compose up
命令抱怨无法连接到 Docker 守护程序。
ERROR: Couldn't connect to Docker daemon - you might need to run docker-machine start default
.
只有在执行 $ eval "$(docker-machine env default)"
之后我才能访问 docker-compose
命令。
为什么会这样,我该如何克服这个额外的步骤?
我的 ~/.bash_profile
中有以下内容,所以我不必每次都 运行 env 命令:
docker-machine start default 2>/dev/null # Hide output if machine is already running
eval `docker-machine env default`
Docker.app
附带的 Docker 版本的更新
自发布此答案以来,macOS 上的 Docker 体验有所改善:
现在唯一的先决条件是 Docker.app
是 运行ning。请注意,按需启动它需要一段时间,因为必须启动底层 Linux VM。
然后任何 shell 都可以访问 Docker 功能。
默认情况下,Docker.app
在登录时启动(您可以通过其首选项进行更改)。
如果您更喜欢 启动和停止 Docker 按需 从 命令行 ,这里是 bash
脚本,docker-start
和 docker-stop
;将它们放在 $PATH
中的任何位置。
当 docker-start
启动 Docker.app
时,它会一直等到 Docker 完成启动并准备就绪。
docker-start
:
#!/usr/bin/env bash
case 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 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."
原始的、过时的答案:
显示要添加到您的 Bash 配置文件 (~/.bash_profile
) 以在打开交互式 shell 时自动初始化 Docker 的命令。
请注意,您始终可以通过打开应用程序 [=26] 在 new shell tab/window 中初始化 Docker =](例如,通过 Spotlight)。
从现有的 shell,您可以将其调用为 open -a 'Docker Quickstart Terminal.app'
(这也会打开一个 new shell 选项卡)。
这个答案提供的是一种在 current shell.
中启动 Docker 的便捷方式
添加下面的 Bash shell 函数 - docker-start
和 docker-stop
- 在以下方面改进了 Kevan 的方法:
您可以运行docker-start
按需,无需在打开 shell(一旦 Docker VM 为 运行ning,初始化速度要快得多,但仍然需要大量时间)。
(当然,您仍然可以选择直接从您的个人资料中调用 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.
Shell 用于按需启动和停止 Docker 的函数(例如,将它们放在 ~/.bash_profile
中以获得全球可用性你的互动 shells).
注意:这些函数在bash
、ksh
和zsh
中有效,但在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."
}
我的情况有所帮助:停止 + 删除所有 docker 容器(Docker 版本 1.13.0-rc4)
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
在此之后"docker-compose up"运行没有错误"ERROR: Couldn't connect to Docker daemon. You might need to start Docker for Mac."
也许在某些情况下,此错误消息仅由其他错误引起,即内存 space 问题。
在快速启动终端中,我重新启动了 "default" 机器解决了我的问题
docker-machine restart default
eval $(docker-machine env default)
然后我就可以用 docker-compose up -d --build
开始组合我的容器了
我在这里写了一个 Homebrew tap:https://github.com/nejckorasa/mac-docker-go
它包含 start/restart 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
我想 运行 在 Mac OS X El Capitan (v10.11.2) 上使用 docker-compose
多容器应用程序。
然而,命令 $ docker-compose up
命令抱怨无法连接到 Docker 守护程序。
ERROR: Couldn't connect to Docker daemon - you might need to run
docker-machine start default
.
只有在执行 $ eval "$(docker-machine env default)"
之后我才能访问 docker-compose
命令。
为什么会这样,我该如何克服这个额外的步骤?
我的 ~/.bash_profile
中有以下内容,所以我不必每次都 运行 env 命令:
docker-machine start default 2>/dev/null # Hide output if machine is already running
eval `docker-machine env default`
Docker.app
附带的 Docker 版本的更新
自发布此答案以来,macOS 上的 Docker 体验有所改善:
现在唯一的先决条件是
Docker.app
是 运行ning。请注意,按需启动它需要一段时间,因为必须启动底层 Linux VM。然后任何 shell 都可以访问 Docker 功能。
默认情况下,Docker.app
在登录时启动(您可以通过其首选项进行更改)。
如果您更喜欢 启动和停止 Docker 按需 从 命令行 ,这里是 bash
脚本,docker-start
和 docker-stop
;将它们放在 $PATH
中的任何位置。
当 docker-start
启动 Docker.app
时,它会一直等到 Docker 完成启动并准备就绪。
docker-start
:
#!/usr/bin/env bash
case 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 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."
原始的、过时的答案:
~/.bash_profile
) 以在打开交互式 shell 时自动初始化 Docker 的命令。
请注意,您始终可以通过打开应用程序 [=26] 在 new shell tab/window 中初始化 Docker =](例如,通过 Spotlight)。
从现有的 shell,您可以将其调用为 open -a 'Docker Quickstart Terminal.app'
(这也会打开一个 new shell 选项卡)。
这个答案提供的是一种在 current shell.
添加下面的 Bash shell 函数 - docker-start
和 docker-stop
- 在以下方面改进了 Kevan 的方法:
您可以运行
docker-start
按需,无需在打开 shell(一旦 Docker VM 为 运行ning,初始化速度要快得多,但仍然需要大量时间)。
(当然,您仍然可以选择直接从您的个人资料中调用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.
Shell 用于按需启动和停止 Docker 的函数(例如,将它们放在 ~/.bash_profile
中以获得全球可用性你的互动 shells).
注意:这些函数在bash
、ksh
和zsh
中有效,但在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."
}
我的情况有所帮助:停止 + 删除所有 docker 容器(Docker 版本 1.13.0-rc4)
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
在此之后"docker-compose up"运行没有错误"ERROR: Couldn't connect to Docker daemon. You might need to start Docker for Mac."
也许在某些情况下,此错误消息仅由其他错误引起,即内存 space 问题。
在快速启动终端中,我重新启动了 "default" 机器解决了我的问题
docker-machine restart default
eval $(docker-machine env default)
然后我就可以用 docker-compose up -d --build
开始组合我的容器了我在这里写了一个 Homebrew tap:https://github.com/nejckorasa/mac-docker-go
它包含 start/restart 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