Подтвердить что ты не робот

Не удалось подключиться к демону Docker в Mac OS X

Я хотел бы запустить многоконтейнерное приложение, используя docker-compose в Mac OS X El Capitan (v10.11.2).

Однако команда $ docker-compose up сообщает, что она не может подключиться к демону Docker.

ОШИБКА: Не удалось подключиться к демону Docker - вам может потребоваться запустить docker-machine start default.

Только после выполнения $ eval "$(docker-machine env default)" у меня есть доступ к команде docker-compose.

Почему это и как я могу преодолеть этот дополнительный шаг?

4b9b3361

Ответ 1

Обновление для версий Docker, которые поставляются с Docker.app

Опыт Docker на macOS улучшился с момента публикации этого ответа:

  • Единственное необходимое условие для запуска Docker.app. Обратите внимание, что запуск его по требованию занимает некоторое время, потому что необходимо запустить базовую виртуальную машину Linux.

  • Любая оболочка имеет доступ к функциональности Docker.

По умолчанию Docker.app запускается во время входа в систему (вы можете изменить его с помощью своих настроек).
Если вы вместо этого предпочитаете запускать и останавливать Docker по запросу из командной строки, вот bash скрипты, которые делают это, docker-start и docker-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), чтобы автоматически инициализировать Docker при открытии интерактивной оболочки.

Обратите внимание, что вы всегда можете инициализировать Docker в новой вкладке/окне оболочки, открыв приложение /Applications/Docker/Docker Quickstart Terminal.app (например, через Spotlight).
Из существующей оболочки вы можете вызвать ее как open -a 'Docker Quickstart Terminal.app' (которая также открывает новую вкладку оболочки).
Этот ответ предлагает удобный способ запуска Docker в текущей оболочке.

Добавление функций оболочки Bash ниже - docker-start и docker-stop - улучшает подход Kevan в следующих аспектах:

  • Вы можете запускать docker-start по требованию, без накладных расходов на запуск виртуальной машины при открытии оболочки (после запуска Docker VM инициализация выполняется намного быстрее, но все же занимает заметное количество времени). < ш > (Конечно, вы все равно можете вызывать docker-start прямо из вашего профиля.)

  • docker-stop позволяет остановить Docker и очистить переменные среды по требованию.

  • Функции гарантируют, что сообщения об ошибках Docker не подавляются, и они пропускают коды выхода Docker через.

  • Предоставляется дополнительная информация о статусе.

  • Вы можете передать имя виртуальной машины в качестве параметра; по умолчанию - 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 для глобальной доступности в ваших интерактивных оболочках).

Примечание. Функции работают в 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."
}

Ответ 2

У меня есть следующее в моем ~/.bash_profile, поэтому мне не нужно запускать команду env каждый раз:

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

Ответ 3

Мне помог: stop + удалить все контейнеры докеров (версия Docker 1.13.0-rc4)

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

После этого "docker-compose up" запускается без ошибки "ERROR: Не удалось подключиться к демону Docker. Возможно, вам нужно будет запустить Docker для Mac.

Возможно, в некоторых случаях это сообщение об ошибке вызвано только другими ошибками, т.е. проблемами с памятью.

Ответ 4

В терминале быстрого запуска я перезапустил машину "по умолчанию", решившую мою проблему

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

Затем я смог начать сборку своего контейнера с помощью docker-compose up -d --build

Ответ 5

Я написал "Доморощенный кран" здесь: https://github.com/nejckorasa/mac-docker-go

Он включает скрипт для запуска/перезапуска демона 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