【转】Docker 容器化核心概念

Docker

VM vs Docker

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

示例一:部署 MySQL 服务

首先以一个在 Linux 部署 MySQL 服务器为例,相信每个开发或运维人员都有个这个经历,平均消耗时间应该至少在2个小时以上。而如果使用 docker 来实现,只需要5分钟,两个步骤:

  • 在linux上安装docker环境
  • 运行命令:docker run -d --name mysql -p 3306:3306 -v /home/freeman/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pwd mysql:5.7.14

示例二:部署公司项目

以往的流程:开发人员开发并测试完成,再交给运维人员部署,配置文件复杂似的在配置过程中耗费了太多的时间和精力。而如果使用新的开发部署模式,开发人员将配置作为项目的构成部分集成到产品中去,不需要运维人员关心具体的配置。

核心概念

  • LXC Linux Container的简写, 提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。LXC在资源管理方面依赖于Linux内核的cgroups 子系统,LXC在隔离控制方面依赖于Linux内核的namespace 特性.

  • cgroup Control Groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory, io 等等)的机制。最初由google的工程师提出,后来被整合进Linux内核。Cgroups也是LXC为实现虚拟化所使用的资源管理手段,可以说没有cgroups就没有LXC。

  • namespaces 提供一种资源隔离方案。PID,IPC,Network等系统资源不再是全局性的,而是属于特定的 Namespace。每个 Namespace 里面的资源对其他 Namespace 都是透明的。要创建新的Namespace,只需要在调用 clone 时指定相应的flag。Linux Namespaces 机制为实现基于容器的虚拟化技术提供了很好的基础,LXC就是利用这一特性实现了资源的隔离。不同 container 内的进程属于不同的 Namespace,彼此透明,互不干扰。

  • Docker
    一个实现容器化的平台,它提供一整套工具(docker-engine, docker-compose等等)让容器化变得异常简单。

解决的问题

  1. 简化配置
    这是 Docker 公司宣传的 Docker 的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker 在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个 Docker 的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。

  2. 代码流水线(Code Pipeline)管理
    前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker 给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。

  3. 提高开发效率
    这就带来了一些额外的好处:Docker 能提升开发者的开发效率。不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是 Docker 做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在 Docker 可以轻易的让几十个服务在 Docker 中跑起来。

  4. 隔离应用
    有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等。我们经常需要考虑两点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务。

  5. 整合服务器
    正如通过虚拟机来整合多个应用,Docker 隔离应用的能力使得 Docker 可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker 可以比虚拟机提供更好的服务器整合解决方案。

  6. 调试能力
    Docker 提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试 Bug。

  7. 多租户环境
    另外一个Docker有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于Docker环境的启动速度和其高效的diff命令。

  8. 快速部署
    在虚拟机之前,引入新的硬件资源需要消耗几天的时间。Docker的虚拟化技术将这个时间降到了几分钟,Docker只是创建一个容器进程而无需启动操作系统,这个过程只需要秒级的时间。

常用命令

进入容器交互模式 docker exec -it container-name /bin/bash
强制删除所有容器(包括当前正在运行的容器) docker rm -f $(docker ps -a -q)



作者:我是柯南
链接:https://www.jianshu.com/p/297395270278
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载于:https://www.cnblogs.com/Danny-test/p/9132120.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

弹簧活性样品

Spring-Reactive旨在为基于Spring的项目带来响应式编程支持 ,并且有望在Spring 5的时间表中提供。 我的意图是使用此模型为REST端点行使一些非常基本的签名。 在继续之前,请允许我确认整个样本完全基于塞巴斯蒂安德勒兹(SbastienDeleuze&…

团队作业_1_博客1(分工理解)

对于团队大作业分工(服务端)的理解: 这次大作业一经出炉,还是感觉很有意思的,虽然之前老师已经提及会出这么一个大作业来训练我们的能力,但是真的看到作业的出现,还是很惊喜的。 团队作业的分工…

pojo类继承pojo类_如何编写更好的POJO服务

pojo类继承pojo类在Java中,您可以轻松地在Plain Old Java Object(POJO)类中实现一些业务逻辑,并且可以在高级服务器或框架中轻松运行它们。 有许多服务器/框架,例如JBossAS,Spring或Camel等,它们…

国外机构操盘图

转载于:https://www.cnblogs.com/carl2380/p/9139020.html

代码气味–第二部分

在上一篇文章《代码气味–第一部分》中 ,我谈到了膨胀器:它们是代码气味,可以识别为长方法,大型类,基元痴迷,长参数列表和数据块。 在这一篇中,我想深入研究面向对象的滥用者和变更阻止者 。 面…

solr 启动、停止

启动命令: solr start 停止命令 solr stop -all 转载于:https://www.cnblogs.com/yby120/p/9139791.html

第一篇博客测试

第一次发博客测试,看看都能进行什么操作。 再编辑一下,发表的时间就又改了? 没想到这个测试也有这么多人访问,那我把我的测试结果也贴出来供大家参考: 1. 无论怎么编辑,发表时间不会更改; 2. 编…

hadoop 提交程序并监控运行

程序编写及打包 使用maven导入第三方jar pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&qu…

digester_Apache Digester示例–轻松配置

digester解决问题–硬编码&#xff0c;需要为您的应用程序创建自定义配置&#xff0c;例如struts配置文件&#xff0c;仅通过更改文件即可改变应用程序的行为。 Apache Digester可以轻松为您完成此任务。 使用Apache Digester相当容易将XML文档转换为相应的Java bean对象层次结…

MFC状态栏编程(显示系统时间和进度条)

显示系统时间 1、 在状态栏中设置两个新的栏位Timer和Progress。首先到ResourceView中编辑String Table&#xff0c;增加IDS_TIMER(时间),PROGRESS(进度)。然后在MainFrame中修改indicators数组&#xff0c;插入IDS_TIMER和IDS_PROGRESS。插入的位置&#xff0c;即为显示的位置…

极光推送服务端API(定时推送任务,推送到指定设备,推送到所有设备)

极光推送常用的几个api方法总结&#xff0c;抽取出了utils类&#xff0c;利用MsgType进行业务类型区别&#xff0c;方便app端收到推送后进行不同处理&#xff1a; 首先引入依赖&#xff1a; <!-- 极光推送 --><dependency><groupId>cn.jpush.api</groupId…

Java 9附加流

Java 9即将发布&#xff01; 它不仅仅是Jigsaw项目 。 &#xff08;我也很惊讶。&#xff09;它给平台带来了很多小的变化&#xff0c;我想一一看一下。 我将标记所有这些帖子&#xff0c;您可以在这里找到它们。 让我们从…开始 流 Streams学习了两个新技巧。 第一个处理前缀…

MFC注册快捷键

1. 使用RegisterHotKey()注册快捷键&#xff1b;2. OnHotKey()函数中响应快捷键&#xff1b;3. 程序退出时&#xff0c;使用UnregisterHotKey(hWnd, m_HotKeyId)取消快捷键注册。

Hibernate---对象的三种状态

Hibernate---对象的三种状态 简而言之&#xff0c;hibernate本就是面向对象的基于ORM的框架&#xff0c;位于dao层&#xff0c;对数据进行操作的框架。我就谈谈hibernate的对象的三种状态。他们分别为&#xff1a;游离&#xff0c;持久和瞬时。通过代码来详解一下吧。 hibernat…

VS2008 C++ 项目添加“依赖”、“库目录”和“包含目录”

1. 添加编译所需要&#xff08;依赖&#xff09;的 lib 文件[解决方案资源管理器]“项目->属性->配置属性->连接器->输入->附加依赖项”里填写“winsock.lib”&#xff0c;多个 lib 以空格隔开。 &#xff08;等同于“#pragma comment(lib, "winsock.lib&q…

IDEA项目搭建四——使用Mybatis实现Dao层

一、引入mybatis及mysql的jar包 可以从阿里云上面查找版本&#xff0c;db操作放在dao层所以打开该层的pom.xml文件&#xff0c;找到<dependencies>节点增加两个引入 <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifac…

连词我们…讨厌

最近&#xff0c;我写了与实现相关的名称&#xff0c;并提供了一些示例&#xff0c;这些示例由于方法名称与主体之间的紧密关系而导致方法名称不正确。 有一会儿&#xff0c;我们有以下代码&#xff1a; boolean isComplexOrUnreadableWithTests() { return (complex || unre…

C#常见编译错误

CSharp类型初始值设定项引发异常&#xff1a;类的静态变量初始化遇到异常&#xff0c;或者构造函数中遇到异常

python函数的 全局变量与局部变量

一、函数的全局变量 1、什么是全局变量 顶着头开始写&#xff0c;没有任何缩进&#xff0c;在py文件的任何位置都能调用 #!/usr/bin/env python # _*_ coding:utf8 _*_ name"gouguoqi"name"gouguoqi" def change_name():print ("111",(name)) …

C#程序将DLL包进EXE方法

有时候我们在发布程序的时候只想发布一个EXE&#xff0c;而编写程序的时候往往会有多个DLL&#xff0c;这个时候如果能把这些DLL装进EXE将是一个很令人振奋的事情&#xff0c;事实上对于C#程序有很多方法如下&#xff1a;1. 使用微软的ILMerge&#xff08;缺点&#xff1a;不支…