Hello Docker

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)中十分有用。
考虑以下示例场景:
- 开发人员在本地编写代码,并使用Docker容器与同事分享他们的工作。
- 开发人员使用Docker将应用程序推入测试环境,并执行自动和手动测试。当开发人员发现错误时,他们可以在开发环境中修复它们,并将其重新部署到测试环境进行测试和验证。
- 完成测试后,将修复程序推送给客户就如同将更新的镜像推送到生产环境一样简单。
响应式部署和缩放
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 pull或Docker 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能够定义和协调整个应用程序的功能。
参考资料:
Hello Docker的更多相关文章
- docker——容器安装tomcat
写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- Docker 第一篇--初识docker
已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...
- 在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 ...
- docker for mac 学习记录
docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...
- scrapy爬虫docker部署
spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...
- [原][Docker]特性与原理解析
Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...
- 开发者的利器:Docker 理解与使用
困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...
- 使用python自动生成docker nginx反向代理配置
由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...
- 微服务与Docker介绍
什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...
随机推荐
- MVC页面静态化
MVC 页面静态化 最近工作需要,实现页面静态化,以前在ASP时代,都是FSO自己手动生成的. 新时代,MVC了,当然也要新技术,网上一搜,找到一种解决方案,是基于MVC3的,实现原理是通过mvc ...
- Python中的三种数据结构
Python中,有3种内建的数据结构:列表.元组和字典.1.列表 list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目.列表中的项目.列表中的项目应该包括在方括号中,这 ...
- Python 直接赋值、浅拷贝和深度拷贝全解析
直接赋值:其实就是对象的引用(别名,其实就是一个人今天叫张三 明天叫张狗子的意思).这个人比较自由单身狗嘛 可以恋爱可以分手 就是一个小屌丝. 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的 ...
- [转载] java多线程学习-java.util.concurrent详解(一) Latch/Barrier
转载自http://janeky.iteye.com/blog/769965 Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent, 提供了大量高级工具,可 ...
- vim编辑器介绍及其常用命令
vim简单的介绍 Vim 编辑器是一个模式编辑器 . 这意味着在不同状态下编辑器有不同的行为模式 . 两个基本的模式是 Normal 模式和 Insert 模式 ,还有可视模式. 在 Normal 模 ...
- python学习笔记——Day 1
python是一种什么语言? 编译与解释 编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快; 而解释器则是只在执行程序时,才一 ...
- ExceptionLess 本地部署小结
ExceptionLess 是一个免费开源分布式系统日志收集框架,地址:https://github.com/exceptionless/Exceptionless 运行环境: .NET 4.6.1 ...
- day04 JS
很伤心,就在前天下午,本人的电脑突然挂了,电脑售后告知需要10个工作日才可修好. 于是乎,昨天学的内容来不及整理,暂且跳过,改天再抽空补上,就当缓几天再复习吧. 今天继续学习了JS的内容. 1 js的 ...
- 数细胞-swust oj
数细胞(0964) 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.编程需要用到的队列及其相关函数已经实现,你只需要完 ...
- pku夏令营面试
北大面试题目: 一.内存交换 内存交换(对换)的基本思想是,把处于等待状态(或在CPU调度原则下被剥夺运行权利) 的程序从内存移到辅存,把内存空间腾出来,这一过程又叫换出:把准备好竞争CPU运行的程序 ...