什么是docker-machine env
docker-machine env是Docker Machine工具中用来获取远程Docker主机连接信息的命令。当你用Docker Machine创建了一台远程的虚拟机或者云服务器之后,本地Docker客户端并不知道怎么连接到那台远程主机上。docker-machine env命令的作用就是帮你在本地终端里设置好环境变量,让本地的Docker命令能够直接操控远程的那台Docker主机。
很多人刚开始接触Docker Machine的时候,以为创建完机器就能直接用docker ps查看远程容器了,结果发现报错说连不上。其实问题就在于本地的Docker客户端默认连接的是本地的Docker守护进程,而不是远程的那台。docker-machine env输出的内容就是用来切换这个连接的。

这个命令本身不复杂,但它输出的一大串export语句会让新手感到困惑。理解它的工作原理之后,你会发现它其实只是把远程主机的地址、证书路径、TLS认证信息这些参数通过环境变量传递给Docker客户端,让客户端知道该往哪里发请求。
docker-machine env怎么用
使用docker-machine env的时候,你首先需要确认自己创建了至少一台Docker Machine机器。假设你已经创建了一台叫default的机器,在终端里输入docker-machine env default,终端就会输出类似这样的内容:
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/yourname/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell:
# eval $(docker-machine env default)

这些export语句的意思很直白。DOCKER_HOST告诉Docker客户端远程主机的IP地址和端口red hat linux 下载,DOCKER_CERT_PATH指定了TLS证书的位置,DOCKER_TLS_VERIFY开启TLS验证。当你把这些环境变量设置好之后,本地Docker客户端就会把命令发送到远程主机上执行。
但直接复制这些export命令到终端里运行并不是最方便的做法。更常见的做法是直接运行eval $(docker-machine env default)这条命令。eval会执行括号里的命令输出,把那些export语句一次性全部设置到当前终端会话里。你可以运行env | grep DOCKER来确认环境变量是否设置成功。
还有一个细节容易被忽略。docker-machine env默认只输出环境变量的设置语句中标linux,但你还可以加上--shell选项来指定输出格式。比如在Windows的PowerShell里用docker-machine env --shell powershell default,输出的就是PowerShell能识别的$env:变量赋值语句。这个选项能让不同操作系统的人都能方便地使用。
切换和退出远程连接

当你同时管理多台Docker Machine机器的时候,频繁切换连接就成了家常便饭。假设你有一台叫dev的机器用来开发,一台叫prod的机器用来测试,你可以分别运行eval $(docker-machine env dev)和eval $(docker-machine env prod)来在两台机器之间切换。
切换的时候要注意,eval命令只影响当前终端窗口的环境变量。你打开一个新的终端标签页,它仍然是连接本地Docker的。所以如果你需要在多个终端窗口里同时操控不同的远程机器,每个窗口都要运行一次对应的eval命令。
有些情况下你想退出远程连接,回到本地Docker环境。这时候不需要重启终端,只需要把那些DOCKER开头的环境变量清除掉就行。你可以运行unset命令一个一个清除,或者更简单的方法是找到一个叫docker-machine env --unset的功能。在旧版本里这个选项可能不存在,但你可以手动执行eval $(docker-machine env -u)来重置环境变量。

另外一个小技巧是docker-machine env,你可以把这些eval命令写进shell的配置文件里。比如在~/.bashrc里加上alias dev=’eval $(docker-machine env dev)’,以后在终端里直接输入dev就能切换到开发机器。这个做法能节省不少敲命令的时间。
docker-machine env常见错误
新手用docker-machine env最容易遇到的一个错误是提示机器不存在。这种情况通常是因为机器名字打错了,或者你确实还没有创建那台机器。运行docker-machine ls看看所有可用的机器列表,确认名字拼写正确。

另一个常见错误是连接超时。当你运行eval $(docker-machine env default)之后,执行docker ps发现一直卡住,最后报连接超时错误。这多半是因为远程Docker主机没有启动,或者防火墙挡住了2376端口。你可以先运行docker-machine status default检查机器状态,如果状态是Runningdocker-machine env,再检查一下网络连通性。
证书相关的错误也比较频繁。如果你看到类似x509: certificate signed by unknown authority的报错,说明DOCKER_CERT_PATH指向的证书文件有问题。可能是因为你把证书文件移动了位置,或者权限设置不对。重新运行docker-machine regenerate-certs default可以重新生成证书,这条命令会重启Docker守护进程,但不会影响已有的容器和数据。
还有一个容易踩的坑是环境变量覆盖。假设你已经在终端里设置了一个叫DOCKER_HOST的环境变量,后来你又运行了eval $(docker-machine env another),新的环境变量会覆盖旧的。这个机制本身是设计好的,但有时候你会忘记自己之前设置过什么,导致命令发到了错误的机器上。养成每次用docker-machine env之前先检查环境变量的习惯,能避免很多麻烦。
