web-dev-qa-db-fra.com

Impossible de se connecter au démon Docker sous Mac OS X

Je voudrais exécuter une application multi-conteneur en utilisant docker-compose Sur Mac OS X El Capitan (v10.11.2).

Cependant, la commande $ docker-compose up Indique qu’elle ne peut pas se connecter au démon Docker.

ERREUR: Impossible de se connecter au démon Docker - vous devrez peut-être exécuter docker-machine start default.

Après avoir exécuté $ eval "$(docker-machine env default)", j'ai accès à la commande docker-compose.

Pourquoi est-ce et comment puis-je surmonter cette étape supplémentaire?

40
ndequeker

Mise à jour pour les versions de Docker fournies avec Docker.app

L’expérience Docker sur macOS s’est améliorée depuis la publication de cette réponse:

  • La seule condition préalable est maintenant que Docker.app Soit en cours d'exécution. Notez que le démarrage à la demande prend un certain temps, car Linux VM sous-jacent doit être démarré.

  • Tout shell a alors accès aux fonctionnalités de Docker.

Par défaut, Docker.app Est lancé au moment de la connexion (vous pouvez le modifier via ses préférences).
Si vous préférez démarrer et arrêter Docker à la demande à partir de la ligne de commande , voici bash scripts qui font cela, docker-start et docker-stop; placez-les n'importe où dans votre $PATH.

Lorsque docker-start Démarre Docker.app, Il attend que Docker ait fini de démarrer et soit prêt.


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."

Réponse originale et obsolète:

La réponse utile de Kevan Ahlquist indique les commandes à ajouter à votre profil Bash (~/.bash_profile) Pour initialiser automatiquement Docker à l'ouverture d'un shell interactif.

Notez que vous pouvez toujours initialiser Docker dans un onglet/fenêtre shell nouveau en ouvrant l'application /Applications/Docker/Docker Quickstart Terminal.app (Par exemple, via Spotlight).
À partir d'un Shell existant, vous pouvez l'invoquer comme open -a 'Docker Quickstart Terminal.app' (Qui ouvre également un onglet nouveau Shell).
Ce que cette réponse offre est un moyen pratique de démarrer Docker dans le shell actuel.

L'ajout des fonctions Bash du shell ci-dessous - docker-start Et docker-stop - améliore l'approche de Kevan sur les points suivants:

  • Vous pouvez exécuter docker-start à la demande, sans la surcharge de démarrer le VM sur ouverture le Shell (une fois le Docker VM est en cours d'exécution, l'initialisation est beaucoup plus rapide, mais prend tout de même beaucoup de temps).
    (Bien sûr, vous pouvez toujours choisir d’invoquer docker-start Directement à partir de votre profil.)

  • docker-stop Permet d'arrêter Docker et de nettoyer les variables d'environnement à la demande.

  • Les fonctions garantissent que les messages d'erreur de Docker ne sont pas supprimés et transmettent les codes de sortie d'erreur de Docker.

  • Des informations d'état supplémentaires sont fournies.

  • Vous pouvez passer un nom VM en tant que paramètre; La valeur par défaut est default.

Exemple:

$ 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.

Fonctions de shell pour le démarrage et l'arrêt à la demande de Docker (placez-les dans, par exemple, ~/.bash_profile Pour une disponibilité globale dans vos shells interactifs) .

Note : Les fonctions fonctionnent dans bash, ksh et zsh, mais dans ksh vous devez les renommer pour ne pas inclure de '-' dans les noms de fonctions.

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

J'ai le suivant dans mon ~/.bash_profile donc je n'ai pas à exécuter la commande env à chaque fois:

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

Mon cas m'a aidé: arrêter + supprimer tous les conteneurs Docker (Docker version 1.13.0-rc4)

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

Après cette "composition de docker", exécutez sans erreur "ERREUR: impossible de se connecter au démon Docker. Vous devrez peut-être démarrer Docker pour Mac."

Peut-être que dans certains cas, ce message d'erreur est uniquement causé par d'autres erreurs, par exemple des problèmes d'espace mémoire.

0
Gerd

Dans le terminal Quickstart, j'ai redémarré la machine "par défaut" qui a résolu mon problème.

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

Ensuite, j'ai pu commencer à composer mon conteneur avec docker-compos up -d --build

0
TRicks43