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を開始する必要があるため、オンデマンドで開始するには時間がかかることに注意してください。
その後、すべてのシェルが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の役立つ回答 は、インタラクティブなシェルを開くときに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-start
on 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
に配置します)。
注:関数は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."
}
~/.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デーモンに接続できませんでした。Dockerfor Macを起動する必要があるかもしれません。」
場合によっては、このエラーメッセージは別のエラー、つまりメモリスペースの問題が原因である可能性があります。
クイックスタートターミナルで、「デフォルト」マシンを再起動して問題を解決しました
docker-machine restart default
eval $(docker-machine env default)
その後、docker-compose up -d --buildを使用してコンテナの作成を開始できました