当我们在软件开发之前,最重要的一步就是环境配置。由于各个用户计算机环境的差别,有可能导致在自己的机器上可以运行,而其他人的机器不可运行。
故,用户要保证两件事:操作系统的设置,各种库与组件的安装。
当我们要换一台机器后,又要重新配置。
虚拟机
说Docker之前,需要先讲讲虚拟机。
虚拟机(virtual machine)就是代环境安装的一种解决方案。它可以在一种操作系统中运行另一种操作系统。而应用程序对此毫无感知,对于底层系统而言,它就是一个普通文件。
缺点:
- 资源占用多
- 冗余步骤多
- 启动慢
Linux容器
Linux容器(LXC),不是模拟一个完整的操作系统,而是对进程进行隔离。可以是说在进程外面套了一个保护层。对于容器里面的进程来说,接触的各种资源都是虚拟的,从而实现与底层系统的隔离。
优点:
- 启动快:其应用是底层系统的一个进程,启动容器相当于启动本机的一个进程。
- 资源占用少
- 体积小
Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真是的物理机上运行一样。也就是说,将应用与它需要运行的环境包装在一起。
用途
1)提供一次性的环境: 本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
2)提供弹性的云服务: 因为Docker容器可以随开随关,很适合动态扩容和缩容。
3)组建微服务架构: 通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
组成
一个完整的Docker有以下几个部分组成:
1)DockerClient(客户端)
2)Docker Daemon(守护进程)
3)Docker Image(镜像)
4)Docker Container(容器)
Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。Docker容器通过Docker镜像来创建。容器与镜像的关系类似于面向对象中的对象与类。
守护进程
Docker守护进程运行在一台主机上。用户并不直接和守护进程进行交互,而是通过Docker客户端间接和其通信。
Docker客户端
Docker客户端,实际上是docker的二进制程序,是主要的用户与Docker交互方式。它接收用户指令并且与背后的Docker守护进程通信,如此来回往复。
Docker镜像
Docker镜像是Docker容器运行时的只读模板,每一个镜像有一系列的层(layers)组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新 的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。
Docker仓库
Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。
Docker容器
Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。