跳至主要內容

揭开Docker的面纱

IT王小二约 1499 字

揭开Docker的面纱

作者:IT王小二

博客:https://itwxe.comopen in 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. 镜像、容器、仓库的运行关系

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