web-dev-qa-db-ja.com

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コマンドにアクセスできます。

これはなぜですか、この余分なステップをどのように克服できますか?

40
ndequeker

Docker.appが付属するDockerバージョンの更新

この回答が投稿されてから、macOSでのDockerエクスペリエンスが向上しました。

  • 唯一の前提条件は、Docker.appを実行することです。基盤となるLinux VMを開始する必要があるため、オンデマンドで開始するには時間がかかることに注意してください。

  • その後、すべてのシェルがDocker機能にアクセスできます。

デフォルトでは、ログイン時にDocker.appが起動します(設定を変更できます)。
代わりにDockerの起動と停止を希望する場合オンデマンドコマンドラインから=、ここにbashスクリプトがあり、docker-startおよびdocker-stop; $PATHの任意の場所に配置します。

docker-startDocker.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の役立つ回答 は、インタラクティブなシェルを開くときにDockerを自動的に初期化するためにBashプロファイル(~/.bash_profile)に追加するコマンドを示しています。

アプリケーション/Applications/Docker/Docker Quickstart Terminal.appを開くことにより、Spotlightを介してnew Shellタブ/ウィンドウでDockerをいつでも初期化できることに注意してください。
既存のシェルから、open -a 'Docker Quickstart Terminal.app'として呼び出すことができます(これはnew Shellタブも開きます)。
この答えは、Dockerをcurrent Shellで起動する便利な方法です。

BashShell関数の追加-docker-startおよびdocker-stop-次の点でKevanのアプローチを改善します。

  • docker-starton demandを実行できます。openingで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のオンデマンド起動および停止用のシェル関数(たとえば、インタラクティブシェルでグローバルに使用できるように~/.bash_profileに配置します)。

:関数はbashksh、および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."
}
35
mklement0

~/.bash_profileに次のものがあるので、毎回envコマンドを実行する必要はありません。

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

私の場合は助けました:停止+すべてのdockerコンテナを削除(Dockerバージョン1.13.0-rc4)

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

この「docker-compose up」がエラーなしで実行された後、「エラー:Dockerデーモンに接続できませんでした。Dockerfor Macを起動する必要があるかもしれません。」

場合によっては、このエラーメッセージは別のエラー、つまりメモリスペースの問題が原因である可能性があります。

0
Gerd

クイックスタートターミナルで、「デフォルト」マシンを再起動して問題を解決しました

docker-machine restart default
eval $(docker-machine env default)

その後、docker-compose up -d --buildを使用してコンテナの作成を開始できました

0
TRicks43