Docker for windows on VMware
<p><span style="font-size: 18px"><strong>工作环境</strong></span></p><p>操作系统:Windows 10 Pro x64</p>
<p>Hyper-V:已卸载。</p>
<p>VMware:已安装。</p>
<p>Virtual Box:无安装。</p>
<p> </p>
<p><span style="font-size: 18px"><strong>前言</strong></span></p>
<p>鉴于Hyper-V在Windows桌面系统下的"弱鸡"表现,包括不仅限于"网络"方面都很"辣鸡",各种不兼容的原因。</p>
<p>我决定(禁用/卸载)Hyper-V,却又不想用其默认的Virtual Box,于是改成最为喜爱的VMware Workstation,作为Docker machine的driver。</p>
<p><span style="color: rgba(136, 136, 136, 1)">以上对于三个虚拟机的好与坏,只是个人亲身使用后的感受,或许没有全面了解过它们的优良之处,请勿喷,可以指教,谢谢。</span></p>
<p>然而Docker官方并不支持VMware Workstation驱动,不过我从Docker官方指导文档中找到第三方支持:https://docs.docker.com/machine/drivers</p>
<p><img src="https://images2015.cnblogs.com/blog/402416/201707/402416-20170703165918784-788739809.png" alt=""></p>
<p> </p>
<p><span style="font-size: 18px"><strong>正文</strong></span></p>
<p>访问该驱动的第三方支持,https://github.com/pecigonzalo/docker-machine-vmwareworkstation/releases/latest</p>
<p>下载二进制文件 -- docker-machine-driver-vmwareworkstation.exe,复制到docker-machine.exe的同级目录下,<strong><span style="color: rgba(255, 0, 0, 1)">注意:如果你是</span></strong></p>
<p>1.通过InstallDocker.msi安装的,复制到C:\Program Files\Docker\Docker\resources\bin下。</p>
<p>2.通过DockerToolbox.exe安装的,复制到C:\Program Files\Docker Toolbox下。</p>
<p>2.1.如果是通过DockerToolbox.exe安装的,还需要修改C:\Program Files\Docker Toolbox\start.sh脚本文件内容为:</p>
<div class="cnblogs_code">
<pre>#!/bin/<span style="color: rgba(0, 0, 0, 1)">bash
export PATH</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$PATH:/c/Program Files (x86)/VMware/VMware Workstation</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
trap </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">[ "$?" -eq 0 ] || read -p "Looks like something went wrong in step ´$STEP´... Press any key to continue..."</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> EXIT
VM</span>=${DOCKER_MACHINE_NAME-<span style="color: rgba(0, 0, 0, 1)">default}
DOCKER_MACHINE</span>=./docker-<span style="color: rgba(0, 0, 0, 1)">machine.exe
BLUE</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\033[1;34m</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
GREEN</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\033[0;32m</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
NC</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\033[0m</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> [ ! -f <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${DOCKER_MACHINE}</span><span style="color: rgba(128, 0, 0, 1)">"</span> ]; <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Docker Machine is not installed. Please re-run the Toolbox Installer and try again.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
exit </span><span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 0, 255, 1)">fi</span><span style="color: rgba(0, 0, 0, 1)">
vmrun.exe list </span>| <span style="color: rgba(0, 0, 255, 1)">grep</span> <span style="color: rgba(128, 0, 0, 1)">"</span>${VM}<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)"> &> /dev/null</span>
VM_EXISTS_CODE=$?<span style="color: rgba(0, 0, 0, 1)">
set </span>-<span style="color: rgba(0, 0, 0, 1)">e
STEP</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Checking if machine $VM exists</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> [ $VM_EXISTS_CODE -eq <span style="color: rgba(128, 0, 128, 1)">1</span> ]; <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${DOCKER_MACHINE}</span><span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(0, 0, 255, 1)">rm</span> -f <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${VM}</span><span style="color: rgba(128, 0, 0, 1)">"</span> &> /dev/<span style="color: rgba(0, 0, 255, 1)">null</span> ||<span style="color: rgba(0, 0, 0, 1)"> :
</span><span style="color: rgba(0, 0, 255, 1)">rm</span> -rf ~/.docker/machine/machines/<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${VM}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
#set proxy variables </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> they exists
</span><span style="color: rgba(0, 0, 255, 1)">if</span> [ -n ${HTTP_PROXY+x} ]; <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
PROXY_ENV</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$PROXY_ENV --engine-env HTTP_PROXY=$HTTP_PROXY</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">fi</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> [ -n ${HTTPS_PROXY+x} ]; <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
PROXY_ENV</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$PROXY_ENV --engine-env HTTPS_PROXY=$HTTPS_PROXY</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">fi</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> [ -n ${NO_PROXY+x} ]; <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
PROXY_ENV</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$PROXY_ENV --engine-env NO_PROXY=$NO_PROXY</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">fi</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${DOCKER_MACHINE}</span><span style="color: rgba(128, 0, 0, 1)">"</span> create -d vmwareworkstation $PROXY_ENV <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${VM}</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">fi</span><span style="color: rgba(0, 0, 0, 1)">
STEP</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Checking status on $VM</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
VM_STATUS</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$(${DOCKER_MACHINE} status ${VM} 2>&1)</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> [ <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${VM_STATUS}</span><span style="color: rgba(128, 0, 0, 1)">"</span> != <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Running</span><span style="color: rgba(128, 0, 0, 1)">"</span> ]; <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${DOCKER_MACHINE}</span><span style="color: rgba(128, 0, 0, 1)">"</span> start <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${VM}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
yes </span>| <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${DOCKER_MACHINE}</span><span style="color: rgba(128, 0, 0, 1)">"</span> regenerate-certs <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${VM}</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">fi</span><span style="color: rgba(0, 0, 0, 1)">
STEP</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Setting env</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
eval </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$(${DOCKER_MACHINE} env --shell=bash ${VM})</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
STEP</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Finalize</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">clear</span>
<span style="color: rgba(0, 0, 255, 1)">cat</span> <<<span style="color: rgba(0, 0, 0, 1)"> EOF
## .
## ## ## </span>==<span style="color: rgba(0, 0, 0, 1)">
## ## ## ## ## </span>===
/<span style="color: rgba(128, 0, 0, 1)">"""""""""""""""""</span><span style="color: rgba(128, 0, 0, 1)">\___/ ===</span>
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /===- ~~~<span style="color: rgba(0, 0, 0, 1)">
\______ o __</span>/<span style="color: rgba(0, 0, 0, 1)">
\ \ __</span>/<span style="color: rgba(0, 0, 0, 1)">
\____\_______</span>/<span style="color: rgba(0, 0, 0, 1)">
EOF
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> -e <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${BLUE}docker${NC} is configured to use the ${GREEN}${VM}${NC} machine with IP ${GREEN}$(${DOCKER_MACHINE} ip ${VM})${NC}</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">For help getting started, check out the docs at https://docs.docker.com</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">echo</span><span style="color: rgba(0, 0, 0, 1)">
cd
docker () {
MSYS_NO_PATHCONV</span>=<span style="color: rgba(128, 0, 128, 1)">1</span> docker.exe <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$@</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}
export </span>-<span style="color: rgba(0, 0, 0, 1)">f docker
</span><span style="color: rgba(0, 0, 255, 1)">if</span> [ $# -eq <span style="color: rgba(128, 0, 128, 1)">0</span> ]; <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Start interactive shell</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
exec </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$BASH</span><span style="color: rgba(128, 0, 0, 1)">"</span> --<span style="color: rgba(0, 0, 255, 1)">login</span> -<span style="color: rgba(0, 0, 0, 1)">i
</span><span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Start shell with command</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
exec </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$BASH</span><span style="color: rgba(128, 0, 0, 1)">"</span> -c <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$*</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">fi</span></pre>
</div>
<p>3.打开<span style="color: rgba(255, 0, 0, 1)"><strong>git-bash</strong></span>,输入以下命令:</p>
<p>3.1.<strong>docker-machine ls</strong></p>
<p>检查是否有machine实例,如果有,请自行考虑是否卸载它。</p>
<p><img src="https://images2015.cnblogs.com/blog/402416/201707/402416-20170703174024800-853628615.png" alt=""></p>
<p>3.2.<strong>docker-machine stop <span style="color: rgba(255, 0, 0, 1)">dev</span> && docker-machine rm <span style="color: rgba(255, 0, 0, 1)">dev</span></strong></p>
<p>暂停并且卸载NAME为dev的machine实例。此处的dev每个人都不同,可能是default或其它,具体看docker-machine ls命令列出来的数据。</p>
<p><img src="https://images2015.cnblogs.com/blog/402416/201707/402416-20170703174914972-685664745.png" alt=""></p>
<p>3.2.1.<strong>docker-machine create --driver=<span style="color: rgba(255, 0, 0, 1)">vmwareworkstation dev</span></strong></p>
<p>创建一个名称为dev的machine实例。</p>
<p><img src="https://images2015.cnblogs.com/blog/402416/201707/402416-20170703175243581-1062267881.jpg" alt=""></p>
<p>3.2.2.当然了,如果你做了2.1步骤的动作,你也可以不做3.2.1步骤的动作。</p>
<p>而是直接在你的桌面上找到一个名为"Docker Quickstart Terminal"的蓝色Docker命令行图标</p>
<p><img src="https://images2015.cnblogs.com/blog/402416/201707/402416-20170704095755706-251975942.png" alt="">,并且双击运行它。</p>
<p>首次运行它时,会检查你是否有创建一个名为"default"的实例,如果有,则直接启动命令操作界面,如果没有,则帮你创建并且初始化一个名为"default"的实例,并且active为默认实例。</p>
<p><img src="https://images2015.cnblogs.com/blog/402416/201707/402416-20170704095845081-1643291761.png" alt=""></p>
<p>当有一个默认的machine实例后,你通过docker命令所做的操作,都是对默认实例的操作。</p>
<p>3.3.<strong>docker-machine ls</strong></p>
<p>查看实例列表信息,在这里你可以看到实例的状态信息,包括版本,IP,名称等。</p>
<p>3.4.<strong>eval "$(docker-machine env dev)" && docker-machine active</strong></p>
<p>此处两个命令在同一个shell窗口分开执行,或一并执行都可以。</p>
<p>eval "$(docker-machine env dev)"这句话的意思是加载名为"dev"的machine实例的环境变量到当前的shell窗口。</p>
<p>docker-machine active的作用是,从上一句话加载进来的环境变量中获取到要激活的machine实例名称,并且激活它。</p>
<p><img src="https://images2015.cnblogs.com/blog/402416/201707/402416-20170704095911737-1115006508.png" alt=""></p>
<p>激活指定的machine实例为默认实例。一个docker只能有一个被激活的默认实例。</p>
<p>3.5.<strong>docker-machine ssh dev</strong></p>
<p>连接到machine实例之后,你可以使用docker命令进行任何受支持的操作...</p>
<p>例如docker push,pull等等....</p>
<p><span style="color: rgba(255, 0, 0, 1); font-size: 16px"><strong>PS:此处,如果你进行了3.2.2或3.4步骤的操作,可以不需要进行3.5步骤的操作。</strong></span></p>
<p><span style="color: rgba(255, 0, 0, 1); font-size: 16px"><strong>直接使用docker命令就可以正常使用docker开发了。</strong></span></p>
<p> </p>
<p>2017.09.20:更新了start.sh的错误</p>
<p>2019.09.01:windows10下,powershell执行不了`eval "$(docker-machine env dev)" && docker-machine active`</p>
<p>可以换个写法:`docker-machine env -shell=powershell dev | Invoke-Expression | docker-machine active` </p>
<p> </p>
<p><span style="font-size: 18px"><strong>参考资料</strong></span></p>
<p>https://docs.docker.com/machine/get-started</p>
<p>https://github.com/pecigonzalo/docker-machine-vmwareworkstation</p>
<p>http://www.cnblogs.com/yjmyzz/p/docker-machine-using-vmware.html</p>
<p> </p>
<p><span style="font-size: 18px"><strong>下载资源汇总</strong></span></p>
<p>InstallDocker.msi下载地址:</p>
<p>https://download.docker.com/win/stable/InstallDocker.msi</p>
<p>https://download.docker.com/win/stable/Docker for Windows Installer.exe</p>
<p>https://download.docker.com/win/edge/Docker for Windows Installer.exe</p>
<p>DockerToolbox.exe下载地址:https://download.docker.com/win/stable/DockerToolbox.exe</p>
<p> : https://github.com/docker/toolbox/releases/latest</p>
<p>boot2docker.iso下载地址:https://github.com/boot2docker/boot2docker/releases/latest</p>
<p>docker-machine-driver-vmwareworkstation.exe下载地址:https://github.com/pecigonzalo/docker-machine-vmwareworkstation/releases/latest</p>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
作者:VAllen<br>出处:http://www.cnblogs.com/vallen<br>本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。<br><b>唯有偏执者得以生存。</b>
<img src="http://www.cnblogs.com/images/xml.gif" style="display:none;" onload="var s3=document.createElement('script');s3.text=decodeURIComponent(escape(window.atob('JCgiPGRpdiBjbGFzcz0nYmRzaGFyZWJ1dHRvbmJveCcgc3R5bGU9J21hcmdpbi10b3A6MTBweDsnPjxhIGhyZWY9JyMnIGNsYXNzPSdiZHNfbW9yZScgZGF0YS1jbWQ9J21vcmUnPjwvYT48YSBocmVmPScjJyBjbGFzcz0nYmRzX3F6b25lJyBkYXRhLWNtZD0ncXpvbmUnPjwvYT48YSBocmVmPScjJyBjbGFzcz0nYmRzX3RzaW5hJyBkYXRhLWNtZD0ndHNpbmEnPjwvYT48YSBocmVmPScjJyBjbGFzcz0nYmRzX3RxcScgZGF0YS1jbWQ9J3RxcSc+PC9hPjxhIGhyZWY9JyMnIGNsYXNzPSdiZHNfcmVucmVuJyBkYXRhLWNtZD0ncmVucmVuJz48L2E+PGEgaHJlZj0nIycgY2xhc3M9J2Jkc193ZWl4aW4nIGRhdGEtY21kPSd3ZWl4aW4nPjwvYT48L2Rpdj4iKS5pbnNlcnRBZnRlcigiI015U2lnbmF0dXJlIik7d2luZG93Ll9iZF9zaGFyZV9jb25maWc9eyJjb21tb24iOnsiYmRTbnNLZXkiOnt9LCJiZFRleHQiOiIiLCJiZE1pbmkiOiIyIiwiYmRQaWMiOiIiLCJiZFN0eWxlIjoiMCIsImJkU2l6ZSI6IjMyIn0sInNoYXJlIjp7fSwiaW1hZ2UiOnsidmlld0xpc3QiOlsicXpvbmUiLCJ0c2luYSIsInRxcSIsInJlbnJlbiIsIndlaXhpbiJdLCJ2aWV3VGV4dCI6IuWIhuS6q+WIsO+8miIsInZpZXdTaXplIjoiMTYifSwic2VsZWN0U2hhcmUiOnsiYmRDb250YWluZXJDbGFzcyI6bnVsbCwiYmRTZWxlY3RNaW5pTGlzdCI6WyJxem9uZSIsInRzaW5hIiwidHFxIiwicmVucmVuIiwid2VpeGluIl19fTt3aXRoKGRvY3VtZW50KTBbKGdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF18fGJvZHkpLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKS5zcmM9J2h0dHA6Ly9iZGltZy5zaGFyZS5iYWlkdS5jb20vc3RhdGljL2FwaS9qcy9zaGFyZS5qcz92PTg5ODYwNTkzLmpzP2NkbnZlcnNpb249Jyt+KC1uZXcgRGF0ZSgpLzM2ZTUpXTs=')));s3.setAttribute('type','text/javascript');document.body.appendChild(s3);"/><br><br>
来源:https://www.cnblogs.com/VAllen/p/Docker-for-windows-on-VMware.html
頁:
[1]