Docker 学习总结
前言
Docker火了很长时间了,有幸体验了一段时间,平常主要用于测试环境的项目一键部署,体验不错值得推荐。本来想着就写一篇文章总结下Docker的一些使用场景和踩过的坑,最后写完发现篇幅过长不便阅读,就拆分成几篇作为一个系列,在本文最后给出传送门,有兴趣的同学可以了解下。
图片来自Docker官网简介(官方网站)
Docker 是一种容器技术,它可以将应用和环境等进行打包,形成一个独立的,类似于手机APP形式的「应用」,这个应用可以直接被分发到任意一个支持 Docker 的环境中,通过简单的命令即可启动运行。Docker 是一种最流行的容器化实现方案。和虚拟化技术类似,它极大的方便了应用服务的部署;又与虚拟化技术不同,它以一种更轻量的方式实现了应用服务的打包。使用 Docker 可以让每个应用彼此相互隔离,在同一台机器上同时运行多个应用,不过他们彼此之间共享同一个操作系统。Docker 的优势在于,它可以在更细的粒度上进行资源的管理,也比虚拟化技术更加节约资源。
看到这个概念,立马想到了虚拟机,两者有点像,下面给出官网的对比图,直观感受下二者的区别(参考)
Docker与虚拟机对比图简单的说,Docker可以共享物理机的硬件和系统资源,而虚拟机要对硬件进行虚拟化并且需要额外的资源开销用于运行虚拟的操作系统导致资源利用率低、性能差。在一台物理机上同时启动多个Docker容器或多个虚拟机就能有鲜明的对比了。
图片来自网络目前国内有好几家提供Docker云服务平台:道客云、时速云、灵雀云、希云等,本人使用过道客云和时速云,界面类似于阿里云的控制台(阿里云上也有容器服务),功能上包含了镜像仓库、云服务器管理,持续集成等等。虽然这几个平台的功能都是围绕Docker展开的,但业务侧重点也都有所不同,大家自己把玩吧。一般个人版是免费的,对于个人小项目的管理绰绰有余了,至于收费的企业版没用过就不发表意见了。
Docker的特点和优势
结合前段时间的使用体验,主要归纳为以下几点:
1. 可移植性,一次配置,随处移植
开发环境搭建绝对是开发过程中最令人头痛的环节,费时费劲费脑不说,开发到一半环境突然坏了,简直是灾难啊。
- 比如说有这样的场景,工具1只能运行在系统A上,工具2只能运行在系统B上,然而残酷的需求是工具1和工具2都必须得用...
- 再比如说,来了一个新同事,准备大展身手帮忙配环境,结果出现各种神奇的问题,各种运行不了,内心也是崩溃得不要不要的...
使用Docker可以将每个工具和相关的配置打包成镜像,这样就可以方便的共享、备份、还原了。当然,这种方法更适合长期在Linux环境下开发的同学,本人作为Windows重度用户想想就行了。还记得以前上学那会儿,很多开发工具都是指名道姓要运行在xxx系统上,想到装虚拟机,各种乱七八糟的配置,对硬件的要求也比较奇葩等等,还没开始就想放弃了,最重要的是还不一定能成功!!!现在用了Docker之后,这些都不是事儿!
2. 标准化应用发布和使用
Linux各种五花八门的发行版本还是比较多的,开发好的应用可能不能如愿的兼容各个发行版本,更何况每个发行版本基本有一套专属的指令体系和软件包管理体系,对于小白来说真是心塞。使用了Docker之后,容器将应用与物理机操作系统隔离,内部使用独立的操作系统(内核还是共享的),所以不管移植到哪个平台上始终可以运行在内部的操作系统之上,开发过程中也就可以专门针对一个最熟悉的操作系统进行配置和性能优化,大大减小学习成本和运维成本。另外,将应用和环境作为一个整体(镜像),还有一个好处就是,通过统一的Docker命令实现对不同应用的标准化管理,镜像仓库中每一个镜像就是一个应用(好比在应用商店下载手机app),获取镜像之后你不需要特别了解环境怎么配置,通过什么脚本或指令来启动,怎么管理开机启动的等等,这些问题都交给Docker,你只需了解相关的Docker命令就可以快乐地玩耍了。
3. 资源利用率高,启动迅速
启动Docker容器运行应用相当于是运行本地进程,相比虚拟机既可充分利用硬件性能,又节约启动时间,操作也简便。
4. 持续集成
配合持续集成工具如Jenkins,版本控制工具如git、svn,项目构建工具如maven 可以实现一键发布或者自动化构建,结束人肉运维的惨淡人生。就拿tomcat来说,没有彻底重启的功能,只能靠自己写脚本杀进程,有时又会莫名其妙关闭(大部分原因还是代码没写好),这又需要写脚本定时监控重启tomcat。针对这两个痛点,这时Docker就派上了用场,对于Docker来说,重启容器即等价于重启应用,而且Docker自身可以很方便地设置开机启动容器和自动重启容器保证服务不中断。
5. 隔离性
作为一枚小白,对于Linux平台上应用的安装真心看不懂,有的可以通过平台的包管理工具安装,有的只能通过源码安装,安装后目录难找就算了,有时候一些配置文件要么遍地开花要么根本找不到,而且貌似也没有纯净卸载的选项,残留各种碎片。Docker的思想就类似于集装箱,整合零碎的东西于一个整体之内,简化操作步骤,同时可以隔离内外环境,内部应用不入侵外部操作系统环境,外部操作系统不干扰内部应用运行,而这个隔离也可以有效解决应用之间的冲突。当然,这个隔离性还是取决于实际的使用情况, 错误地使用数据卷和其他特殊配置都会破坏容器和宿主机之间的和谐。
6. 子服务器搭建
可能手头有一台高性能的服务器,自己一个人使用且用途也不大的话显得太浪费,这时就可以构建几个容器限制内存、cpu、磁盘等配置后分享给其他人使用,这相当于多开了几台虚拟的服务器,容器内性能并没有打多少折扣而且容器与容器之间,容器与物理机之间都是相互独立不干扰的。写到这里忽然想到,我买的阿里云ECS会不会也只是一个Docker容器呢?就算不是也应该是类似的存在吧。
Docker涉及到的一些关键概念(参考)
1. 镜像
图片来自网络有装过操作系统的朋友可能想到了系统镜像(iso文件),个人觉得就是一回事,就是程序的安装包,是一个包含了应用程序和其运行时环境的只读文件。镜像需要以一个Linux发行版作为基础运行环境,在此之上构建自己的应用。镜像的结构为一层一层的文件系统,每一层包含了所做的修改内容,所有层次的修改合并就构成了最终的镜像内容,因此,镜像是可以继承的,子镜像是在父镜像的基础上做一定的修改得到的。有一点要注意的是,即使在后面的层次中删除了某些文件,但它们仍然存在于之前的层次之中而并不会减小镜像大小,理论上层次增加就会导致镜像占用大小增加。因此,自己构建的镜像应尽可能减少层次,每一层的修改只保留必要的文件,删除临时文件。另外,由于这种层次结构,镜像文件的拉取是一个增量的过程,每次只下载不存在的层级数据,而不必每次下载完整的镜像文件,大大减少了迁移过程中网络传输的数据量。
图片来自网络2. 容器
既然说镜像是安装包,那么容器就是运行中的程序,这才是等价于"虚拟机"的存在。之前说镜像是由一层层文件系统构成的,不过它们都是只读的,启动容器之后会在它们之上构建一层读写层,容器运行过程中的一切修改都会保存在当中,将读写层保存起来就构建出了新的镜像(docker commit)。
3. 镜像仓库
相当于就是手机App的应用商店,在这里我们可以下载前人构建的镜像,即可直接使用应用,也可以基于这些镜像构建针对自有业务的个性化镜像。镜像仓库的作用体现在版本控制,资源共享。
Docker的安装
截图来自Docker官网
通过上面官网的截图可以看出Docker基本支持各个平台了,这里就推荐下daocloud上Docker在Linux系统上的安装方式
# 安装
sudo curl -sSL https://get.daocloud.io/docker | sh
# 非root帐号下安装完启动可能会报错,需要执行下面的步骤
# 新建docker用户组
sudo groupadd docker
# 将当前账户加入docker用户组
sudo gpasswd -a ${USER} docker
重启docker
sudo service docker restart
# 刷新docker组成员
newgrp - docker
# 查看版本
ubuntu@VM-84-201-ubuntu:~$ docker version
Client:
Version: 17.05.0-ce
API version: 1.29
Go version: go1.7.5
Git commit: 89658be
Built: Thu May 4 22:10:54 2017
OS/Arch: linux/amd64
Server:
Version: 17.05.0-ce
API version: 1.29 (minimum version 1.12)
Go version: go1.7.5
Git commit: 89658be
Built: Thu May 4 22:10:54 2017
OS/Arch: linux/amd64
Experimental: false
针对不同发行版,卸载方式也有所不同
1. Ubuntu|Debian
sudo apt-get -y remove docker docker-engine
2. RHEL|CentOS
sudo yum remove docker \
docker-common \
container-selinux \
docker-selinux \
docker-engine
3. Fedora
sudo dnf remove docker \
docker-common \
container-selinux \
docker-selinux \
docker-engine
卸载Docker后,/var/lib/docker/目录下会保留原Docker的镜像,网络,存储卷等文件. 如果需要全新安装Docker,需要删除/var/lib/docker/目录。
sudo rm -rf /var/lib/docker/
由于经常需要从官方镜像仓库获取镜像,为了解决网络问题,可以使用daoCloud提供的Docker 加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://024e63b8.m.daocloud.io
关于Docker改名
关于改名,指的是原先的Docker开源项目改名成了Moby项目, 而Docker成了注册商标, 只用于Docker公司的商业产品 Docker EE 和 Docker CE 等。
相关链接:
对于 Docker 改名 Moby ,大家怎么看?
Docker改名啦?什么是 Moby Project