追梦人物❤️包子 博主
一直走在追梦的路上。

用 Windows 跟着官方教程学 Docker 之一步一坑记

2017-06-1015684 阅读10 评论

据说 Docker 可以提供一种更加现代化的部署方式,于是乎想趁着一个空闲周末来好好撸一遍 Dcoker 入门文档。之前花了一个小时通读了一遍 Docker 的官方入门教程 Get Started,理解了一些 Docker 的一些核心概念,但俗话说实践出真知,由于手头只有 Windows 环境,正好看到 Docker 也是支持 Windows 的,于是就在 Windows 上操起命令行开始按照官方教程的指导干了起来,没想到一步一坑,一命令一卡,搜遍 Google 和 Docker 的 issue 列表后总算是走完了全程。在此做一记录,以免后来者入坑。

环境介绍

操作系统:Windows 10 专业版 64 位,6 G 内存

Docker 版本:Docker version 17.03.1-ce, build c6d412e(Docker for Windows 最新稳定版)

坑一之安装 Docker

要想使用 Docker,第一步是安装 Docker(废话),不过安装 Docker 也可能遇坑。首先在 Docker Community Edition for Windows 下载 Docker for Windows 版本。下载完后双击安装,和安装普通的 Windows 软件完全一样,不过如果人品差一点(比如我),就可能遇到安装失败信息。Docker 提示我 Hyper-V 没有启用。好在这个提示比较明确,虽然一不知道 Hyper-V 是个什么东西,但是稍微百度一下就出来了。在 BIOS 中启用虚拟化功能后开启 Hyper-V 即可。这个坑还算比较好解决。

坑二之 Hello World

Docker 总算安装好了,国际惯例,运行一个 Hello World 来看看是否安装正确。作为一名程序员,第一次在 Hello World 上遇坑,感觉智商收到了严重侮辱。具体是当按照官方文档输入 Hello World 命令后,Docker 提示:

$ docker run hello-world

Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
See 'docker run --help'.

无论试多少次,返回同样的信息,简直日了狗。初步怀疑是网络问题,毕竟在天朝。但是即便是启用了翻墙工具,错误依旧。Google 了很久也没解决,有的说修改 DNS 解决了问题,有的说重装 Docker 解决了问题,但是按照这些方法操作后问题依旧。最后在 Pythonzhcn 社区提了个问, Docker 在国内是不是无法使用? 经高人一句提醒确实是网络问题,不过好在 Docker 还有国内镜像源,于是使用了 DouCloud 的 加速器 服务后,终于顺利地运行了 Hello World。

坑三之登录 Docker Cloud

当然顺利地运行了 Hello World 只是万里长征第一步。接下来就是复制粘贴工作,创建镜像(Dockerfile 文件),写个小小的 Flask 应用,然后在 Docker 容器里运行,这都很顺利。接着 Docker 告诉我们,目前只是小儿科的东西,为了体现 Docker 的 portability,一次构建到处运行的特性,Docker 让我们把刚才的镜像推送到云端,这里坑就来了。首先你要去 Docker 注册一个账户,然后在命令行输入 docker login,可能是网络问题,再次得到:

docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
See 'docker run --help'.

一万只草泥马!好在这次启用深度翻墙软件,多试几次终于登陆成功了。最后我发现一个规律,使用命令 docker login --username=xxx --password xxx https://hub.docker.com 将比直接使用 docker login 然后输入用户名密码的登录成功率更高,不过依然看人品!

坑四之启动虚拟机集群

OK!总算成功登录 Docker 云,镜像也 push 上去了,一路跟着教程走很顺畅,进入到了启用集群的部分,按照教程创建了两个虚拟机:

$ docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1
$ docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm2

但是,虚拟机是创建了,Docker 没有帮我们自动启动!使用 docker-machine start 命令来启动始终失败!

$ docker-machine start myvm1
Starting "myvm1"...
exit status 1

无论如何都不成功!好在 Windows 有一个 Hyper-V 管理器,Docker 启动不了虚拟机我手动启动吧。于是进入管理界面手动启动了创建的两个虚拟机,这个坑总算以笨办法解决了!

坑五之 Stack

以下是官网对 Stack 的介绍:

A stack is a group of interrelated services that share dependencies, and can be orchestrated and scaled together. A single stack is capable of defining and coordinating the functionality of an entire application (though very complex applications may want to use multiple stacks).

简单来说就是一些列互相联系的服务的集合,确实是个好东西,赶快按照官方教程来部署吧!然而在需要把 docker-compose.yml 复制到集群机的主机 myvm1 时遇到了问题:

$ docker-machine scp docker-compose.yml myvm1:~
You must have a copy of the scp binary locally to use the scp feature

You must have a copy of the scp binary locally to use the scp feature,日了狗,这些都是些什么东西,完全不懂,只能狗带。先是跟着错误提示去 Google 搜一搜,果然遇到这个问题的不止我一个。一些人说他也遇到了这个问题,但是把 Windows 的 cmd 工具换成 Git Bash 解决了问题。于是按照他的方法换了 Git Bash,但是在 Git Bash 总是提示我虚拟机没有开启,但我明明开启了呀!看来这方法行不通。

接着就搜 Docker 的 issue 列表,得到了一个核心开发者的回答,you need install Docker Tools. 原来还有这个个东西,赶紧从官网下载了 Docker Tools for Windows,Docker Tools 安装后会在桌面创建一个开启命令栏的快捷方式,这个命令栏中设置了一些 Docker 的预环境,让你运行 Docker 命令更加顺畅,但是当我启动时遇到了问题:

Running pre-create checks...
Error with pre-create check: "Hyper-V is installed. VirtualBox won't boot a 64bits VM when Hyper-V is activated. If it's installed but deactivated, you can use --virtualbox-no-vtx-check to try anyways"
Looks like something went wrong in step ´Checking if machine default exists´

按照错误提示搜到了这篇文章 Installing Docker Toolbox on Windows with Hyper-V Installed,原来是要修改一下 Docker Tools 的启动脚本,但是按照文章中的方法修改后,得到的结果是一运行脚本 Windows 就蓝屏。没办法,只好研究一下这个 shell 脚本,虽然对 shell 一窍不通,不过最终还是让我发现了问题所在,关键是这一行:

"${DOCKERMACHINE}" create -d virtualbox $PROXYENV "${VM}"

脚本用 virtualbox 创建了一个 default 虚拟机,但是我们使用的是 Hyper-V,把命令修改成如下的形式(管理员模式下才能修改文件):

"${DOCKER_MACHINE}" create -d hyperv $PROXY_ENV "${VM}"

总算可以顺利启动了,顺带着在 Docker Tools 提供的命令栏工具下运行教程中的命令,以上的问题也都解决了。

总结

解决以上坑后,总算顺利地走完了教程中的全部流程。虽然读一遍教程只要 1 个小时,但实际操作一遍花了 1 天!不过总算是有收获,对 Docker 的工作方式也有了更深的理解,接下来就是把 Docker 用于实际项目中了。此外,Pythonzncn 社区开通了一个 Docker 版块,希望 Docker 大神们和 Docker 初学者来分享和讨论 Docker 有关的话题。

总体来说,在安装完 Docker 后,紧接着安装 Docker Tools,并根据坑五的指导修改一下启动脚本,以后所以命令在 Docker Tools 提供的命令工具栏中运行会少很多坑。还有就是使用 DouCloud 的加速器服务。

后记

另外还有两个小地方需要注意,教程中有一处需要从 GitHub 仓库拉取 boot2docker.iso 保存到 .docker\machine\cache 目录下,这个文件将用来创建虚拟机。由于这个文件位于亚马逊的云存储服务器上,即时开启梯子下载速度也十分缓慢,直接复制下载链接后使用浏览器的下载工具下载速度快很多,下载完后把 boot2docker.iso 复制到 .docker\machine\cache 目录下即可。

还有一个就是为了让 Docker 可以访问本机的文件,需要在 settings 中的 Shared Drives 下开启允许 Docker 访问的启动器。

就这些了!还有什么坑,欢迎分享到 Pythonzncn 社区的 Docker 版块,救人一命胜造七级浮屠!

-- EOF --

10 评论
登录后回复
oppos69
2017-11-13 22:32:31

 docker run -p 8080:80 -v //e/workspace/docker/practical_docker/pencilbox/web:/usr/share/nginx/html -d nginx
大哥这个命令我执行成功了 但是文件好像没有拷贝进去。

回复
追梦人物 oppos69
2017-11-14 18:08:50

好久不用 Docker 了,翻翻官网文档看看吧。

回复
侯梓煜 oppos69
2017-11-15 11:20:17

-v 是挂载的意思。不是拷贝 - - 

回复
李繁
2017-06-14 19:17:02

Windows的话用win10,

回复
追梦人物
2017-06-12 14:52:44

马上会发一篇文章出来讲解做法。

回复
杯具的NoNo
2017-06-12 14:25:38

您好,博主,请问您现在这个blog的detail页面的文章目录是怎么实现的?

回复
李伟
2017-06-11 19:27:08

学习了博主的Django的博客教程,应该算是对Django入门了吧。真心觉着博主的教程详细、易懂,在网上很难找到这样的良心教程,感激。有个小建议,觉着博主可以尝试着在Linux操作系统上进行开发和测试,大多开源软件的原始环境都是基于LInux的,再者以后工作中肯定大部分都是Linux的服务器,毕竟现在服务器是Linux的天下,我觉着不管对博主自己还是对看教程的朋友们都有益处吧,这仅仅是个人的一点建议哈。BTW:如果手头没有空闲的LInux服务器,可以用vmware开个Linux虚拟机也好,挺好用的,个人一直在用。

回复
追梦人物 李伟
2017-06-11 20:27:49

嗯,主要是个人习惯了,平时开发不多,觉得 windows 够用,所以一直没切换环境。不过你这个建议确实非常好,我会慢慢切过来的。

回复
Bivectorfoil 李伟
2017-06-17 20:39:38

我可以补充一下,我平时学习的机器是Ubuntu16.04 ,4G内存,64位的。也是一路跟着博主的教程学习过来,除了部署哪里的步骤不同(我用heroku部署),其他基本一样,目前没有发现什么大问题,运行良好。不知这算不算一个小测试呢?

回复
追梦人物 Bivectorfoil
2017-06-17 21:33:28

very good!

回复