Docker:替代传统虚拟机的“鲸鱼”(Docker: A 'Whale' Replacing Traditional VM)

  • 概念
  • Docker架构
  • docker与虚拟机的异同
  • Centos7的docker安装
  • docker的使用

概念

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker的应用场景

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

Docker架构

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。因此容器与镜像的关系类似于面向对象编程中的对象与类,换言之,镜像是一种描述,而容器是将描述具体化的对象。

Docker:替代传统虚拟机的“鲸鱼”(Docker: A 'Whale' Replacing Traditional VM)_第1张图片

构件 作用
Docker 镜像(Images) Docker 镜像是用于创建 Docker 容器的模板。
Docker 容器(Container) 容器是独立运行的一个或一组应用。
Docker 客户端(Client) Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。
Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker 仓库(Registry) Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。
Docker Machine Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

docker与虚拟机的异同

虚拟机,我们知道是通过软件模拟了一个操作系统,我们可以在这个模拟出来的操作系统上(客户机)进行任意操作,就和正常使用一个装载了该模拟系统的电脑几乎没有区别。而且模拟出来的系统和承载虚拟机软件的系统(宿主机)之间是隔离的,所以不用担心两者会造成什么相互影响,不过模拟系统肯定要分去本机的一些硬件资源(磁盘、内存、CPU)的。

而docker中最核心的概念就是容器。光看作用,容器和虚拟机很像,都是为应用提供一个可正常运行的环境,不过最直观的一个区别是,容器相比虚拟机要更节省内存,启动更快。Docker官方一直对外宣传的就是“虚拟机需要数分钟启动,而Docker容器只需要50毫秒”。

  • 理解虚拟机

我们首先来看一下虚拟机的运行模式,即虚拟机如何运行多个相互隔离的应用:

从下到上理解上图:

  • 基础设施(Infrastructure)。它可以是你的个人电脑,数据中心的服务器,或者是云主机。
  • 主操作系统(Host Operating System)。你的个人电脑之上,运行的可能是MacOS,Windows或者某个Linux发行版。
  • 虚拟机管理系统(Hypervisor)。利用Hypervisor,可以在主操作系统之上运行多个不同的从操作系统。类型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V以及支持Linux的KVM。类型2的Hypervisor有VirtualBox和VMWare。
  • 从操作系统(Guest Operating System)。假设你需要运行3个相互隔离的应用,则需要使用Hypervisor启动3个从操作系统,也就是3个虚拟机。这些虚拟机都非常大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗很多CPU和内存。
  • 各种依赖。每一个从操作系统都需要安装许多依赖。如果你的的应用需要连接PostgreSQL的话,则需要安装libpq-dev;如果你使用Ruby的话,应该需要安装gems;如果使用其他编程语言,比如Python或者Node.js,都会需要安装对应的依赖库。
  • 应用。安装依赖之后,就可以在各个从操作系统分别运行应用了,这样各个应用就是相互隔离的。

  • 理解docker容器

再看docker如何运行多个相互隔离的应用:

首先最直观的感受就是,相比虚拟机的运行架构,docker的运行架构要简洁一些,因为虚拟机的Hypervisor+GUEST OS两层被docker的一层DAEMON给替代掉了。

从下到上理解上图:

  • 基础设施(Infrastructure)。
  • 主操作系统(Host Operating System)。所有主流的Linux发行版都可以运行Docker。对于MacOS和Windows,也有一些办法”运行”Docker。
  • Docker守护进程(Docker Daemon)。Docker守护进程取代了Hypervisor,它是运行在操作系统之上的后台进程,负责管理Docker容器。
  • 各种依赖。对于Docker,应用的所有依赖都打包在Docker镜像中,Docker容器是基于Docker镜像创建的。
  • 应用。应用的源代码与它的依赖都打包在Docker镜像中,不同的应用需要不同的Docker镜像。不同的应用运行在不同的Docker容器中,它们是相互隔离的。

  • 对比虚拟机与docker

Docker守护进程可以直接与主操作系统进行通信,为各个Docker容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。( 简而言之,容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。容器使用宿主操作系统的内核,而虚拟机使用独立的内核。)

说了这么多Docker的优势,大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而Docker通常用于隔离不同的应用,例如前端,后端以及数据库。

另外,Docker 的局限性之一是,它只能用在 64 位的操作系统上。

Centos7的docker安装

Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。因此想要安装 docker,只需要运行下面的 yum 命令:

 yum install docker

docker的使用

  • 启动docker服务

安装完成后,使用下面的命令来启动 docker 服务,并将其设置为开机启动:

[root@localhost ~]# service docker start
[root@localhost ~]# chkconfig docker on

(此处采用了旧式的 sysv 语法,如采用CentOS 7中支持的新式 systemd 语法,如下:

[root@localhost ~]# systemctl start docker.service
[root@localhost ~]# systemctl enable docker.service
  • 下载官方的 CentOS 镜像到本地

由于 Docker 被墙 ,所以请使用 http://docker.cn 的镜像。

[root@localhost ~]# docker pull centos
Pulling repository centos
192178b11d36:Download complete
70441cac1ed5:Download complete
ae0c2d0bdc10:Download complete
511136ea3c5a:Download complete
5b12ef8fd570:Download complete
  • 确认 CentOS 镜像已经被获取:

    [root@localhost ~]# docker images centos
    REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
    centos centos5 192178b11d362 weeks ago 466.9 MB
    centos centos6 70441cac1ed52 weeks ago 215.8 MB
    centos centos7 ae0c2d0bdc10 2 weeks ago 224 MB
    centos latest ae0c2d0bdc10 2 weeks ago 224 MB

运行一个 Docker 容器:

[root@localhost ~]# docker run -i -t centos /bin/bash
[root@dbf66395436d /]#

我们可以看到,CentOS 容器已经被启动,并且我们得到了 bash 提示符。在 docker 命令中我们使用了 “-i 捕获标准输入输出”和 “-t 分配一个终端或控制台”选项。若要断开与容器的连接,输入 exit。

[root@cd05639b3f5c /]# cat /etc/RedHat-release
CentOSLinux release 7.0.1406(Core)
[root@cd05639b3f5c /]#exit
exit
[root@localhost ~]#

我们还可以搜索基于 Fedora 和 Ubuntu 操作系统的容器。

[root@localhost ~]# docker search ubuntu
[root@localhost ~]# docker search fedora
  • 显示正在运行的容器列表

    [root@localhost ~]#  docker ps
    

本文参考:

[1]Docker 教程
[2] 虚拟机与Docker有何不同
[3]CentOS 7 上安装 Docker 详解

你可能感兴趣的:(Program,Development)