docker概述

1.Docker概述
Docker是一个用于开发,发布和运行应用程序的开放平台。Docker能快速的把你的应用程序从基础设施分离出来。使用Docker,你可以像管理应用程序一样管理基础设施。通过利用Docker的方法来快速交付,测试和部署代码,你可以显著的减少编写代码和生产环境中运行代码之间的延迟

  1. Docker平台
    Docker提供了在称为容器的松散隔离环境中打包和运行应用程序的能力。隔离和安全性允许你给定的主机上同时运行多个容器。容器是轻量级的,因为他们不需要管理程序的额外负载,而是在主机内核中运行。这意味着与使用虚拟机相比,你可以在给定的硬件组合上运行更多的容器。你甚至可以在实际上是虚拟机的主机中运行Docker容器。
    Docker提供工具和平台管理你的容器的生命周期:
    使用容器开发应用程序及其支持组件
    容器成为分发和测试应用程序的单元
    准备好之后,将应用程序部署到生产环境中,作为容器或编排的服务。无论您的生产环境是本地数据中心、云提供商还是两者的混合,其工作原理都一样的。

3.Docker Engine
Docker Engine是一个client-server应用程序,主要组件如下:
一个服务,一种长时间运行的程序,称为守护进程(docker命令)
一个REST API,程序可以使用这些接口与守护进程进行对话,并指示他做什么
一个命令行接口(CLI)客户端(docker命令)


clipboard.png

CLI使用Docker REST API通过脚本或直接用CLI命令来控制Docker守护进程与之交互。许多其他的Docker应用程序使用底层API和CLI

该守护进程创建并管理Docker对象,如镜像,容器,网络,和卷
注:Docker实在开源Apache 2.0许可下获得许可的
有关更多的细节,请参见线面Docker架构。

  1. 我们可以使用Docker做什么?
    迅速一致的交付应用程序。

Docker简化了开发生命周期,允许开发人员使用提供了带有应用程序和服务的本地容器的标准化标准化环境中工作。容器对于持续集成和持续交付(CI/CD)工作非常有用。
考虑以下示例场景:
你的开发员在本地编写代码,并使用Docker容器与同事工作
他们使用Docker将应用程序推入测试环境,并执行自动化和手动测试
当开发人员发现bug时,它们可以在开发环境中修复他们,并将它们部署到测试环境中进行测试和验证
测试完成后,修复客户端只需将更新后的镜像推入生产系统即可

响应式部署和扩张
Docker基于容器的平台允许高度语可移植的工作负载。Docker容器可以在开发人员的本地电脑,数据中心的物理机或虚拟机、云提供商或混合环境中运行
Docker的可移植性和轻量级特性也使得动态管理变得容易,根据业务需求,在近乎实际的情况下扩展或分解应用或服务。

在相同的硬件上运行更多的工作负载
Docker使轻量级和迅速的。它为基于管理程序的虚拟机提供了一种可行的,经济有效的代替方案。因此你可以使用更多的计算能力来实现业务目标。Docker非常适合用于高密度环境和需要使用较少资源完成更多的中小型部署。

  1. Docker架构

    Docker使用client-server架构。Docker客户机与Docker守护进行进行对话,后者负责构建运行和分发Docker容器。Docker客户机和守护进程可以再统一系统上运行,也可以将Docker客户机连接到远程Docker守护进程。Docker客户机和守护进程通过Unix套接字或网络接口使用REST API进行通信。
    clipboard1.png

    Docker Daemon(Docker守护进程)

    Docker守护进程(dockerd)监听Docker API请求并管理Docker对象,如图像,容器,网络和卷。守护进程还可以与其他守护进程通信以管理Docker服务

Docker client(Docker客户端)
Docker客户端(Docker)是许多Docker用户与Docker交互的主要方式。当你使用docker run之类的命令式,客户端将这些命令发送给dockerd。dockerd执行这些命令。docker命令使用docker API。Docker客户机可以与多个守护进程通信。

Docker redistries (Docker仓库)
Docker仓库储存Docker镜像。Docker Hub是一个任何人都可以使用的公共仓库,Docker被配置为默认在Docker Hub上查找图像,甚至还可以运行自己的私有仓库。如果你使用Docker数据中心(DDC),他包括Docker可信仓库(DTR)
当你使用docker pull 或 docker run 命令,所需的镜像将从配置的仓库中提取。当你使用docker push 命令时,你的镜像将被推送到配置的仓库中。

Docker Object(Docker对象)
当你使用Docker时,你是在创建和使用图像、容器、网络、卷、插件和其他对象。本节简要叙述其中一些对象

IMAGES(镜像)
镜像是一个只读的模板,带有创建Docker容器的指令。通常,一个镜像是基于另一个镜像的,需要进行一些额外的定制。例如,你可以基于ubuntu构建一个镜像,安装Apache Web服务器和你的应用程序,以及配置你应用程序运行的细节

你可以创建自己的镜像,也可以只使用其他人创建并发布在仓库中的图像。构建一个你自己的镜像,你需要创建一个Dockerfile,它具有简单的语法,用于定义创建镜像和运行镜像所需的步骤。Dockerfile中的每个指令都在镜像中创建一个层。当你更改Dockerfile并重新构建竟像是,只需重新构建那些已经更改的层。与其他虚拟化技术相比,这就是镜像轻量级,小巧和快速的部分原因

CONTAINERS(容器)
容器是镜像的可运行的实例。你可以使用Docker API or CLI 创建,启动,停止,移动,或删除容器。你可以将一个容器连接至一个或多个网络,将存储添加到其中,甚至可以基于当前的状态创建新的镜像。

默认情况下,容器与其他容器和主机是相对隔离的。你可以控制容器的网络、存储或其他底层子系统或其他容器或主机的隔离程度。

容器由其镜像以及在创建或启动它时提供的任何配置选项来定义。当一个容器被移除时,对其状态的任何未存储在持久存储中的更改都将消失

示例docker运行命令:
下面的命令运行一个Ubuntu容器,以交互方式附加到本地命令行会话,并运行/bin/bash.
$ docker run -i -t ubuntu /bin/bash

当你运行这个命令时,会发生一下情况(假如你使用的是默认仓库的配置):

  1. 如果你本地没有Ubuntu镜像,Docker会从你配置的仓库中拉出它,就像你手动运行Docker拉Ubuntu一样。
  2. Docker创建一个新容器,就像你手动运行了一个Docker容器创建命令一样。
  3. Docker将一个读写文件系统分配给容器作为他的最后一层。这允许正在运行的容器在其本地文件系统中创建或修改文件或目录。
  4. Docker创建一个网络接口连接到默认网络,如果你没有指定任何网络的选项。这包括为一个容器分配IP地址,默认情况下,容器可以使用宿主机的网络连接到外部网络。
  5. Docker启动容器并执行/bin/bash。由于容器以交互方式运行并附加到终端(由于 -i 和 -t 标志),所以你可以在输出机库到中段时使用键盘提供输入。
  6. 当你键入 exit 以终止 /bin/bash,容器将停止,但不会被删除。你可以重新启动它或删除它。

SERVICES(服务)
服务允许你跨多个Docker守护进程扩展容器,这些守护进程与多个管理器和工作人员一起工作。集群中的每个成员都是一个Docker守护进程,这些守护进程都使用Docker API进行通信。服务需要你定义所需的状态,例如在任何给定时间必须可用的服务副本的数量。默认情况下,服务跨所有工作节点进行负载均衡,对于使用者来说,Docker服务似乎是一个单独的应用程序。Docker Engine在Docker 1.12及更高版本中支持集群模式

The underlying technology(底层技术)
Docker使用Go编写的,他利用了Linux内核的几个特性来交互其功能

Namespaces(名称空间)
Docker使用一种称为名称空间的技术来提供称为容器的隔离工作区。运行容器时,Docker为该容器创建一组名称空间
这些名称空间提供了一个隔离层。容器的每个方面都在一个单独的名称空间中运行,他的访问权限仅限于该名称空间。
DoDocker Engine在Linux上使用的命名空间如下:
pid 名称空间:进程隔离(PID:Process ID)
net 名称空间:管理网络接口(net:Networking)
ipc 名称空间:管理对 ipc 资源的访问(ipc:进程间通信)
mnt 名称空间:管理文件系统挂载点(mnt:mount)
uts 名称空间: 隔离内核和版本标识符(UTS:Unix分时系统)

Control groups(控制组)
Linux上的Docker Engine还依赖于另一种称为control groups(cgrous)的技术。一个cgroups限定一个程序为一组特定的资源。控制组允许Docker Engine将可用的硬件资源共享给容器,并可选的执行限制和约束。例如,你可以对一个特定容器限制内存。

Union file systems(Union文件系统)
Union文件系统,或UnionFS,是通过创建层来操作的文件系统,使他们非常轻量级和快速。Docker Engine使用UnionFS为容器提供构建块。Docker Engine可以使用多个UnionFS变体,包括AUFS,btrfs、vfs和DeviceMapper。

Container format(容器格式)
Docker Engine将名称空间,控制组,和UnionFS组合成称为容器格式的包装器。默认的容器格式是libcontainer。将来,Docker可能通过与 BSD Jails 或 Solaris Zones等技术集成来支持其他容器格式

总结:


image.png