Docker作为一个2013年才诞生的开源项目,其发展的速度和火爆程度却令人惊叹。容器技术本不是什么新鲜事物,但是在Docker的整合下,一切变得清晰、易用起来,并且随着各大云计算厂商的进场,使Docker得到了极大的推广。如今,Docker已经成为容器技术领域当仁不让的领头羊。国内外以Docker技术起家的创业公司如雨后春笋般涌现出来,体现了容器市场的巨大需求。越来越多的企业开始逐步把传统的应用开发流程迁移到Docker容器中作为开发部署流程的一环。伴随而来的是各种复杂的需求与Docker尚不算完善的功能所产生的矛盾,这些问题制约着企业容器化的脚步。另一方面,Docker以其友好的使用体验使广大开发者对其“一见倾心”,越来越多的开发者使用Docker作为应用分发部署的一个重要阵地。尽管如此,Docker对于大部分开发者而言还是尚未开拓的疆土。特别是对于国内环境而言,Docker的推广基本上靠国内几家与Docker相关的初创公司。
本书以一位普通的全栈开发者的身份,详细介绍了Docker的基础知识,分享了企业级容器云的实战经验。为什么学习Docker如果您是一名开发者,想必遇到过“这个程序只有在我的机器上才可以运行”的情况。随着用户需求变得多样,软件愈发复杂,所依赖环境愈发庞大,使得软件在其他机器上运行需要做大量的迁移工作。更糟糕的是,这些琐事完成后软件还不一定能正常运行。为了解决这些问题,虚拟化技术开始普及。人们可以通过各种虚拟化技术来实现软件的迁移和分发。最常见的就是虚拟机或KVM技术。在虚拟机里完成开发再迁移到线上不会出现环境问题,解决了迁移过程中的诸多难题,但是仍然存在性能低下、分发流程麻烦、耗时和成本昂贵等问题。在云计算时代这些问题更加突出。
随着容器技术的普及,人们意识到容器技术可以极大地降低成本。容器技术具有启动快、体积小和分发迅速等诸多特点,这简直就是开发人员梦寐以求的工具。 而“欣喜若狂”的不止是开发人员,还有运维人员。如果在十年前,普通企业要管理上百台服务器,最可能使用的方法是通过Shell脚本的方式使用SSH连接到所有服务器然后执行相同的指令,并把日志保存起来归档。这种方式我们称之为第一代运维。那时维护服务器是一项繁重的工作,工程师不得不把大量的时间耗费在服务器管理上。随着技术的发展,虚拟化技术的普及和云计算的出现,企业需要管理的服务器数量大幅增长。过去我们只要管理企业内部数据中心的物理服务器,而现在则要管理遍布全球的服务器,运维成本愈发昂贵。于是开发者开始针对云计算时代服务器运维方式做出改变,涌现出了诸如Ansible、Puppet、SaltStack和Chef等出色的运维工具。人们可以通过这些工具快速地完成对上百台甚至上千台服务器的管理操作。这被称之为第二代运维。它极大地解决了管理庞大服务器集群的难题,使人们可以在屏幕面前通过一个界面管理所有服务器。但本质上这些工具都是通过SSH或者类似于SSH的方式连接到服务器来管理服务器集群,这意味着其实第二代运维和第一代运维并没有发生根本性的改变。
上面那些运维工具在云计算普及的大势下很快暴露了它们的问题——速度。因为大部分运维工具依靠的是SSH连接来交换信息,这使得整个过程十分耗时,更不用说其他复杂的管理操作。而随着容器技术的爆发,以Docker为代表的容器技术开始发力,并随着DevOps概念的普及,使运维发生了根本性的改变。容器集群管理不再是通过低效的SSH来连接服务器,甚至不需要登录服务器就可以完成对服务器的管理。人们发现,通过容器管理集群可以抛弃传统的“SSH+秘钥”的连接方式来连接服务器,这对大规模集群来说是一个极大的变革。而且在速度上,容器技术在上百台服务器上启动应用只需要一眨眼的时间,这使得运维的工作大大减轻。
运维和开发在容器时代逐步“融为一体”,形成一个流水线车间的工作环境。这对于软件行业来说无疑是一次巨大的变革。
如果您也对传统的软件开发和运维的烦琐流程感到吃力,又对容器技术感兴趣,那么本书将是很好的入门书籍。如果您不是职业的开发和运维人员,对Linux也不算熟悉,但属于一个对Docker感兴趣的极客,想通过Docker部署一些复杂的应用,本书也一样适合您。本书虽以Linux为平台介绍Docker的使用,但是与在Windows和Mac OS平台上的操作基本一致,普通用户完全可以把Docker当做一个“好玩的工具”来使用,体验Docker带来的便捷。
本书适合新手入门,本书在基础方面内容非常详尽,包括镜像的构建、容器的运行监控、网络的管理、仓库的应用、集群的部署等内容,全面、细致地介绍了Docker的基本使用方法与实现原理,适合新手入门。 应用结合实际。本书在实战应用部分结合实际应用,从不同的角度分析问题并提出对应的解决办法,扩展了很多实用的实战技巧。实战部分根据不同类型的开发环境构建基础开发环境镜像,使读者可以直接使用Docker进入测试开发,并根据不同类型的应用部署做了详细介绍。
前言
第1篇 容器技术与Docker概念
第1章 容器技术2
1.1 什么是容器2
1.1.1 关于虚拟化2
1.1.2 容器的定义3
1.1.3 为什么使用容器3
1.2 容器技术的前世今生4
1.2.1 容器技术的起源4
1.2.2 容器技术的发展5
1.3 容器的原理7
1.3.1 从namespace说起7
1.3.2 认识Cgroups9
1.3.3 容器的创建11
1.4 容器云12
1.5 容器与Docker13
1.6 本章小结13
第2章 Docker简介14
2.1 什么是Docker14
2.1.1 Docker的历史14
2.1.2 Docker的现状16
2.1.3 Docker的未来17
2.2 Docker的功能及优缺点18
2.2.1 Docker在解决什么18
2.2.2 为什么选择Docker19
2.2.3 Docker的缺点19
2.3 Docker和虚拟机19
2.3.1 Docker与虚拟机的区别20
2.3.2 Docker与虚拟机的优缺点20
2.4 Docker与runC21
2.4.1 libcontainer与runC21
2.4.2 runC的使用22
2.4.3 runC原理22
2.5 Docker基本架构24
2.5.1 Docker Client介绍24
2.5.2 Docker daemon介绍25
2.5.3 Docker镜像25
2.5.4 Docker容器26
2.5.5 Docker仓库26
2.6 本章小结26
第3章 安装Docker27
3.1 Linux系统27
3.1.1 一键安装脚本27
3.1.2 Debian发行版28
3.1.3 Ubuntu发行版30
3.1.4 Centos/Fedora发行版33
3.1.5 Arch Linux发行版37
3.1.6 Suse/openSUSE发行版38
3.2 Windows与Mac OS系统38
3.2.1 在Windows上安装原生Docker39
3.2.2 在Mac OS上安装原生Docker41
3.3 二进制安装43
3.3.1 获取Linux二进制包44
3.3.2 获取Mac OS X二进制包44
3.3.3 获取Windows的二进制包45
3.3.4 树莓派安装Docker45
3.4 本章小结46
第2篇 Docker基础知识
第4章 Docker基础48
4.1 Docker基本操作48
4.1.1 依附容器的docker attach命令49
4.1.2 构建镜像的docker build命令51
4.1.3 提交容器的docker commit命令52
4.1.4 复制文件到宿主机的docker cp命令52
4.1.5 创建容器的docker create命令53
4.1.6 查看容器变化的docker diff命令54
4.1.7 查看事件的docker events命令54
4.1.8 进入容器的docker exec命令55
4.1.9 导出容器的docker export命令56
4.1.10 查看镜像历史的docker history命令56
4.1.11 查看本地镜像的docker images命令57
4.1.12 导入容器的docker import命令58
4.1.13 查看Docker信息的docker info命令58
4.1.14 查看各项详细信息的docker inspect命令59
4.1.15 杀死容器的docker kill命令60
4.1.16 导入镜像的docker load命令60
4.1.17 登录仓库的docker login命令61
4.1.18 登出仓库的docker logout命令61
4.1.19 查看容器日志的docker logs命令62
4.1.20 管理网络的docker network命令62
4.1.21 管理节点的docker node命令63
4.1.22 暂停容器的docker pause命令64
4.1.23 查看容器端口的docker port命令64
4.1.24 查看本地容器信息的docker ps命令65
4.1.25 拉取镜像的docker pull命令65
4.1.26 推送镜像的docker push命令66
4.1.27 重命名容器的docker rename命令66
4.1.28 重启容器的docker restart命令66
4.1.29 删除容器的docker rm命令67
4.1.30 删除镜像的docker rmi命令67
4.1.31 运行容器的docker run命令68
4.1.32 导出镜像的docker save命令72
4.1.33 搜索镜像的docker search命令73
4.1.34 管理服务的docker service命令74
4.1.35 启动容器的docker start命令74
4.1.36 查看容器状态的docker stats命令75
4.1.37 停止容器的docker stop命令75
4.1.38 管理集群的docker swarm命令76
4.1.39 设置镜像标签的docker tag命令76
4.1.40 查看容器进程的docker top命令77
4.1.41 恢复暂停容器的docker unpause命令77
4.1.42 更新容器的docker update命令77
4.1.43 查看Docker版本的docker version命令78
4.1.44 管理数据卷的docker volume命令78
4.1.45 设置等待的docker wait命令79
4.2 启动第一个Docker容器79
4.3 构建第一个Docker镜像80
4.4 本章小结81
第5章 Docker镜像82
5.1 认识镜像82
5.1.1 使用docker pull拉取镜像82
5.1.2 搜索镜像83
5.1.3 查看镜像信息84
5.2 创建镜像86
5.2.1 剖析Hello World镜像86
5.2.2 从Dockerfile构建镜像86
5.2.3 自动构建镜像87
5.2.4 提交容器为镜像90
5.3 导出和导入镜像91
5.3.1 导出镜像到本地文件系统91
5.3.2 从本地文件系统导入镜像91
5.4 发布镜像91
5.4.1 发布镜像到Docker Hub92
5.4.2 给镜像打上标签92
5.4.3 发布到第三方镜像仓库92
5.5 删除镜像93
5.5.1 删除本地镜像93
5.5.2 删除仓库镜像93
5.6 Docker镜像扩展94
5.6.1 Docker镜像里有什么94
5.6.2 Docker镜像的存储方式95
5.6.3 联合挂载95
5.6.4 Git式管理96
5.7 本章小结96
第6章 Dockerfile文件97
6.1 Dockerfile基本结构97
6.1.1 Dockerfile基础97
6.1.2 Dockerfile的书写规则98
6.1.3 基础镜像信息和维护者信息99
6.2 Dockerfile指令99
6.2.1 指定基础镜像的FR