Docker入门
1. 诞生背景
在Docker发明之前,在服务器配置一个应用的运行环境,要安装各种软件,应用开发需要配置不同环境的配置文件和其他支持文件,以及开发和运维部署团队时常有沟通甚至常常发生部署失败的状况。另外不同系统间移植应用也是非常麻烦。Docker的出现使得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
2. 概述
Docker🐳是基于Go语言实现的开源项目。Docker的主要目标是"Build,Ship and Run Any App,Anywhere",也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到"一次镜像,处处运行"。Linux容器技术的出现就解决了这样一个问题,而Docker就是在它的基础上发展过来的。将应用打成Docker镜像,应用通过镜像运行在Docker容器上成为应用的实例,Docker容器保证在任何操作系统上应用效果都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
3. Docker和虚拟机对比
虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在Windows10系统里面运行Linux系统CentOS7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件。传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统(如VirtualBox和VMWare等),创建虚拟机(虚拟出各种硬件),然后在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用。
虚拟机的缺点:1. 资源占用多;2. 冗余步骤多;3. 启动慢
由于前面虚拟机存在某些缺点,Linux发展出了另一种虚拟化技术:
Linux容器(Linux Containers,缩写为 LXC),Linux容器不是模拟一个完整的操作系统而是对进程进行隔离。Linux容器是与系统其他部分隔离开的一系列进程,从一个镜像开始运行,容器提供该镜像所需的全部文件。 Docker和虚拟机对比不同之处:
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
- 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
Docker会比VM虚拟机快原因:
- Docker有着比虚拟机更少的抽象层
由于Docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上Docker将会在效率上有明显优势。 - Docker利用的是宿主机的内核,而不需要加载操作系统OS内核
当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而Docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个Docker容器只需要几秒钟。
4. Docker的优势
- 更快速的应用交付和部署
- 更便捷的升级和扩缩容
- 更简单的系统运维
- 更高效的计算资源利用
5. Docker相关概念
镜像(image): 就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker镜像文件类似于Java的类模板,而Docker容器实例类似于java中new出来的实例对象。
容器(container): Docker利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
仓库(repository): 是集中存放镜像文件的场所。类似于Maven仓库,存放各种jar包的地方;Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是Docker Hub,里面存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等。
6. Docker工作原理
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。
- 用户是使用Docker Client与Docker Daemon建立通信,并发送请求给后者。
- Docker Daemon作为Docker架构中的主体部分,首先提供Docker Server的功能使其可以接受Docker Client的请求。
- Docker Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。
- Job的运行过程中,当需要容器镜像时,则从Docker Recistry中下载镜像,并通过镜像管理驱动Graph drver将下载镜像以Graph的形式存储。
- 当需要为Docker创建网络环境时,通过网络管理驱动Network driver创建并配置Docker容器网络环境。
- 当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec driver来完成。
- Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。