本书首先在技术层面深入分析了Docker背后的技术原理和设计思想,更想结合笔者所在团队的工作经验,理清Docker的技术脉络和内核原理,同时附加Docker生态圈的实际案例,以期对开发运维人员、容器云服务提供商以及Docker技术爱好者在技术选型、技术路线规划上有所帮助。
本书由浅入深,从基本原理入手,系统讲解了Docker 的原理、构建与操作。同时讲解了Docker 在实际生产环境中的使用,还探讨了Docker 的底层实现技术和基于Docker 的相关开源技术。
前4 章为基础内容,供用户理解Docker 和配置Docker 运行环境。
第5 章到第9 章为Docker 基本操作,主要讲解了Docker命令操作实例和Docker 命令实现原理。
第10 到第12 章为Docker 高级操作,介绍了Docker 内核相关知识点,适合高级用户参考其内核运行机制。
第13 章到第15 章给出了Docker 典型应用场景和实践案例。
本书既适用于具备Linux 基础知识的Docker 初学者,也适用于具有开发功底想深入研究Docker 内核的高级用户。书中所提供的实践案例,可供读者在实际生产环境部署时借鉴。
第4 章 如何安装Docker
4.1 安装Docker 前需要知道的事
安装Docker 是一件很容易的事情,但容易不代表随时随地就可以安装。 下面是在安装Docker
之前需要了解的注意事项。
1. Docker 只能运行在Linux 环境中
虽然我们可以在Windows 和Mac 操作系统中安装和使用Docker,但截止到目前,Docker 仍然
只能运行在Linux 内核中。这一限制来源于LXC 技术,因为Linux 是开源操作系统,所以我们可
以得知LXC 机制,从而抽象出Docker。反观Windows 和Mac,这两大操作系统仍然尚未开源,而
是否支持LXC,我们同样也不得而知。所以现阶段Docker 只能运行在Linux 内核中,或许在不久
的未来Docker 能原生态的出现在Windows 和Mac 系统中,但目前还无法做到这一点。
2. Docker 可以在Windows 和Mac 系统中使用
上面我们提到Docker 仅支持Linux 操作系统,但不意味着Docker 不能在Windows 和Mac 上
面使用。在开源社区中,有一个产品变相地解决了这个问题,就是boot2Docker。使用这个产品,
可以在Windows 和Mac 上面运行Docker(暂且我们可以先理解成Docker 可以在Windows 和Mac
上面运行,实际情况却并非如此),boot2Docker 的安装使用及其原理,我们会在后面的章节介绍。
3. 选择一个主机操作系统很重要
这是什么意思呢?我们知道Linux 内核版本相对固定,但Linux 操作系统就多了,如Ubuntu、
CentOS、Fedora、RedHat,等等。这些操作系统可能使用的是同一个版本的Linux 内核,但在内核
之外,又各有千秋。
Docker 官方建议使用Ubuntu 操作系统作为宿主系统,应该是看重了Ubuntu 默认支持AUFS
文件系统的缘故。其他系统同样可以运行Docker,只不过需做一些特殊配置。
4. 准备一个大硬盘
以现在的硬盘发展速度而言,500G、1T 基本是电脑的标配。如果这些硬盘空间都分配给
Docker,那肯定是没有问题的。但现实情况,很可能读者会使用一个VMWare 或Virtual box 这类
的虚拟软件,虚拟出一个Linux 来运行Docker,如果是这样的话,就提前建议读者多给这个虚拟
机分配些空间。如果读者用一台装有Linux 的实体机来运行Docker,那么就建议读者多给根目录
分配一些空间。
究其原因,是因为Docker 默认使用AUFS 文件系统来存储数据,这个文件系统会额外的产生
很多文件来维护文件分层信息,因此其保存的数据量会很大。比如说我们看到的image 可能仅有1
第4 章 如何安装Docker
13
个G,但为了维护这个image 的数据分层信息,AUFS 内部产生的数据量可能会有2G,或者3G。
所以准备个大硬盘,有备无患。
5. 读者应该具备一些Linux 操作知识
本书中,我们先假定读者是具有一定Linux 操作知识的人员。
无论是准备进行Docker 应用开发的中高级开发人员,还是可能会用到Docker 技术的运维人
员,都应具有一定的Linux 基础知识。例如可以熟练使用Linux 常用命令,可以熟练编写Shell 脚
本,有一定的代码阅读功底,能编写或者看懂Makefile 文件等。
本书的侧重点是讲解Docker 的使用,以及Docker 的运行机制。所以不会用很大的篇幅来介绍
Linux 的基础知识,这些知识在阅读本书之前应该有一些了解。至于代码的阅读功底,如果是读者
是运维人员,那么不做强求了解即可。但因为Docker 是使用Golang 语言开发的,所以如果读者是
开发人员,有Golang 开发使用经验将是最好的;若没有Golang 使用经验的话,那么建议至少有看
懂C/C++的能力,有使用面向对象语言(例如Java)的经验。
4.2 Linux 平台安装Docker
本节将介绍如何在Linux 平台上安装Docker。我们假定主机操作系统是Ubuntu,所以后续所
有操作都将默认在Ubuntu 系统上面执行。而在本节的最后,我们将简要介绍一下如何在其他Linux
系统中安装Docker。
1. 安装Docker
在安装之前,需要确认当前Ubuntu 版本。Docker 目前支持Ubuntu 以下版本:
Ubuntu Wily 15.10
Ubuntu Vivid 15.04
Ubuntu Trusty 14.04(TLS)
Ubuntu Precise 12.04(TLS)
Ubuntu Saucy 13.10
同时Docker 要求必须为64 位操作系统,同时Linux 内核版本最小为3.10。(3.10 以下的内核
存在一些bug,在某些特定场景中有可能会引起容器中的数据丢失)
如果读者不确定当前所使用的操作系统版本号,那么可以通过下面的方式查询:
在终端中执行:cat /etc/issue
或者
在终端中执行:sudo lsb_release –a(执行此命令要求具有管理员权限)
如何查询当前Linux 内核版本号?在终端中执行 uname –r 即可看到内核版本号。
在上述几个Ubuntu 版本中,我们建议使用Ubuntu Trusty 14.04. 因为这个版本是目前最为稳定
的版本,其中Docker 运行所需的各种动态库和内核也最为完整,即在这个版本上面安装Docker,
不需要任何其他多余的步骤,安装最为方便简单。
① 首先登录一个具有sudo 权限的账户,建议使用root 创建一个Docker 用户,并赋予其sudo
权限。
② 执行下面的命令,检查是否安装wget 工具。
$ which wget
如果安装了wget,那么将看到wget 的路径。反之,则会提示没有wget。如果没有安装wget,
则执行下面的命令安装wget:
Docker 全攻略
14
$ sudo apt-get update
$ sudo apt-get install wget
③ 安装完wget 之后,我们就可以使用wget 来获取Docker 安装包了:
$ wget -qO- https://get.Docker.com/ | sh
执行完上面的命令,系统就会下载Docker 安装包及其依赖包,并自动安装。
④ 当安装完成后,执行下面的命令可验证是否安装成功:
$ sudo Docker run hello-world
执行这条命令后,如果Docker 安装成功,将看到屏幕输出如下信息:
Hello from Docker.
This message shows that your installation appears to be working correctly.
……
这就表示Docker 已经安装成功,后面就可以开始Docker 使用之旅了。
2. 更新Docker
Docker 版本迭代速度很快,如果发现有新的Docker 版本了,并且想尝试新的Docker 功能时,
可以执行下面的命令升级Docker:
$ wget -qO- https://get.Docker.com/ | sh
3. 卸载Docker
当你不再需要Docker 的时候,可以执行下面的命令卸载Docker。
① 卸载Docker 安装包:
$ sudo apt-get purge lxc-Docker
② 卸载Docker 安装包和Docker 所有的依赖模块
$ sudo apt-get autoremove --purge lxc-Docker
以上两条命令,仅仅是删除了安装包和依赖包,Docker 所存储的image、container 以及Docker
所创建的配置文件,都还保留在系统目录下。执行下面的命令可以彻底清除Docker 所保留的数据:
$ rm -rf /var/lib/Docker
执行rm 操作时一定要谨慎,千万要确认后面的目录路径是否正确!
4. 配置Docker
这部分内容属于Docker 高级安装选项了,通常情况下Docker 默认的参数就可以满足使用,如
果读者想对Docker 进行定制化安装配置,那么建议参阅以下内容。
① 创建Docker 组
默认情况下,Docker Daemon 会监听本地的一个Socket 文件。而这个socket 文件通常是由root
用户来创建的,其他用户对其并没有读写权限。因而在执行Docker 命令时,就需要使用sudo 来进
行操作。也正因为这个原因,Docker daemon 需要使用root 用户来启动。
为了回避这个问题,建议读者创建一个Docker group,然后将Docker 用户添加到这个group
中。这样再启动Docker daemon 时,就可以回避掉socket 文件没有读写权限的问题。
下面的命令执行后,就会创建一个Docker 组,并且将指定用户添加到组内。
第4 章 如何安装Docker
15
$ groupadd Docker
$ usermod -aG Docker Ubuntu #ubuntu 表示的是用户名
② 调整内存和SWAP 参数
在使用Docker 过程中,可能会出现下面的警告:
WARNING: Your kernel does not support cgroup swap limit. WARNING: Your
kernel does not support swap limit capabilities. Limitation discarded.
启用系统中内存和SWAP 统计功能后,就可以解决这个问题。
使用GNU GRUB(GNU Grand Unified Bootloader)来启用这项功能的步骤如下。
1)首先使用具有系统管理员权限的用户登录到系统中;
2)编辑/etc/default/grub 文件;
3)修改GRUB_CMDLINE_LINUX 参数:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
4)保存并退出编辑;
5)执行sudo update-grub 来更新grub;
6)重启系统
③ 调整UFW(Ubuntu Fire Wall)参数
如果你的Ubuntu 系统启用了UFW,那么就需要单独配置一下Fire Wall 的参数。Docker 默认
使用桥接转发方式来管理container 之间的网络连接。在默认情况下,UFW 是拒绝所有转发请求的,
因此如果你想从另外一个主机访问到这台主机上面的容器,那么就需要UFW 允许外来的网络请求
访问到Docker daemon 服务端口(此端口默认是2375)。
按照以下步骤可以调整UFW 参数:
1)首先使用具有系统管理员权限的用户登录到系统中;
2)执行$sudo ufw status,确认UFW 已经安装并且启用;
3)编辑/etc/default/ufw 文件;
4)修改DEFAULT_FROWARD_POLICY 参数:
DEFAULT_FORWARD_POLICY="ACCEPT"
5)保存并且退出;
6)重新加载UFW;
$ sudo ufw reload
7)允许2375 端口可以被外网访问:
$ sudo ufw allow 2375/tcp
第一篇 Docker简介
第1章 Docker的前世今生2
1.1 什么是LXC2
1.2 Docker为什么选择了AUFS2
1.3 Docker是如何产生的3
第2章 Docker现状5
2.1 Docker应用范围5
2.2 Docker的优缺点6
第3章 Docker将如何改变未来8
第二篇 Docker基础
第4章 如何安装Docker12
4.1 安装Docker前需要知道的事12
4.2 Linux平台安装Docker13
4.3 MAC/OS平台安装Docker15
4.4 Windows平台如何支持Docker20
4.5 在其他平台中安装Docker23
第5章 Docker基本命令28
5.1 Docker操作命令28
5.2 Docker网络命令83
5.3 Docker 安全命令86
5.4 Docker 资源命令87
5.5 Docker RestFul命令95
5.6 Docker组件命令190
第6章 Docker命令剖析205
6.1 Docker操作命令216
6.2 Docker网络命令389
6.3 Docker安全命令416
6.4 Docker资源命令422
第7章 Dockerfile介绍468
7.1 Dockerfile有什么用468
7.2 如何编写Dockerfile470
第8章 Dockerfile最佳实践481
第9章 Docker部署案例489
第三篇 Docker进阶
第10章 Docker运行剖析494
10.1 Docker的生命周期494
10.2 Docker Daemon496
10.3 Docker CLI498
第11章 Docker内核讲解500
11.1 Docker背后的Namespace500
11.2 Docker的文件系统505
11.3 Docker的image管理508
第12章 Docker资源调度513
12.1 Docker如何管理资源513
12.2 Docker资源管理器516
第四篇 Docker生态圈
第13章 Docker的云生态环境520
13.1 Docker的开发语言520
13.2 支持Docker的开源组件525
13.3 CoreOS、Vagrant和Amazon如何支持Docker526
第五篇 Docker案例
第14章 基于Amazon的Docker部署案例530
第15章 基于CoreOS的Docker部署案例532