# 揭开Docker的面纱

作者:IT王小二

博客:https://itwxe.com (opens new window)

开新坑了,开始挖坑Docker了,兄弟们。为什么需要Docker呢?Docker是什么?这里开始揭开Docker的面纱。

# 一、为什么需要Docker

可能每个开发人员都有一种困扰,软件开发完之后部署项目,明明测试环境部署了一点问题没有,怎么一到正式环境就出错呢?

这种情况有时候问题可能就出在环境配置上,操作系统版本是否一致,软件运行依赖库版本是否一致,操作系统设置是否一致......等等都有可能造成部署失败。

那么有没有一种办法可以保持所有机器的环境配置都一致呢,这样同时也方便我们迁移系统,不然每次扩容部署就要重新配置一台机器的环境,这种繁琐的工作能不能配置好一次,之后就复用呢?

答案是有,这时候就提出了一种方案,虚拟机(大家应该都知道是啥吧,就不啰嗦了)。

虚拟机对于操作系统来说只是一个文件,如果需要多个只需要把虚拟机导出为ova文件,安装后即和导出的系统环境一摸一样,这样就解决了环境配置繁琐的问题,这样可以说 99.9999% 项目跑不起来不可能是环境的问题了。

那么你可能会问,既然虚拟机都解决了环境配置繁琐的问题,那为啥 Docker 还过来凑热闹呢?

这就涉及到虚拟机的不足了,虚拟机占用资源问题。

  • 虚拟机是一个完整的操作系统,会占用磁盘的资源,一个系统需要多少磁盘那么就会占用多少磁盘资源。也就意味着假如有 10 台虚拟机,那么就占用了 10 个操作系统的磁盘空间。
  • 哪怕虚拟机真实使用的内存 1MB,虚拟机仍然需要几百 MB 的内存。同理,几个虚拟机则造成了几个操作系统内存的资源浪费。
  • 启动慢,启动时间基本和操作系统启动时间一致。

说到这里,你肯定明白了,Docker就可以解决上述的不足。

Docker 是怎么解决虚拟机带来的不足呢?

其实也不能说是 Docker 解决的,应该说 Linux 发展了另一种虚拟化技术:Linux容器。有兴趣的小伙伴可以去查查资料看看 Linux容器技术发展简史

Linux 容器不虚拟化出整个操作系统,简单来说就是共享操作系统内核 + 必要运行环境,而主角 Docker 只是 Linux容器 思想的实践产品之一。

  • 容器虚拟化的不是一个完整的操作系统,所以当然磁盘资源占用少很多。
  • 容器复用了 Linux 内核,作为一个进程运行,所以占用的内存自然也少很多。
  • 容器作为系统中的一个进程,所以启动速度当然快很多,基本上是秒级。

对比 虚拟机 和 容器

特性 虚拟机 容器
硬盘使用 一般为GB 一般为MB
启动 分钟级 秒级
系统支持量 一般几十个 单机支持上千个容器

# 二、Docker是什么

# 1. Docker简介

Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余 项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker 的基础是 Linux 容器(LXC)等技术。

# 2. Docker的三大基础概念

# Docker镜像(Image)

Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器。

例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或 用户需要的其它应用程序。

Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接 从其他人那里下载一个已经做好的镜像来直接使用。

# Docker容器(Container)

Docker 利用容器来运行应用。 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的 Linux 环境(包括root 用户权限、进程空间、用户空 间和网络空间等)和运行在其中的应用程序。

# Docker仓库(Registrty)

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为 一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 DockerHub,存放了数量庞大的镜像供用户下载。 当然,用户也可以在本地网络内创建一个私有仓库。

当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这 样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

# 3. 镜像、容器、仓库关系

镜像、容器、仓库关系

# 4. 镜像、容器、仓库的运行关系

镜像、容器、仓库的运行关系

都读到这里了,来个 点赞、评论、关注、收藏 吧!