我在使用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
,特别是不要使用"
答案 0 :(得分:26)
当您运行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"
使用eval
执行每个export
命令,而不是将它们写入控制台,这样就可以快速设置环境变量。
您可以撤消它并使用docker-machine env --unset
重置本地环境,这将为您提供取消设置环境的输出(因此CLI将尝试连接到本地Docker引擎)。
答案 1 :(得分:3)
这确实是在本机上不支持Docker的计算机上使用Docker的预期方法,例如在Windows或Mac OS X上。
Docker文档在其描述中包含了使用Docker Machine的步骤:this thread provides a workaround
这一步做了什么(我建议你自己尝试一下):
docker-machine env default
。如果你自己运行docker-machine env default
,你会发现它只是建议设置一些环境变量,这些变量允许Docker命令找到运行Docker守护进程的VM。如果没有设置这些变量,Docker根本不知道如何与Docker守护进程通信。
在服务器环境(Linux)中,您不需要Docker Machine,因为Linux内核本身支持运行容器。您只需要在本机上不支持运行容器的操作系统上使用Docker Machine(运行Linux内核的小型VM)。