入了Docker的坑

docker 是什么就不介绍了吧,现在很流行,不论是开发人员还是运维人员,都值得学习,毕竟人家的目标是做devops,用来统一开发、测试、线上环境的。
还是要简单介绍一下的,当作自己的学习笔记吧。

Docker是什么

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker容器完全使用沙箱机制,相互之间不会有任何接口。

Docker的主要特性如下:

  • 文件系统隔离:每个进程容器运行在完全独立的根文件系统里。
  • 资源隔离:可以使用cgroup为每个进程容器分配不同的系统资源,例如CPU和内存。
  • 网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址。
  • 写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间。
  • 日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。
  • 变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。
  • 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。

为什么要使用Docker

  • 更高效的利用系统资源
    由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此相比虚拟机技术,一个相同配置的主机往往可以运行更多数量的应用。
  • 更快速的启动时间
    传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
  • 一致的运行环境
    开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 “这段代码在我机器上没问题啊” 这类问题。
  • 持续交付和部署
    对开发和运维( DevOps) 人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
  • 更轻松的迁移
    由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
  • 更轻松的维护和扩展
    Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

简单一句话:变复杂的安装配置为一条命令解决,秒级启动镜像,资源消耗极少。

Containers vs VMs

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。 Docker去除了传统虚机的Guest OS层,免除了对应overhead。

  • VMs = Server + Host OS + Hypervisor(Type2)+ Guest OS + Bins/Libs +(App A | App B)
  • Containers = Server + Host OS + Docker Engine + ((Bins/Libs +App A) | (Bins/Libs +App B))
  • Docker 容器可以秒级启动,这比传统的虚拟机方式要快得多。
  • Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器
  • 容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小
  • 传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可
特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于原生
系统支持量 单机支持上千个容器 一般也就几十个

Docker 基本概念

三个基本组件:镜像、容器、仓库;

镜像

Docker镜像(Image)就是一个只读的模版。一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。
镜像可以用来创建Docker容器。

容器

  • Docker利用容器(Container)来运行应用。
  • 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。
  • 每个容器都是相互隔离的、保证安全的平台
  • 可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
  • 镜像是只读的,容器在启动的时候创建一层可写层作为最上层

仓库

仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
docker团队控制的top-level的顶级repository,即Docker Hub,存放了数量庞大的镜像供用户下载,任何人都能读取,里面包含了许多常用的镜像,如ubuntu, mysql ,redis, python等。
普通用户也可以注册Docker Hub,并发布公开的和私有的docker 镜像,类似于github。
除此之外,用户也可以在自己的内网环境搭建一个docker hub,可类比gitlab与github的关系。

后续

截止目前,我也买了一本书(<<第一本Docker书>>),间间断断的翻了一些;自己也在centos上装了Docker玩耍了几次;而且,我也用Docker部署了两个应用:我自己的私有git服务和私有云盘。

总体感觉是好用、简单、方便!接下来打算做一些关于Docker的学习笔记, 以示入坑。

念念不忘,必有回响