gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:35:28 25 4
gpt4 key购买 nike

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

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

最佳答案

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's helpful answer显示要添加到 Bash 配置文件 (~/.bash_profile) 的命令,以在打开交互式 shell 时自动初始化 Docker。

请注意,您始终可以通过打开应用程序 /Applications/Docker/Docker Quickstart Terminal.appnew shell 选项卡/窗口中初始化 Docker(例如,通过聚光灯)。
在现有的 shell 中,您可以将其调用为 open -a 'Docker Quickstart Terminal.app'(这也会打开 new shell 选项卡)。
这个答案提供了一种在 current shell 中启动 Docker 的便捷方式。

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

  • 您可以运行 docker-start on demand,而无需在 打开 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 中实现全局可用性)。 p>

注意:函数在 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."
}

关于macos - 无法连接到 Mac OS X 上的 Docker 守护程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35969414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com