Docker: Build, Ship, and Run Any App, Anywhere
在任何地方构建、交付和运行任何应用

1. 引言

最近简单的学习了下Docker,本文先简要梳理下Docker涉及到的一些重要概念,后续在结合.NET Core探讨其基本用法。

2. What's Docker

Docker是用GO语言编写,利用Linux内核的几个特性来提供它的功能。Docker是一个开放平台用于快速开发、分发和部署应用程序。它提供了一个操作系统级别的抽象。它隔离了应用程序对基础架构(操作系统等)的依赖。解决了生产、测试、部署环境的一致性问题。

Docker提供了容器(松耦合且隔离的环境)去打包和运行应用程序。良好的安全性和隔离性允许我们在一个主机上运行多个容器。因为容器是直接在宿主机器的内核中运行且不需要额外的管理程序的负载(比如虚拟机需要VMware管理程序),所以说容器是轻量级的。

3. Docker Engine

从图中可知,Client使用docker CLI(命令行工具)通过Docker REST API去和docker daemon(docker的守护进程)进行交互,docker daemon负责去创建和管理Docker objects(比如镜像、容器、网络和存储卷等)。

4. Docker的适用场景

快速、一致地交付应用
Docker通过使用容器(其提供应用程序和服务)来提供标准化的工作环境来精简开发周期。容器在持续集成和持续开发(CI/CD)中十分有用。
考虑以下示例场景:

  1. 开发人员在本地编写代码,并使用Docker容器与同事分享他们的工作。
  2. 开发人员使用Docker将应用程序推入测试环境,并执行自动和手动测试。当开发人员发现错误时,他们可以在开发环境中修复它们,并将其重新部署到测试环境进行测试和验证。
  3. 完成测试后,将修复程序推送给客户就如同将更新的镜像推送到生产环境一样简单。

响应式部署和缩放
Docker的可移植性和轻量级特性也使得动态管理工作负载变得非常容易,几乎可以实时地按业务需求对应用程序和服务进行扩展和收缩。

在同一硬件运行多个工作负载
Docker的轻量级及运行快速的特性,允许我们用更少的资源做更多的事情,最大化的使用计算机的资源。Docker是高密度环境和中小型部署的理想选择。

5. Docker架构

从图中我们可以看出,Docker是一个C/S架构。客户端通过REST API与Docker的守护进程进行交互,守护进程从Registry(仓库,如DockerHub)拉取镜像,再构建、运行和分发容器等。

6. Docker VS Vitual Machine

首先,Docker是一种容器管理技术,而非虚拟化技术。与我们熟知的虚拟机有着本质区别:

通过上图可知,Docker是基于Docker引擎通过共享宿主机的硬件资源,使用容器来提供独立运行环境来运行应用程序!而VM则是基于Supervisor(虚拟机管理程序)使用虚拟机技术来提供隔离的虚拟机,在虚拟机的操作系统上提供运行环境!虽然两者都提供了很好的资源隔离,但很明显Docker的虚拟化开销更低!

7. 核心术语

下面我们就来重点梳理下Docker涉及到的一些核心术语:Registry、Image、Container、Stack、Service、Swarm。
Registry(仓库)
Docker Registry 用来存储Docker镜像,比如Docker官方的Docker Hub就是一个公开的仓库。在上面我们可以找到我们想要的镜像。当然我们也可以建立私有的镜像仓库。
当我们执行Docker pullDocker run命令时,若本地无所需的镜像,那么将会从仓库(一般为DockerHub)下载(pull)一个镜像。Docker执行run方法得到一个容器,用户在容器里执行各种操作。Docker执行commit方法将一个容器转化为镜像。Docker利用login、push等命令将本地镜像推送(push)到仓库。其他机器或服务器上就可以使用该镜像去生成容器,进而运行相应的应用程序。
另外,我们可以在Docker Store进行镜像交易。

Image(镜像)
镜像是自读的,用于创建Docker容器。我们可以基于一个镜像做一些额外的自定义更改后,commit成我们自己的镜像。也可以使用Dockerfile,build成我们自己的镜像。Docker使用镜像分层技术,Dockerfile中的每个指令都会创建为镜像中的一个层。

Container(容器)
容器是docker中最重要的概念,Container是镜像的运行实例,它是一个隔离的、资源受控的可移植的运行时环境,其中包含操作系统、需要运行的程序、运行程序的相关依赖、环境变量等。我们可以通过docker run <image>创建指定镜像的容器,创建容器时会在镜像上附加一个读写层。我们可以连接容器到一个或多个网络,并为其附加存储,或基于它当前状态创建一个新的镜像。Docker使用namespace的技术来实现容器之间的隔离!对于容器的更改是暂时的,当容器停止时,相应的改动就会丢失。我们可以通过挂载volume来持久化存储!

Docker Swarm(Docker集群)
Docker Swarm 是 Docker 的独立原生集群工具的名称。Docker Swarm 将多个Docker主机集群并将它们暴露为单个虚拟的Docker主机。

Service(服务)
通过服务我们可以很好进行容器扩展,默认情况下,服务在Swarm下的所有工作节点之间进行负载平衡。在Docker中我们通过编写docker-compose.yml来定义、运行和扩展服务。

Stack(服务堆)
Stack是一组相互关联的服务,它们可以共享依赖关系,并且可以一起协调和缩放。单个Stack能够定义和协调整个应用程序的功能。

参考资料:

Docker官方文档
Docker中文网
Docker术语表

Hello Docker的更多相关文章

  1. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  2. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  3. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  4. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  5. docker for mac 学习记录

    docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...

  6. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  7. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

  8. 开发者的利器:Docker 理解与使用

    困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...

  9. 使用python自动生成docker nginx反向代理配置

    由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...

  10. 微服务与Docker介绍

    什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...

随机推荐

  1. JavaScript学习笔记(一)——数据类型和变量

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  2. KICKSTART无人值守安装 - (字符界面操作)

    kickstart 部署 1.1 kickstart简介说明 1.1.1 pxe工作过程(图) 1.1.2 kickstart具体过程(图) 1.2 kickstart无人值守部署 1.2.1 系统环 ...

  3. MySQL5.6新特性

    Innodb加强项 1.Innodb全文索引 mysql> show create table film_text\G . row *************************** Tab ...

  4. 【转】MYSQL 使用SQLyog导入遇到问题解决

    原文地址:http://blog.163.com/o5655@126/blog/static/1667428342010910112510738/  昨天公司想要将一个数据库的数据导出再导入到另外一个 ...

  5. JavaScript高级程序设计之自学笔记(一)————Array类型

    以下为自学笔记. 一.Array类型 创建数组的基本方式有两种: 1.1第一种是使用Array构造函数(可省略new操作符). 1.2第二种是使用数组字面量表示法. 二.数组的访问 2.1访问方法 在 ...

  6. configpraser模块

    configpraser配置文件,example.conf [data] #节点 username = Jason password = 123 [public] comment = stuff pu ...

  7. Struts2-046验证脚本

    下面分享一下Struts2-046验证的python脚本 #encoding:utf-8 import urllib2 from poster.encode import multipart_enco ...

  8. C# winform 程序开发知识点总结(干货)

    1.数据库连接及操作 在说数据库操作之前,先说一下数据库连接操作字符串的获取 首先,点击服务器资源管理器,接下来选中数据连接右键点击添加连接,填入你要连接的服务器名称,点击单选框使用SQL Serve ...

  9. 自定义控件,上图下字的Button,图片任意指定大小

    最近处在安卓培训期,把自己的所学写成博客和大家分享一下,今天学的是这个自定义控件,上图下字的Button安卓自带,但是苦于无法设置图片大小(可以在代码修改),今天自己做了一个,首先看一下效果图,比较实 ...

  10. CCF-201312-3-最大的矩形

    问题描述 试题编号: 201312-3 试题名称: 最大的矩形 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ ...