docker简介:
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
docker的原理
容器有效的将单个操作系统管理的资源划分到孤立的组中,以便更好的在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化(paravirtualization)和系统调用替换中的复杂性。 简而言之就是,Docker是一个盒子,一个盒子装一个玩具,无论你丢在哪里,你给他通电(glibc),他就能运行。你的玩具大就用大盒子,小玩具就用小盒子。 两个应用之间的环境是完全隔离的,建立通信机制来互相调用。容器的创建和停止都十分快速(秒级),容器自身对资源的需求十分有限,远比虚拟机本身占用的资源少。
Docker VS VM
Docker与VM(虚拟机)的区别可以看:
左图是虚拟机的工作原理图,对资源进行抽象,着重体现在硬件层面的虚拟化上,这种方式增加了两场调用链,对性能的损耗比较大,而且还会占用大量的内存资源
右图是Docker的工作原理图,属于OS级别的虚拟化,kernel通过创建多个镜像来隔离不同的app进程,由于kernel是共享,而且本身linux image也不大,性能损耗几乎可以不计,而且内存占用也不大,大大节约了设备成本
docker基本概念
Image
Docker镜像是一个特殊的文件系统,提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 可以理解为一个预配置的系统光盘,插入电脑后就可以启动一个操作系统。当然由于是光盘,所以你无法修改它或者保存数据,每次重启都是一个原样全新的系统。
Container:
由docker client通过镜像创建的实例,用户在容器中运行应用,一旦创建后就可以看做是一个简单的RFS,每个应用运行在隔离的容器中,享用独自的权限,用户,网络。确保安全与互不干扰
Registry
容器是通过 image 创建的,需要有一个仓库来统一存放 image,这个仓库就叫做 Registry 常见的Registry有:Docker Registry、Docker Hub、Quay.io
docker安装
安装前提条件:
Docker支持以下的CentOS版本:
-
CentOS 7 (64-bit) 要求系统为64位、系统内核版本为 3.10 以上
-
CentOS 6.5 (64-bit) 要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本
使用yum安装(Centos7下)
Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证CentOS 版本是否支持 Docker
通过 uname -r 命令查看你当前的内核版本
[root@localhost ~]# uname -r
[root@localhost ~]# yum -y install docker-io
启动 Docker 后台服务
[root@localhost ~]# service docker start
docker基本命令说明
docker pull : 从镜像仓库中拉取或者更新指定镜像 语法:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
OPTIONS说明:
-
-a :拉取所有 tagged 镜像
-
--disable-content-trust :忽略镜像的校验,默认开启
docker pull提速设置:
https://www.tuicool.com/articles/632INvU
docker run :创建一个新的容器并运行一个命令 语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明:(常用参数)
-
-d: 后台运行容器,并返回容器ID
-
-i: 以交互模式运行容器,通常与 -t 同时使用
-
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-
-p: 端口映射,格式为:主机(宿主)端口:容器端口
-
-h "mars": 指定容器的hostname
-
-m :设置容器使用内存最大值
-
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型
-
--link=[]: 添加链接到另一个容器
-
-v 设置映射目录
实例:
使用镜像nginx以交互模式启动一个容器,在容器内执行/bin/bash命令
docker run -it nginx /bin/bash
进入容器命令:
docker exec -it name(docker ps命令中的NAME值或者容器id前4位) /bin/bash
docker rm :删除一个或多少容器 docker rm :删除一个或多少容器 docker rm :删除一个或多少容器 docker rm :删除一个或多少容器 docker rm :删除一个或多少容器 语法:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS说明:
-
-f : 通过SIGKILL信号强制删除一个运行中的容器
-
-l : 移除容器间的网络连接,而非容器本身
-
-v : 删除与容器关联的卷
docker ps : 列出容器 语法:
docker ps [OPTIONS]
OPTIONS说明:
-
-a :显示所有的容器,包括未运行的
-
-s :显示总的文件大小
docker commit: 将容器打包成镜像 语法:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 容器名称或id 打包的镜像名称:标签
OPTIONS说明:
-
-a :提交的镜像作者
-
-c :使用Dockerfile指令来创建镜像
-
-m :提交时的说明文字
-
-p :在commit时,将容器暂停
docker rmi: 删除镜像 语法:
docker rmi [OPTIONS] IMAGE [IMAGE...]
OPTIONS说明:
-
-f :强制删除
-
--no-prune :不移除该镜像的过程镜像,默认移除
docker应用场景
-
简化配置
虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。
-
代码流水线(Code Pipeline)管理 前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。
-
提高开发效率 不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是Docker做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。
-
隔离应用 有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等。我们经常需要考虑两点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务(译者注:微服务架构)。如果你想了解为什么松耦合的应用这么重要,请参考Steve Yege的这篇论文,文中将Google和亚马逊做了比较。
-
整合服务器 正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker可以比虚拟机提供更好的服务器整合解决方案。
-
调试能力 Docker提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。
-
多租户环境 另外一个Docker有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于Docker环境的启动速度和其高效的diff命令。
-
快速部署 在虚拟机之前,引入新的硬件资源需要消耗几天的时间。虚拟化技术(Virtualization)将这个时间缩短到了分钟级别。而Docker通过为进程仅仅创建一个容器而无需启动一个操作系统,再次将这个过程缩短到了秒级。