1.1 宿主如果和容器系统不同的话,那不是和虚拟机一样,一层层的调用,那么 Docker 和虚拟机还有什么差别?
要把 Windows 和 Linux 分清楚,更要把内核(kernel)和用户空间(userland)分清楚。
容器内的进程是直接运行于宿主内核的,这点和宿主进程一致,只是容器的 userland 不同,容器的 userland 由容器镜像提供,也就是说镜像提供了 rootfs。
假设宿主是 Ubuntu,容器是 CentOS。CentOS 容器中的进程会直接向 Ubuntu 宿主内核发送 syscall,而不会直接或间接的使用任何 Ubuntu 的 userland 的库。
这点和虚拟机有本质的不同,虚拟机是虚拟环境,在现有系统上虚拟一套物理设备,然后在虚拟环境内运行一个虚拟环境的操作系统内核,在内核之上再跑完整系统,并在里面调用进程。
还以上面的例子去考虑,虚拟机中,CentOS 的进程发送 syscall 内核调用,该请求会被虚拟机内的 CentOS 的内核接到,然后 CentOS 内核访问虚拟硬件时,由虚拟机的服务软件截获,并使用宿主系统,也就是 Ubuntu 的内核及 userland 的库去执行。
而且,Linux 和 Windows 在这点上非常不同。Linux 的进程是直接发 syscall 的,而 Windows 则把 syscall 隐藏于一层层的 DLL 服务之后,因此 Windows 的任何一个进程如果要执行,不仅仅需要 Windows 内核,还需要一群服务来支撑,所以如果 Windows 要实现类似的机制,容器内将不会像 Linux 这样轻量级,而是非常臃肿。看一下微软移植的 Docker 就非常清楚了。
所以不要把 Docker 和虚拟机弄混,Docker 容器只是一个进程而已,只不过利用镜像提供的 rootfs 提供了调用所需的 userland 库支持,使得进程可以在受控环境下运行而已,它并没有虚拟出一个机器出来。
参考:
(英文): https://www.docker.com/what-docker
(中文): https://www.docker-cn.com/what-docker
1.2 Docker 资料好少啊?网上的命令怎么不能用?
首先,做技术工作,请珍惜生命,远离百度;
其次,不FQ、不用Google、不看英文资料,那请转行,没法混。
然后是回答问题,Docker的资料其实很丰富,特别是官方文档讲解非常详细。
(英文): https://docs.docker.com/
(中文): https://docs.docker-cn.com (文档有坑,不少代码格式有错)
(老麦的翻译): https://www.gitbook.com/read/book/octowhale/docker-doc-cn
另外,Docker有丰富的镜像库,Docker Hub,特别是官方(Official)的镜像可以直接在生产环境中使用,制作比较精良。
https://hub.docker.com/explore/
所有的官方镜像都有 Dockerfile,以及在github上有全部生成镜像的配套文件,遵循了Dockerfile的最佳实践,这些也是很好地学习资料。
另外,在 YouTube 的 Docker 官方频道下有几百个视频讲座,从初级到高级用户都能从里面学到很多东西。
https://www.youtube.com/user/dockerrun
1.3 如何选择 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.com/get-started/
(中文):https://docs.docker-cn.com/get-started/
(老麦的翻译):https://docs-cn.docker.octowhale.com/get_started/001.Orientation.html
Docker 课程:http://training.play-with-docker.com/
运维人员课程:http://training.play-with-docker.com/ops-landing/
开发人员课程:http://training.play-with-docker.com/dev-landing/
大量的例子:
(英文):https://docs.docker.com/samples/
(中文):https://docs.docker-cn.com/samples/
用户文档:
(英文):https://docs.docker.com/engine/userguide/
(中文):https://docs.docker-cn.com/engine/userguide/
镜像:
(英文):https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/
(老麦的翻译):https://docs-cn.docker.octowhale.com/engine/userguide/eng-image/dockerfile_best-practices.html
存储:https://docs.docker.com/engine/userguide/storagedriver/
网络:https://docs.docker.com/engine/userguide/networking/
管理文档:https://docs.docker.com/engine/admin/
存储:https://docs.docker.com/engine/admin/volumes/
安全:https://docs.docker.com/engine/security/security/
集群:https://docs.docker.com/engine/swarm/
部分文档有对应官方的中文翻译,可以从 https://docs.docker-cn.com 查看。但是一定要注意代码格式,中文文档中许多格式是错误的,应该对比英文文档中的代码来看。
对于新手而言,应该先从新手教程开始,内容还是很简单易懂的,很容易上手。然后,可以把用户文档好好看一遍,里面把很多 Docker 的基础概念讲的很清楚。概念清晰后,可以去把官网给出的例子好好的学习一下,这些例子都是具体怎么应用 Docker 的,有文字说明以及具体的考虑,很适合学习。
1.4 总说看官方文档,可是 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 端口看到最新的问答录了。
1.5 Docker 1.8 以后版本都有什么改进么?
每个版本发布时,官方博客 https://blog.docker.com 都会有专门文章描述这个版本最主要的改进。
1.9: https://blog.docker.com/2015/11/docker-1-9-production-ready-swarm-multi-host-networking/
1.10: https://blog.docker.com/2016/02/docker-1-10/
1.11: https://blog.docker.com/2016/04/docker-engine-1-11-runc/
1.12: https://blog.docker.com/2016/06/docker-1-12-built-in-orchestration/
另外,可以看一下孙宏亮维护的《Docker 中文 Changelog》:
1.10: https://github.com/allencloud/docker-changelog-chinese/blob/master/docker-1.10.0-changelog.md
1.11: https://github.com/allencloud/docker-changelog-chinese/blob/master/docker-1.11.0-changelog.md
1.11.1: https://github.com/allencloud/docker-changelog-chinese/blob/master/docker-1.11.1-changelog.md
1.12: https://github.com/allencloud/docker-changelog-chinese/blob/master/docker-1.12.0-changelog.md
关于 Docker 1.13 可以看一下我写的《Docker 1.13 新增功能》。