Docker简介
Docker是什么
- Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
- 它通过分层镜像标准化和内核虚拟化技术,使得应用开发者和运维工程师可以以统一的方式跨平台发布应用,并且以几乎没有额外开销的情况下提供资源隔离的应用运行环境。我们目前知道的云服务是基于操作系统级别的隔离,在同一台物理机器上虚拟多个主机,而docker的实现是直接将操作系统环境和应用进行移植。
Docker用途
- 提供一次性的环境:比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
- 提供弹性的云服务:因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
- 组建微服务架构:通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
Docker与虚拟机
- Docker属于OS级别的虚拟化,
kernel
通过创建多个镜像来隔离不同的app进程,由于kernel
是共享,而且本身linux image
也不大,性能损耗几乎可以不计,而且内存占用也不大,大大节约了设备成本。 - 相比之下,虚拟机(VM)运行一个成熟的“Guest”用户操作系统,通过虚拟机监控程序虚拟地访问主机资源。一般来说,
VMs
提供的环境比大多数应用程序所需的资源要多。
虚拟机不足
- 资源占用多 虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行,内存消耗感人!
- 冗余步骤多
虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。 - 启动慢
启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。速度非常感人!
Docker架构
Docker客户端
Docker客户端,以docker二进制的形式出现,是Docker最基本的用户接口。他接收来自用户的命令,然后和Docker守护进程来回沟通。用户通过docker client
向docker daemon
发送REST请求。
Docker守护进程
Docker daemon 是服务器组件,正如上面的图片显示,Docker守护进程运行在一个主机机器中。用户不直接和守护进程交互,而是通过Docker客户端
Docker核心三大组件
- 镜像(image)
- 容器(Container)
- 仓库(Registry)
镜像(image)
Docker运行容器前需要本地存在对应的镜像。
镜像可以用来创建Docker容器的。一个镜像可以包含一个完整的操作系统环境和用户需要的其它应用程序。在docker hub
里面有大量现成的镜像提供下载。docker的镜像是只可读的,一个镜像可以创建多个容器。如同在电脑上安装系统镜像文件。
容器(Container)
docker利用容器来开发、运行应用。
容器是镜像创建的实例。它可以被启动、开始、停止、删除。每个容器都是 相互隔离的、保证安全的平台。类似安装系统的电脑实体。
仓库(Registry)
仓库是集中存放镜像文件的场所。
每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
最大的公开仓库是DockerHub,存放了数量庞大的镜像供用户下载。国内的公开 仓库包括DockerPool等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库,类似应用市场。
Docker Machine
简介
Docker Machine是一种工具,可以让您在虚拟主机上安装Docker引擎,并使用Docker - Machine
命令来管理主机。
您可以使用Machine在您的本地Mac或Windows框上创建Docker主机,或者在您的公司网络上,在您的数据中心,或在云提供商,如Azure, AWS,或Digital Ocean。
使用Docker -machine
命令,您可以启动、检查、停止和重新启动托管主机、升级Docker客户机和守护进程,并配置一个Docker客户端与您的主机进行对话。
将机器CLI指向正在运行的托管主机,您可以直接在该主机上运行docker命令。
例如,运行docker-machine env默认指向一个名为default的主机,按照屏幕上的指示完成env设置,并运行docker ps、docker
运行hello-world
,等等。
为何要用Docker Machine?
Docker Engine运行在本地linux系统上。如果你当前的系统是Linux,想在上边运行docker 命令,你只需要下载和安装Docker Egine就完了。然而,如果你想在网络上,云平台上,以及本地创建Docker host,你就需要Docker Machine,所以Docker解决的是跨平台问题。
无论是Mac,Windows或是Linux,你都可以在其上安装Docker Machine,使用docker-machine命令来创建和管理大量的Docker hosts。它会自动创建主机,在主机上安装Docker Engine,然后配置docker client。每个被管理的主机(“machine”)都是一个Docker 主机和一个配置过的client的组合。
官方给的Docker Machine的具体使用场景:
你目前只有一个老版本的MacOSX(比如10.10.2)或者Windows系统,想在上边运行docker。
我想在远程系统上创建Docker主机。
Docker Engine 和Docker Machine区别
Docker Engine 主要用来接收和处理docker命令请求的。
Docker Machine则主要用来管理 docker化的 host (安装了Docker Engine的主机)。
当人们说Docker
时,他们通常指的是Docker
引擎,由Docker守护程序组成的客户机-服务器应用程序,这个REST API指定了与守护进程交互的接口,以及与守护进程对话的命令行接口(CLI)客户端(通过REST API包装器)。
Docker引擎接受来自CLI的Docker命令,比如Docker run <image>, Docker ps
列表运行容器,Docker image ls
列表图像,等等。
通常,你都是在本地安装Docker Machine。Docker Machine包含自己的命令行客户端:docker-machine
以及Docker Engine
的客户端:docker。你可以使用Machine在一个或多个虚拟机上安装Docker Engine。这些虚拟机可以是在本地(当你使用Machine在VirtualBox安装和运行Docker Engine时),也可以是远程的(妮妮使用Machine在云平台上创建Docker化的主机时)。这些虚拟化的主机可以被认为是“machine”。
Docker Compose
Docker Compose是定义和运行多容器Docker应用程序的工具。通过compose您可以使用YAML文件来配置应用程序的服务。然后,使用单个命令创建并启动配置中的所有服务。