前言

这是我在 QQ 群 325486037 里,碰到的一些问题及其解答,大多是初学 Docker 时常见的问题。其中的回答,是基于我学习和使用 Docker 过程中的一些认知,多数是遵循 Docker 官方的最佳实践的原则而进行的解答。由于个人能力所限,回答可能会片面或错误。如发现错误后,欢迎告诉我,以方便修正该文档避免误导他人,文档会不定期进行更新。

【更新:2017年10月31日】

Docker 引擎相关问题 (67)

概念问题 (5)

宿主如果和容器系统不同的话,那不是和虚拟机一样,一层层的调用,那么 Docker 和虚拟机还有什么差别?

要把 Windows 和 Linux 分清楚,更要把内核(kernel)和用户空间(userland)分清楚。

容器内的进程是直接运行于宿主内核的,这点和宿主进程一致,只是容器的 userland 不同,容器的 userland 由容器镜像提供,也就是说镜像提供了 rootfs

假设宿主是 Ubuntu,容器是 CentOSCentOS 容器中的进程会直接向 Ubuntu 宿主内核发送 syscall,而不会直接或间接的使用任何 Ubuntuuserland 的库。

这点和虚拟机有本质的不同,虚拟机是虚拟环境,在现有系统上虚拟一套物理设备,然后在虚拟环境内运行一个虚拟环境的操作系统内核,在内核之上再跑完整系统,并在里面调用进程。

还以上面的例子去考虑,虚拟机中,CentOS 的进程发送 syscall 内核调用,该请求会被虚拟机内的 CentOS 的内核接到,然后 CentOS 内核访问虚拟硬件时,由虚拟机的服务软件截获,并使用宿主系统,也就是 Ubuntu 的内核及 userland 的库去执行。

而且,Linux 和 Windows 在这点上非常不同。Linux 的进程是直接发 syscall 的,而 Windows 则把 syscall 隐藏于一层层的 DLL 服务之后,因此 Windows 的任何一个进程如果要执行,不仅仅需要 Windows 内核,还需要一群服务来支撑,所以如果 Windows 要实现类似的机制,容器内将不会像 Linux 这样轻量级,而是非常臃肿。看一下微软移植的 Docker 就非常清楚了。

所以不要把 Docker 和虚拟机弄混,Docker 容器只是一个进程而已,只不过利用镜像提供的 rootfs 提供了调用所需的 userland 库支持,使得进程可以在受控环境下运行而已,它并没有虚拟出一个机器出来。

参考:

视频笔记: Windows Server 和 Docker - John Starks

Docker 资料好少啊?网上的命令怎么不能用?

首先,做技术工作,请珍惜生命,远离百度;
其次,不翻墙、不用Google、不看英文资料,那请转行,没法混。

然后是回答问题,Docker的资料其实很丰富,特别是官方文档讲解非常详细。

另外,Docker有丰富的镜像库,Docker Hub,特别是官方(Official)的镜像可以直接在生产环境中使用,制作比较精良。

https://hub.docker.com/explore/

所有的官方镜像都有 Dockerfile,以及在github上有全部生成镜像的配套文件,遵循了Dockerfile的最佳实践,这些也是很好地学习资料。

另外,在 YouTube 的 Docker 官方频道下有几百个视频讲座,从初级到高级用户都能从里面学到很多东西。

https://www.youtube.com/user/dockerrun

如何选择 Docker 书籍?

Docker 属于敏捷开发的产品,并且处于高速创新阶段,每年都会有很多版本发布。由于这种快速开发的特性,Docker 一般只保留几个版本内的向后兼容性,再之后就会废弃。因此选择图书的时候,不应该选择比当前版本低超过2-3个版本的书籍。换句话说,市面上大部分书籍,特别是中文书籍、网文,很可能都过时了。

Docker 版本号在 2017 年以前,使用 <大版本号>.<小版本号>.<补丁版本号> 的结构,那时 Docker 基本会保持 3 个小版本号 之内的兼容性(如果一个特性宣布废弃,一般会在 3 个版本后才彻底移除)。

而从 2017 年春以后,Docker 使用了新版本号结构:<年>.<月>.<补丁版本号>,并且将每月发布一个前沿(Edge)版本,每季度发布一个稳定(Stable)版本。因此选择书籍也应该以介绍 2-3个季度以内版本 的书籍为准。那些介绍一年以前发布的 Docker 版本的书籍不应该再看了。

因此在购买 Docker 图书的时候,应该遵循这样的原则:观察一下当前的 Docker 版本号,选择不要晚于 3 个版本的 Docker 书籍。 比如写这段文字时为 17.06,那么就不要购买介绍 Docker 1.12 及其以前版本的书籍了,否则看到的很多东西可能将会因过时而无法使用,或者已经不必如此繁琐有更简单的方式去实现了。

所以,对于 Docker 学习而言,最好的书籍是官网文档,官网的文档很丰富。

部分文档有对应官方的中文翻译,可以从 https://docs.docker-cn.com 查看。但是一定要注意代码格式,中文文档中许多格式是错误的,应该对比英文文档中的代码来看。

对于新手而言,应该先从新手教程开始,内容还是很简单易懂的,很容易上手。然后,可以把用户文档好好看一遍,里面把很多 Docker 的基础概念讲的很清楚。概念清晰后,可以去把官网给出的例子好好的学习一下,这些例子都是具体怎么应用 Docker 的,有文字说明以及具体的考虑,很适合学习。

总说看官方文档,可是 Docker 官网文档经常被墙,看不了怎么办?

首先感谢伟大的墙及其先祖。

然后,我们可以本地运行 Docker 官方文档的网站,以 docker 的方式:

      
      
$ docker run -d -p 80:4000 docs/docker.github.io

这样访问 Docker 宿主的 80 端口,如 http://localhost,就会看到官网文档了。

对于那些访问不了我的问答录的童鞋,同样可以用这样的方式来本地运行:

      
      
$ docker run -d -p 80:80 twang2218/blog.lab99.org

然后就可以访问本地 80 端口看到最新的问答录了。

Docker 1.8 以后版本都有什么改进么?

每个版本发布时,官方博客 https://blog.docker.com 都会有专门文章描述这个版本最主要的改进。

另外,可以看一下孙宏亮维护的《Docker 中文 Changelog》

关于 Docker 1.13 可以看一下我写的《Docker 1.13 新增功能》

安装、配置问题 (8)

Docker 怎么这么多软件,我该装哪个?

好吧,我决定要装 Docker 了,于是来打开 Docker 安装文档 (中文 看看怎么装吧……呃,然后就傻了,怎么这么多种选择啊?!

首先,Docker 有好几个版本,社区版(Community Edition)、企业基础版(Enterprise Edition Basic)、企业标准版(Enterprise Edition Standard)、企业高级版(Enterprise Edition Advanced)。对于我们一般学习使用而言,使用社区版就已足够,所以记住CE就可以了。

其次,我们会看到一堆平台特定的版本,Docker for Mac、Docker for Windows、Docker Toolbox、Docker for Azure、Docker for AWS 等等,还有一堆不同 Linux 的发行版。那我们应该用哪个?其实不难选择,这都是平台特定的东西嘛,选择自己平台就完了