虚拟化(Virtualization)技术是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份不受现有资源的架设方式,地域或物理组态所限制,一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件对资源充分利用虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。
从大类上分,虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化,真正意义上的基于硬件的虚拟化技术不多见。基于软件的虚拟化从对象所在的层次,又可以分为应用虚拟化和平台虚拟化。Docker以及其他容器技术都属于平台虚拟化中操作系统虚拟化这个范畴,操作系统虚拟化最大的特点就是不需要额外的supervisor支持。
Docker的三大特性为BUILD(构建)、SHIP(运输)、RUN(运行)。
(1)上手快
只需要几分钟,就可以把自己的程序“Docker化”。Docker依赖于“写时复制”(copy-on-write)模型,使修改应用程序也非常迅速,大多数Docker容器只需要不到1秒中即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源。
(2)职责的逻辑分类
使用Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性,避免开发环境与生产环境不一致。
(3)快速高效的开发生命周期
Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件件的取。)
(4)鼓励使用面向服务的架构
Docker还鼓励面向服务的体系结构和微服务架构。Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内省性。
番外篇: 中间件服务器是Docker容器应用的最佳实践,原因如下:
值得注意的是,由于目前 Docker暂不支持修改运行中的容器的一些配置,比如无法为运行中的容器映射更多的宿主机目录、网络,在使用中间件容器的
时候,需要事先规划好容器的用途和可能开放的网络端口等资源。
Docker 和传统虚拟化方式的不同之处:容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,虚拟出一个新的操作系统,而传统方式则是在硬件层面实现,虚拟出一个新的硬件环境,在硬件环境上,再安装完整的操作系统。
docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要额外的虚拟化管理程序(VMM(VirtualMachine Monitor),以及hyperisor)支持,**他是内核级虚拟化,可以实现更高的性能,同时对资源的额外需求很低,docker应用获得的是接近原生的运行性能。**最本质特征docker是通过隔离来创建容器,而KVM等均为通过模拟方式创建虚拟机。
Docker采用Go语言编写,是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务端(守护进程)发出请求,服务器将完成所有工作并返回结果。Docker提供了一个命令行工具、一整套RESTful API,你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。
镜像: 一个镜像可以包含一个基本的操作系统环境,如果里面仅安装了Apache应用程序,可以把它称为一个Apache镜像 。
容器: Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。
仓库: Docker仓库类似于代码仓库,是集中存放镜像文件的场所。仓库注册服务器(Registry)是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签( tag)来进行区分。目前,最大的公开仓库是官方提供的 Docker Hub。在使用 Docker一段时间后,往往会发现手头积累了大量的自定义镜像文件,这些文件通过公有仓库进行管理并不十分方便;另外有时候只是希望内部用户之间进行分享。在这种情况下,就有必要搭建一个本地的私有仓库服务器。可以使用 docker-registry镜像搭建一个私有仓库。
Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的,很多CentOS版本中是不支持更新最新的一些补丁包的。此外,docker不支持32位的CPU架构;首次在新主机上安装Docker CE(Community Edition)之前,需要设置Docker存储库。之后才可以从存储库安装和更新Docker。推荐使用离线安装,避免下载超时。
在线安装教程如下,亲测可用:https://blog.csdn.net/jinking01/article/details/82490688
离线下载地址:https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/
离线安装教程:https://www.cnblogs.com/atuotuo/p/9272368.html
给当前用户授予docker操作的权限:https://www.cnblogs.com/hutao722/p/10036387.html
执行如下命令,创建或修改文件:
sudo vim /etc/docker/daemon.json
在文件中输入内容:
{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com","https://registry.docker-cn.com"]
}
配置完成后,重启docker服务
service docker restart
systemctl start docker #启动docker
systemctl stop docker #停止docker
systemctl restart docker #重启docker
systemctl status docker #查看docker状态
systemctl enable docker #开机启动
docker info #查看docker概要信息
docker --help #查看docker帮助文档
Docker守护进程需要以root权限来运行,以便它有足够的权限去管理所需要的资源,来处理普通用户无法完成的操作(如挂载文件系统)。当Docker软件包安装完毕后,默认会立即启动Docker守护进程。**守护进程监听/var/run/docker.sock这个Unⅸ套接字文件,来获取来自客户端的Docker请求。**如果系统中存在名为docker的用户组,Docker则会将该套接字文件的所有者设置为该用户组。这样,docker用户组的所有用户都可以直接运行 Docker,而无需再使用sudo命令了,无需root权限。docker用户组对 Docker具有与root用户相同的权限。
虽然docker用户组使我们的工作变得更轻松,但它依旧是一个值得注意的安全隐患。可以认为 docker用户组和root具有相当的权限,应该确保只有那些需要此权限的用户和应用程序才能使用该用户组。
配置守护进程监听
运行 Docker守护进程时,可以用-H标志调整守护进程绑定监听接口的方式,Docker客户端不会自动监测到网络的变化,我们需要通过-H选项来指定服务器的地址。
sudo docker -d -H tcp://0.0.0.0:2375
该命令将Docker守护进程绑定到宿主机上的(0.0.0.0),也能通过-H标志指定一个Unix套接字路径,守护进程可以同时绑定到多个地址。
sudo docker -d -H tcp://0.0.0.0: 2375 -H unix://home/docker/docker.sock