eval"$(docker-machine env default)"

Kim*_*kka 12 bash docker docker-compose docker-machine

我有使用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`.
Run Code Online (Sandbox Code Playgroud)

但是,如果我运行docker-machine ls机器显然是>

NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
default   -        virtualbox   Running   tcp://192.168.99.100:2376           v1.12.1
Run Code Online (Sandbox Code Playgroud)

我通过运行修复了错误,eval "$(docker-machine env default)"之后docker-compose -f dev.yml build成功完成.

我的问题为什么这个工作,实际发生了什么以及如何撤消它?

这也是一种安全的解决方法吗?现在这只是我的笔记本电脑,但这些容器应该在不久的将来打到公司的服务器.

我对bash并不是非常流利,但我总是被告知不要跑eval,特别是不要用"

Elt*_*man 31

当您运行docker命令时,CLI将连接到Docker守护程序的API,它是实际完成工作的API.您可以通过更改API连接详细信息来管理本地CLI中的远程Docker主机,Docker存储在运行CLI的客户端上的环境变量中.

使用Docker Machine,您的Docker引擎在VM中运行,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"
Run Code Online (Sandbox Code Playgroud)

使用eval执行这些export命令,而不是仅将它们写入控制台,因此这是设置环境变量的快捷方法.

您可以撤消它并重置本地环境docker-machine env --unset,这将为您提供取消设置环境的输出(因此CLI将尝试连接到本地Docker引擎).

  • 是的,如果您通过SSH连接到VM并运行`docker`命令,它们将针对本地Docker Engine执行。您可以使用环境变量与远程Docker引擎一起使用-Docker Machine使其变得更容易,并且还要确保连接的安全。 (2认同)

nwi*_*ler 5

实际上,这是在本身不支持Docker的机器(例如Windows或Mac OS X)上使用Docker的预期方式。

Docker文档在其有关在此处使用Docker Machine的描述中包括此步骤:https : //docs.docker.com/machine/get-started/

此步骤的作用(我建议您也自己尝试一下):

  • 运行docker-machine env default
  • 取得该命令的输出并在当前的shell会话中执行它。

如果您docker-machine env default自己运行,将会看到它只是建议设置一些环境变量,这些变量允许Docker命令找到运行Docker守护程序的VM。没有设置这些变量,Docker根本不知道如何与Docker守护程序通信。

在服务器环境(Linux)中,您将不需要Docker Machine,因为Linux内核本身支持正在运行的容器。您只需要在本机不支持运行容器的操作系统上使用Docker Machine(运行Linux内核的小型VM)。