Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。
Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。
Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。
Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。
鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
Docker的设计宗旨:Build,Ship and Run Any App,Anywhere,
即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
容器化越来越受欢迎,因为容器是:
●灵活:即使是最复杂的应用也可以集装箱化。
●轻量级:容器利用并共享主机内核。
●可互换:可以即时部署更新和升级。
●便携式:可以在本地构建,部署到云,并在任何地方运行。
●可扩展:可以增加并自动分发容器副本。
●可堆叠:可以垂直和即时堆叠服务。
容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
Docker与虚拟机的区别:
特性?? ??? ??? ??? ??? ??? ?Docker容器?? ??? ??? ??? ??? ?虚拟机
启动速度?? ??? ??? ??? ??? ?秒级?? ??? ??? ??? ??? ??? ?分钟级
计算能力损耗 ?? ??? ??? ??? ?几乎无 ?? ??? ??? ??? ??? ??? ?损耗 50%左右
性能?? ??? ??? ??? ??? ??? ?接近原生?? ??? ??? ??? ??? ?弱于
系统支持量(单机)?? ??? ??? ?上千个?? ??? ??? ??? ??? ??? ?几十个
隔离性?? ??? ??? ??? ??? ??? ?资源隔离/限制?? ??? ??? ??? ?完全隔离
容器在内核中支持2种重要技术:
docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)。
====namespace的六项隔离============================================
namespace ? ? 系统调用参数 ? ? ? 隔离内容
UTS ? ? ? ? ? ?CLONE_NEWUTS ? ? 主机名与域名
IPC ? ? ? ? ? ?CLONE_NEWWIPC ? ?信号量、消息队列和共享内存
PID ? ? ? ? ? ?CLONE_NEWPID ? ? 进程编号 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?重点
NETWORK ? ? ? ?CLONE_NEWNET ? ? 网络设备、网络栈、端口等 ? ? ? ? ? ? ? ? ? ?重点
MOUNT ? ? ? ? ?CLONE_NEWNS ? ? ?挂载点(文件系统) ? ? ? ? ? ? ? ? ? ? ? ? ??
USER ? ? ? ? ? CLONE_NEWUSER ? ?用户和用户组(3.8以后的内核才支持〉
Docker核心概念:
●镜像
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。
通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。
Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是Docker镜像的精髓。
各种环境 ? 或者服务(tomcat/nginx) 一个模版
●容器
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
可以把容器看做是一个简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
镜像 nginx ?(run) 起来之后的一个实例,可以把容器看做时一个简易版的linux环境容器 就是集装箱(logo上的集装箱)
●仓库
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker?
仓库就是放镜像的场所,做大的公开库 docker hub