做开发的应该很多人都知道Docker,就算是没有用过,应该也有所耳闻。这款开源于2013年的工具一经问世,便迅速火爆起来,在微服务、项目迁移、云等方面备受欢迎。如今它的github项目已经达到54k个star。Docker到底是什么?它有什么优点使得它如此受欢迎?到底该怎么使用?本文就从以上几点进行阐述,希望通过这篇文章能够让大家对Docker有一个清晰的认识。
程序员宝藏库:https://github.com/Jackpopc/DevWeekly
什么是Docker?
Docker是由dotCloud公司发起并与2013年开源的一个项目,一径开源就备受欢迎,其主要项目至今在github已经54k个star。它是使用Go语言开发实现,基于Linux内核cgroup、namespace以及AUFS类等技术对进程进行封装隔离,属于一种操作系统层面的虚拟化技术。此后,进一步开发开始使用runC和containerd,进一步封装,从文件系统到网路互联,再到进行都进行隔离,极大的简化了容器的创建和维护,使得Docker比虚拟机更为轻便、快捷。
为什么要用Docker?
Docker与传统虚拟机一样,同属于虚拟化技术,但是它拥有众多虚拟机无法比拟的优势:
- 持续交付和部署
- 更快的迁移
- 更高效的利用系统资源
- 更快的启动时间
- 一致的运行环境
- 更轻松的维护和扩展
容器与虚拟机的对比详情如下:
对于大多数开发人员感受最为就是前两点:持续交付和部署、更快的迁移。
我想这对于很多开发人员都是一个很头疼的问题,在开发过程中会遇到这种抱怨:“在我电脑上可以运行啊?为什么换一台电脑就不行了?”
虽然诸如maven、nodejs的package.json、Python的requirement的出现使得迁移变得简单,但是它们更多的是使得在第三方工具包的迁移方面变得简单方面,但是在系统和开发环境方面却没有什么作用。docker确保了直行环境的一致性,可以在多平台上运行,使得应用迁移更加容易。此外,docker使用分层存储以及镜像技术,使得应用重复部分的复用更加容易,可以基于基础镜像做更多的扩展,使得系统的维护变得更加简单。
基本概念
使用docker接触最多的就是以下3个概念,
- 镜像:image
- 容器:container
- 仓库:repository
了解这三个概念,对容器的整个生命周期便有了认识。在这里,我用简单的语言对上述3个概念进行描述
**镜像:**进行就相当于一个精简化的文件系统,例如官方提供的Ubuntu镜像,就只包含了最小化的root文件系统。
容器:容器是一个拥有自己root文件系统、自己网络配置、自己命名空间的进程。镜像和容器就像是编程中的类和实例,镜像时静态的定义,而镜像运行时的实体是容器。什么是类和实例?举一个编程的例子阐述一下,
# 类
class HelloWorld:
def __init__(self, x, y):
self.x = x
self.y = y
def add(self):
return self.x + self.y
# 实例
hello