Published on

docker

Authors
  • avatar
    Name
    MissTree
    Twitter

目录

一 、Docker是什么

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器完全使用沙盒机制,相互之间不会存在任何接口。几乎没有性能开销,可以很容易的在机器和数据中心运行。最重要的是,他们不依赖于任何语言、框架或者包装系统

二 、Docker与虚拟机的区别

特性dockre虚拟机
启动秒级分钟级
硬盘使用一般为M一般为GB
性能接近原生弱于
系统支持量单机支持上千个容器一般是几十个
隔离性容器间可互相读取操作完全隔离
系统跟随机器自定义安装

Docker 的优势

  • Docker 启动快速属于秒级别

  • Docker 需要的资源更少

  • Docker 更轻量

  • 与虚拟机相比,Docker 隔离性更弱。Docker 属于进程之间的隔离,虚拟机可实现系统级别隔离。

  • 安全性。Docker 的安全性也更弱,Docker 的租户 Root 和宿主机 Root 等同,一旦容器内的用户从普通用户权限提升为 Root 权限,它就直接具备了宿主机的 Root 权限,进而可进行无限制的操作。

  • 高可用和可恢复性。

  • 快速创建、删除

  • 交付、部署

Docker局限性

Docker用于应用程序时是最有用的,但并不包含数据。日志、数据库等通常放在Docker容器外。一个容器的镜像通常都很小,不用和存储大量数据,存储可以通过外部挂载等方式使用,比如:NFS、ipsan、MFS等 ,或者docker命令 ,-v映射磁盘分区。总之,docker只用于计算,存储交给别人。

三、Docker特性 ⬆ 回顶部

  • 文件系统隔离:每个进程容器运行在一个完全独立的根文件系统里。

  • 资源隔离:系统资源,像CPU和内存等可以分配到不同的容器中,使用cgroup。

  • 网络隔离:每个进程容器运行在自己的网路空间,虚拟接口和IP地址。

  • 日志记录:Docker将收集到和记录的每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或者批量检索

  • 变更管理:容器文件系统的变更可以提交到新的镜像中,并可重复使用以创建更多的容器。无需使用模板或者手动配置。

  • 交互式shell:Docker可以分配一个虚拟终端并且关联到任何容器的标准输出上,例如运行一个一次性交互shell。

四、Docker的三个基本概念 ⬆ 回顶部

  • Image(镜像)

    • Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像(Image)就是一堆只读层(read-only layer)的统一视角
  • Container(容器)

    • 容器(Container)的定义和镜像(Image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

    • 由于容器的定义并没有提及是否要运行容器,所以实际上,容器 = 镜像 + 读写层。

  • Repository(仓库)

    • Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行。

    • 仓库又可以分为两种形式:

      • Public(公有仓库)

      • Private(私有仓库)


五、Docker架构 ⬆ 回顶部

Docker运行的基本流程为:

  • 1、用户是使用Docker Client与Docker Daemon建立通信,并发送请求给后者。
  • 2、 Docker Daemon作为Docker架构中的主体部分,首先提供Docker Server的功能使其可以接受Docker Client的请求。
  • 3、 Docker Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。
  • 4、Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动Graph driver将下载镜像以Graphi的形式存储。
  • 5、当需要为Docker创建网铬环境时,通过网铬管理驱动Network driver创建并配置Docker容器网铬环境。
  • 6、当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec driver来完成。
  • 7 、Libcontainer是一项独立的容器管理包,Network driverl以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。

Docker核心组件

  • Docker Client

    • Docker Client ,也称 Docker 客户端。它其实就是 Docker 提供命令行界面(CLI)工具,是许多 Docker 用户与 Docker 进行交互的主要方式。
  • Docker Daemon

    • Docker Daemon 是服务器组件,以 Linux 后台服务的方式运行,是 Docker 最核心的后台进程,我们也把它称为守护进程。
  • Docker Image

  • Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。

  • Docker Container

  • Docker 容器就是 Docker 镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。

  • Docker Registry

  • Docker Registry 是存储 Docker Image 的仓库

Docker网络

  • 本地网络
# 关于docker0呢,其实就是一个叫docker0的虚拟网桥。我们使用brctl命令来查看一下。(没有这个命令的下载yum -y install bridge-utils)
brctl show

veth-pair技术:我们每启动一个docker容器,docker就会给docker容器分配一个ip,安装docker之后,会产生一个叫docker0的网卡,这里使用的就是veth-pair技术
veth-pair 就是一堆的虚拟设备接口,他们都是成对出现的,一端连接着协议,一端连接着彼此。使得它充当了一个桥梁的作用。

veth-pair桥接

  • docker网络模式有以下几种:
Host:容器不会虚拟出自己的网卡,配置主机的IP等,而是使用宿主机的IP和端口

Container: 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP。(一般不用)

None: 该模式关闭了容器的网络功能。(一般不用)

Bridge:默认为该模式(桥接,自己创建也是用它),此模式会为每一个容器分配,设置IP等,并将容器连接到一个docker0 的虚拟网桥,通过docker 0 网桥以及iptables nat 表配置与宿主机通信。
docker network ls   
#列出docker网卡