容器技术
现代软件开发的一大目的就是隔离,让应用程序在运行时相互独立,互不干扰。这种隔离实现起来是很不容易的,其中一种解决方案就是虚拟机技术,通过将应用程序部署在不同的虚拟机中实现隔离。这种方法是通过KVM、VMware等技术在物理机上虚拟出多个独立的虚拟机(VM),每个VM运行完整的操作系统。但是操作系统是很笨重的,就拿我们的电脑来说,即使什么也不安装也会占用几十G的内存,而且启动缓慢,是分钟级的。而且由于需要运行完整的操作系统,这意味着会占用大量的CPU、内存和存储等资源。
因此,容器技术应运而生,容器的英文是container,它还有个意思叫做集装箱。集装箱大大降低了海洋运输的成本,它的好处就是集装箱之间相互隔离;可以长期反复使用;快速装载和卸载。那么回到软件中的容器,其实容器和集装箱的概念是很相似的。
与虚拟机技术实现的隔离不同的是,容器技术只隔离应用程序的运行时环境,但容器之间可以共享同一个操作系统,这里的运行时环境指的是程序运行依赖的各种库及配置。
从图中可以看到容器更加轻量级而且占用的资源少,因此可以在同样规格的硬件上大量部署容器,并且容器的启动时间更少。容器技术为打包服务栈提供了更加高效的方式。
Docker
docker其实就是容器化技术的一种实现,是使用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序和依赖打包到docker container,这样程序在不同环境下都会有一致的表现,程序的表现只和容器有关系,和操作系统没有关系。
那么如何使用docker呢?在docker中有dockerfile、image、container的概念,你可以把image理解为可执行的程序,container理解为运行起来的进程,那么dockerfile就是制作image的了,使用docker进行编译。
工作原理
docker使用了常见的CS架构,也就是client-server模式。docker client负责处理用户输入的各种命令,比如docker build、docker run,真正工作的其实是server,也就是docker daemon。docker client和docker demon可以运行在同一台机器上
工作流程
1.docker build
当我们写完dockerfile交给docker“编译”时使用这个命令,那么client在接受到请求后转发给docker daemon,接着docker daemon根据dockerfile创建出“可执行程序”image。
2.docker run
有了“可执行程序”image后就可以运行程序了,使用docker run命令,docker daemon接收到命令后找到具体的image,然后加载到内存开始执行,image执行起来就是所谓的container。
3.docker pull
这个命令其实就是补充,前面说过docker中image的概念就类似于“可执行程序”,而这个命令就相当于我们可以下载别人写好的应用程序也就是image进行使用。一般来讲我们都是从image仓库进行下载,你可以把这个仓库理解为“应用商店”,docker官方的仓库就是Docker Hub。
用户通过docker client发送命令,docker daemon接受到命令后向指定的image仓库发送下载请求,然后存放到本地,这样我们就可以使用image了。
