一、定义
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
解决了运行环境和配置问题的软件容器, 方便做持续集成并有助于整体发布的容器虚拟化技术。
容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 和传统虚拟化方式的不同:
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
- 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
二、核心概念
1.Docker镜像
类似于虚拟机镜像,可以理解为一个面向Docker引擎的只读模板,包含了文件系统。
例如:一个镜像可以包含一个完整的Ubuntu操作系统环境,可以把它称为一个Ubuntu镜像。镜像也可以安装了Apache应用程序,可以把它称为一个Apache镜像。
镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用镜像,并通过简单的命令就可以直接使用。
2.Docker容器
Docker容器(Container)类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。
容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。
可以把容器看做一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序打包而成的应用盒子。
镜像自身是只读的。容器从镜像启动的时候,Docker会在镜像的最上层创建一个可写层,镜像本身将保持不变。
容器与镜像的关系类似面向对象编程中的对象和类
3.Docker仓库
https://hub.docker.com/
Docker仓库(Repository)类似于代码仓库,是Docker集中存放镜像文件的场所。
注册服务器:Registry
注册服务器是存放仓库的地方,其上往往放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。
根据所存储的镜像公开分享与否,Docker仓库可以分为
- 公开仓库(Public):最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供稳定的国内访问。
- 私有仓库(Private):用户如果不希望公开分享自己的镜像文件,Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库。
当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需将其从仓库上pull下来就可以了。
4.总结
Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。image文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
- 镜像文件:image 文件生成的容器实例,本身也是一个文件,称为镜像文件
- 容器实例:一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
- 仓库:存放镜像的地方,可以把镜像发布到仓库中,需要的时候再从仓库中拉下来
三、Docker安装
官网:www.docker.com
Linux安装:
$ sudo wget -qO- https://get.docker.com/ | sh
安装docker本身
sudo:当前用户是普通用户,但执行该命令时使用root身份执行
wget:命令行下载工具
-q:使wget输出不要那么多
O-:把wget的输出直接输出到标准输出,而不是输出到文件
|:管道
| sh:把输出交给sh
$ sudo usermod -aG docker xxx
允许非root用户(非superuser)来运行docker
修改用户组,把这个用户组加入到docker组里面(用户如果在docker组里,则可以不用sudo,不需要root就可以执行docker命令)
检查是否安装成功:docker info
如果执行此命令报错,则是docker没有启动,在centos中,使用
service docker start
四、Docker架构
1.Docker结构
Docker是一个Client-Server架构的系统,Docker守护进程运行在主机上,通过socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。
- Docker host:进行docker操作的宿主机
- Docker Daemon:负责各种各样的docker操作,比如下载docker镜像,运行一个容器,客户端通过命令,把命令交给docker daemon,由docker Daemon来做实际的操作。
- Registry:互联网的saas服务,daemon可以和registry交互,比如获取一个image,或者push一个image;是Docker的镜像存储服务端。
客户端和守护进程进行操作,把命令送给守护进程,守护进程拖取镜像,运行容器并和远端的镜像仓库进行交互。
2.Docker运行的基本流程
- 1.用户是使用 Docker Client与 Docker Daemon 建立通信,并发送请求给后者
- 2.Docker Daemon作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Cient 的请求。
- 3.Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式的存在。
- 4.Job 的运行过程中,当需要容器镜像时,则从 Docker Registy 中下载镜像,并通过镜像管理动 Graph driver将下载镜像以Graph的形式存储
- 5.当需要为 Docker创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker容器网络环境。
- 6.当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Exec driver来完成。
- 7.Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。