web-dev-qa-db-ja.com

eval "$(docker-machine env default)"

Docker-composeでdockerを起動すると問題が発生します。

_docker-compose -f dev.yml build_を実行すると、次のエラーが発生します>

_Building postgres
ERROR: Couldn't connect to Docker daemon - you might need to run `docker-machine start default`.
_

しかし、_docker-machine ls_を実行すると、マシンは明らかに稼働しています>

_NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
default   -        virtualbox   Running   tcp://192.168.99.100:2376           v1.12.1
_

eval "$(docker-machine env default)"を実行してエラーを修正した後、_docker-compose -f dev.yml build_が正常に完了します。

なぜこれが機能したのか、実際に何が起こり、どうやって元に戻すのか、という私の質問。

これはこれを修正する安全な方法ですか?現在、これは私のラップトップだけですが、これらのコンテナは近い将来に会社のサーバーにヒットするはずです。

私はbashに堪能ではありませんが、evalを実行しないように、特に "でevalを実行しないように常に指示されています

14
Kimmo Hintikka

dockerコマンドを実行すると、CLIはDockerデーモンのAPIに接続し、実際に機能するのはAPIです。 CLIが実行されているクライアントの環境変数にDockerが保存するAPI接続の詳細を変更することにより、ローカルCLIからリモートDockerホストを管理できます。

Docker Machineを使用すると、Dockerエンジンは実質的にリモートマシンであるVMで実行されるため、ローカルCLIをそれに接続するように構成する必要があります。 Docker Machineは、管理するエンジンの接続の詳細を知っているため、docker-machine env defaultを実行すると、defaultマシンの詳細が出力されます。出力は次のようになります。

 $ docker-machine env default
 export DOCKER_TLS_VERIFY="1"
 export DOCKER_Host="tcp://172.16.62.130:2376"
 export DOCKER_CERT_PATH="/Users/elton/.docker/machine/machines/default"
 export DOCKER_MACHINE_NAME="default"

evalを使用すると、それらのexportコマンドをそれぞれコンソールに書き込むだけでなく実行するので、環境変数をすばやく設定できます。

それを元に戻し、docker-machine env --unsetを使用してローカル環境をリセットできます。これにより、環境を設定解除するための出力が提供されます(そのため、CLIはローカルDockerエンジンに接続しようとします)。

34
Elton Stoneman

これは確かに、DockerをネイティブでサポートしていないマシンでDockerを使用するための予想される方法です。 WindowsまたはMac OSX。

DockerドキュメントのDocker Machineを使用するための説明に、このステップが含まれています。 https://docs.docker.com/machine/get-started/

このステップの機能(自分でも試してみることをお勧めします):

  • docker-machine env defaultを実行します。
  • そのコマンドの出力を取得し、現在のシェルセッションで実行します。

docker-machine env defaultを自分で実行すると、DockerコマンドがVM Dockerデーモンを実行していることを検出できるようにするいくつかの環境変数を設定するように提案するだけです。これらの変数を設定しないと、 、DockerはDockerデーモンと通信する方法を知りません。

サーバー環境(Linux)では、Linuxカーネルがコンテナーの実行をネイティブでサポートしているため、Docker Machineは必要ありません。実行中のコンテナーをネイティブでサポートしていないオペレーティングシステムでのみ、Dockerマシン(小さなVM Linuxカーネルを実行))が必要です。

5
nwinkler