随着云原生时代的来临,云以及分布式计算已经是时下最受欢迎的技术之一了。其中 Docker 作为最知名的容器平台,到底有着怎样的魅力来让其无人不知无人不晓?废话不多说,让我们开始逐层掀开容器技术的神秘面纱吧!

Docker



从传统 IT 到 IaaS 到 PaaS 的能力变迁

让时间回到 2013 年,在该时候,虚拟机和云服务已经很流行了。主流用户的常见做法,就是在云平台(比如腾讯云、AWS、OpenStack 等),像管理物理服务器一样用脚本来做管理和部署应用。

这样的做法一直存在本地环境和线上环境不一致导致部署出现问题的风险,所以各家云平台的思路都是去模拟出更加接近本地服务器的环境,来给用户提供更好的上云体验。所以开源的 PaaS 项目提供“应用托管”的能力,就是解决该问题的一个最佳方案。

在众多开源 PaaS 项目中,最热门的 Cloud Foundry 基本上已经吸引了所有云厂商的目光,开启了以开源 PaaS 为核心构建平台层服务能力的变革。

大家可能并不是很熟悉 Cloud Foundry,简单地说,Cloud Foundry 所做的就是提供一个 "cf push" 命令行工具,让大家能够对一些主流语言的代码进行打包上传和分发。然后 Cloud Foundry 通过调用操作系统的 CGroups 和 Linux Namespace,单独为每一个应用创建一个隔离的沙盒环境,然后在其中启动这些应用的进程。



Cloud Foundry 的最核心命令 cf push 的业务流程图

所以当时 Cloud Foundry 最核心的能力,就是提供隔离的运行环境,也就是“容器”了。



当时的 PaaS 风潮参与者,dotCloud 是最不起眼的公司之一

同期,有一家名叫 dotCloud 的公司,因为它的主打产品跟 Cloud Foundry 社区是脱节的,所以长期以来都无人问津。终于,dotCloud 公司决定开源自己的容器项目 Docker。

但很可惜在当时并没有人关注 dotCloud 的该决定,因为“容器”该概念从来就不是什么新鲜的东西,也不是 Docker 公司发明的。哪怕是在当时最热门的 PaaS 项目 Cloud Foundry 里,容器也只是其最底层,最没人关注的那一部分。

而 Docker 项目,实际上和 Cloud Foundry 的容器并没有太大的不同,所以在 Docker 发布后不久,Cloud Foundry 的首席产品经理 James Bayer 就在社区里做了一次详细对比,告诉用户 Docker 实际上只是一个同样使用 Cgroups 和 Namespace 实现的“沙盒”而已,没有什么特别的黑科技,也不需要特别关注。

然而,几个月后,James Bayer 就被打脸了。Docker 只用了短短几个月,就让所有 PaaS 社区都出局了。事实上,Docker 项目确实和 Cloud Foundry 的容器在大部分功能和实现原理上并没有什么区别,但仅有的一个不一样的功能,成了 Docker 项目的制胜关键。

该功能就是 Docker 镜像。

当时主流的 PaaS 项目,如 Cloud Foundry,都通过提供一套应用打包功能,帮助用户大规模部署到集群。但就是该打包功能,需要用户为每个应用做大量的配置工作和调试工作,才能让本地能供正确运行的应用,在集群里也能正确运行。

而 Docker 镜像,恰好解决了该根本性的问题。Docker 镜像的本质,就是一个压缩包,但和 PaaS 的应用打包相比,该压缩包里则是多了完整的运行环境依赖内容,比如操作系统的所有文件和目录。只要用户拿着该压缩包,便可以通过某些技术手段在任何地方创建一个沙盒来运行用户的应用了,因为其做到了本地环境和云端环境高度的一致,再加上 Docker 充满趣味性的推广,比如 “1 分钟部署一个 WordPress 网站”、“3 分钟部署一个 Nginx 集群”等,最终通过与开发者的亲密关系,加上解决了打包的根本性难题,从而一举登天。

Linux Namespace,Linux Cgroups ,rootfs

我们前面已经介绍了 Docker 的发展,那么,回归到技术本身,容器到底是什么呢?这里可以先下一个定义:

一个“容器”,实际上是一个由 Linux Namespace、Linux Cgroups 和 rootfs 三种技术构建出来的进程的隔离环境。

  • Linux NamespaceLinux Cgroups,提供了运行时的隔离和资源的授予。
  • rootfs,也就是镜像,提供了容器的运行内容。

比如对于如下 Dockerfile:

# 使用官方提供的 Python 开发镜像作为基础镜像
FROM python:3.8-slim-buster # 将工作目录切换为 /app
WORKDIR /app # 拷贝应用依赖描述文件到工作目录
COPY requirements.txt requirements.txt # 使用 pip 命令安装应用以及其所需的依赖
RUN pip3 install -r requirements.txt # 拷贝应用文件到工作目录
COPY . . # 设置容器进程为 "python3 app.py",也是该 Python 应用的启动命令
CMD [ "python3", "app.py"]

在该 Dockerfile 里,我们先通过一个基础镜像 python:3.8-slim-buster,安装依赖并复制应用到工作目录,最后指定应用的进程,即启动命令。在该描述下,我们会得到如下容器视图:

该容器的进程是“python3 app.py”,运行在由 Linux namespace + Linux cgroups 构成的隔离环境里。而它所需要的各种文件,包括 Python、app.py 和整个操作系统文件,则由多个联合挂载在一起的 rootfs 提供。该 rootfs 的最下层,是只读的 Docker 镜像。在 Docker 镜像之上,是 Docker 的管理器添加的 init 层,用于临时存放被管理器修改过的 /etc/hosts 等文件。在 rootfs 的最上层是读写层,以 Copy-On-Write 的方式存放所有对只读层文件的修改,和容器声明的 Volume 挂载点。从该容器视图里,我们可以总结出一个运行中的 Linux 容器,由以下内容构成:

  • 一组联合挂载的 rootfs,这部分我们称之为容器的“镜像”(Image)。
  • 一个由 Linux namespace + Linux cgouprs 构成的隔离环境,这部分我们称之为容器的“运行时”(Runtime)。

Docker install

前文已经介绍了容器的本质和其背后的逻辑,我们现在以 Ubuntu 18 LTS 为例,介绍如何安装 Docker,为后面的 Kubernetes 做好准备。

配置 REPOSITORY

1、更新 apt 包管理器索引和配置 apt 能够使用 HTTPS 的仓库。

 sudo apt-get update

 sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release

2、添加 Docker 官方 GPG 公钥。

 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

3、指定使用稳定版的 Docker 版本。

echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装 Docker engine

1、更新 apt 包管理器索引,然后安装最新的稳定版 Docker engine。

 sudo apt-get update

 sudo apt-get install docker-ce docker-ce-cli containerd.io

2、安装完成后,通过执行 hello-world镜像,验证 Docker engine。

sudo docker run hello-world

现在安装完成,可以开始使用 Docker 了。

容器编排

作为一名开发者,我们其实并不关心容器运行时的差异,因为在整个“开发-发布”流程中,真正发布的其实是容器镜像。对于云服务商来说,则可以通过容器镜像将他们和潜在用户(如开发者)直接关联起来。因此,能够定义容器组织和管理规范的“容器编排”技术,成为了云计算最热门的技术。这其中,最具代表性的容器编排工具有如下两个:

• Docker 公司的 Compose+Swarm 组合;

• Google 与 RedHat 公司共同主导的 Kubernetes 项目。而目前该项目已经成为业界标准。

接下来的 Kubernetes 普及系列,将会带大家深入了解目前承载着云原生发展的绝对主角——Kubernetes,让我们下回再见!

Kubernetes 普及系列:容器基础入门的更多相关文章

  1. 「译」JUnit 5 系列:基础入门

    原文地址:http://blog.codefx.org/libraries/junit-5-basics/ 原文日期:25, Feb, 2016 译文首发:Linesh 的博客:JUnit 5 系列: ...

  2. Docker 系列之 基础入门

    安装 Docker Windows 10 专业版以上版本 Docker for Windows Installer 在安装前,需要确保目标机器已经开启了硬件虚拟化和 HyperV :在安装的过程中建议 ...

  3. Docker容器基础入门认知-网络篇

    这篇文章中,会从 docker 中的单机中的 netns 到 veth,再到单机多个容器之间的 bridge 网络交互,最后到跨主机容器之间的 nat 和 vxlan 通信过程,让大家对 docker ...

  4. Vue 系列之 基础入门

    背景叙述 渐进式 JavaScript 框架 易用:已经会了 HTML.CSS.JavaScript?即刻阅读指南开始构建应用! 灵活:不断繁荣的生态系统,可以在一个库和一套完整框架之间自如伸缩. 高 ...

  5. docker容器技术基础入门

    目录 docker容器技术基础入门 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 docker ...

  6. 【JAVA零基础入门系列】Day4 变量与常量

    这一篇主要讲解Java中的变量,什么是变量,变量的作用以及如何声明,使用变量. 那么什么是变量?对于初学者而言,可以将变量理解为盒子,这些盒子可以用来存放数据,不同类型的数据需要放在对应类型的盒子里. ...

  7. 零基础入门 Kubernetes,你需要知道这些

    Kubernetes是什么? 大概很多人对此都有疑问,不过在容器领域,Kubernetes却无人不晓. 阿里.字节跳动.腾讯.百度等中国互联网行业巨擘们,近年来都在深耕容器领域,而Kubernetes ...

  8. 快速入门系列--WebAPI--01基础

    ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...

  9. saltstack之基础入门系列文章简介

    使用saltstack已有一段时间,最近由于各种原因,特来整理了saltstack基础入门系列文章,已备后续不断查阅(俗话说好记性不如烂笔头),也算是使用此工具的一个总结.saltstack的前六篇文 ...

随机推荐

  1. Same Origin Policy 浏览器同源策略详解

    同源策略 Same Origin Policy 日常开发中最常与网络打交道,那关于浏览器的同源策略和跨域相关的知识是该整理一下了. 首先需要明确的是,同源策略是浏览器的安全策略,由于存在这个策略,我们 ...

  2. 后端程序员之路 42、Semaphore

    前面学习了Pthreads,了解了线程和线程同步,而同步这个东西,与信号量是密不可分的.下面讨论的主要是Pthreads里的semaphore.h,而不是sys/sem.h [Linux]线程同步之信 ...

  3. 【老孟Flutter】Flutter 2.0 重磅更新

    老孟导读:昨天期待已久的 Flutter 2.0 终于发布了,Web 端终于提正了,春季期间我发布的一篇文章,其中的一个预测就是 Web 正式发布,已经实现了,还有一个预测是:2021年将是 Flut ...

  4. golang调用shell命令(实时输出, 终止等)

    背景 是这样的,最近在研究一个定时任务系统的改造,可能有点像jenkins做到的那种吧. 可以输入shell命令,也可以执行py脚本等等,相比之前来说,也要能够及时停止! 但是遇到了这么个问题,gol ...

  5. 《Asp.Net Core3 + Vue3入坑教程》 - Vue 1.使用vue-cli创建vue项目

    简介 <Asp.Net Core3 + Vue3入坑教程> 此教程适合新手入门或者前后端分离尝试者.可以根据图文一步一步进操作编码也可以选择直接查看源码.每一篇文章都有对应的源码 目录 & ...

  6. vscode配置golang开发环境手把手描述篇

    1.下载安装Golang https://golang.google.cn/dl/ 一路下一步即可 2.下载安装Vscode https://visualstudio.microsoft.com/zh ...

  7. Nebula Storage 2.0 存储格式

    随着 2.0 各版本的陆续发布,Nebula Graph 迎来了一系列的改动,在存储方面,影响最大的改动就是底层编码格式进行了修改.Nebula Graph 的底层存储是基于 KV 保存在 Rocks ...

  8. 最简单的JVM内存结构图

    JVM内存结构图 大家好,好几天没有更新了,今天的内容有点多,我们详细介绍下JVM内部结构图,还是和之前一样,案例先行,方便大家理解记忆. /** * @author :jiaolian * @dat ...

  9. slickgrid ( nsunleo-slickgrid ) 1 开篇有益

    slickgrid (nsunleo-slickgrid)  1 开篇有益  作为专职的程序猿,自认为是老菜鸟或老民工,以前一直在某浪上写博客,上知天文,下达地理.做了N年的.net,又转Java,从 ...

  10. react+ts封装AntdUI的日期选择框之月份选择器DatePicker.month

    需求:由于在项目开发中,当需要使用该组件时都需要对该组件进行大量的代码输出,为了方便代码统一管理,减少冗余代码,所以将此组件进行二次封装. 其他成员在使用中只需将自己的设置通过对应的参数传递到该组件, ...