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

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

更新Docker.app Docker版本

自从发布这个答案以来,macOS上的Docker体验得到了改进:

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

  • 任何shell都可以访问Dockerfunction。

默认情况下, Docker.app会在login时启动(您可以通过它的首选项来更改)。
如果您更喜欢从命令行 按需启动和停止Docker ,则可以使用bash脚本docker-startdocker-stop ; 把它们放在你的$PATH任何地方。

Docker.app 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的有用答案显示了添加到您的Bashconfiguration文件( ~/.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时启动虚拟机(一旦Docker虚拟机运行,初始化速度更快,但仍需要大量时间)。
    (当然,您仍然可以select从您的configuration文件调用docker-start权限。)

  • docker-stop允许停靠Docker并按需清理环境variables。

  • 这些函数确保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的function (将它们放在例如~/.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." } 

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

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

我的情况帮助:停止+删除所有docker集装箱(docker版本1.13.0-RC4)

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

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

也许在某些情况下,这个错误消息只是由另一个错误,即内存空间问题引起的。