Docker解析及轻量级PaaS平台演练(一)--Docker简介与安装

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/46290985

Container技术:

传统的虚拟化技术:
通过对硬件层模拟,从而实现了能够在一套硬件上面运行多个操作系统,因为通过硬件虚拟化,使得操作系统认为在它之下就是硬件层

但是实际情况是这样的:虚拟机中的OS对硬件发出的请求都交给了虚拟的硬件,OS认为指令已经下达了,只要等待硬件返回信息即可,其实OS下面的那层“硬件”是要将指令发送给真正的硬件层来执行的

系统级别的虚拟化技术:
不同于传统的硬件虚拟化,它不需要模拟硬件层
多个虚拟机之间共享Host OS的Kernel内核,所以这些虚拟机是不可以像传统虚拟化技术那种装各种各样的OS,但是它同样可以让跑在里面的应用认为它就是处在一个独立的OS之中,每个虚拟机就像一个容器,里面可以装各种各样的应用,而不同容器中的应用总是认为他们是在一个独立在OS环境下的,所以又称为Container技术

两种虚拟化技术各有优劣,对比如下图:

这里写图片描述

下面是一张Container技术的结构图:

这里写图片描述

从图中可以看出,绿蓝红三种颜色的层组合起来就是一台Host主机,在Kernel层之上通过Container技术的三个要点:隔离(namespace),限制(cgroup),记录(chroot)
来虚拟出一个个容器,并管理他们

隔离:
通过namespace机制来避免一些系统级的冲突。
因为每个容器都可以当做一个独立的OS,那么他们就拥有自己的pid进程号等信息,如果这些东西和Host中的相冲突怎么办?毕竟容器不是自己在虚拟化的环境中独立安装一个OS,而是依赖于Host的OS
这时候就可以通过namespace来避免这些冲突,每个容器拥有自己的namespace来管理各自的系统信息

限制:
在Host看来,每个Container都只是一个普通的进程(当时在Container中的应用看来,这些Container都是一个OS),那么怎么来限制这些进程的CPU使用,时间片等资源呢?
cgroup是linux内核提供的限制,记录和隔离进程组所用的资源

记录:
上面说过,每个Container都可以当做一个独立的OS,既然它是一个OS那么肯定有自己的文件系统,那么问题又来了,每个Container都有自己的FS,Host也有自己的FS,这么多独立的FS要怎么管理?
chroot隔离根文件系统,怎么个说法呢?例如Host的根目录下有a,b目录,并且分别被两个Container当做其根目录。在Host角度来看,ab只是根目录下的两个普通文件夹而已,而对于Container a来说/a就是其根目录;对于Container b来说/b就是其根目录

Docker:

什么是Docker?
Docker是一种Container技术的实现,上面说到的Container技术也同样可以用来描述Docker

想一想,我们在开发一个应用的时候
我们在自己的PC上完成了开发工作,并将项目交给测试人员进行测试,但是万一测试的PC上的环境和开发的环境不一样,可能会出现各种各样的问题,同理应用发布到服务器上也是一样的
应用每到一台新的PC中时就要求该PC要装上它需要的所有东西,还要注意版本是不是一致的

而Docker可以帮我们解决这些问题

Docker可以创建一个个Container,前面说过,每个Container都可以当做一个独立的OS,那么我们就可以在这个Container之中进行应用的开发。开发完成之后,我们可以将这个Container打包成一个Image(Image和Container的管理可以理解成:类和实例),可以将其看做是一个集装箱,里面装着应用和应用的各种环境
在测试的PC上,通过Docker将这个集装箱(Image)拿过来通过其创建一个Container就可以直接进行使用和测试,这个Container和开发时使用的Container的环境是一致的(通过一个类实例化出来的各个对象)

Docker翻译为搬运工,它所做的事情也是搬运工一样的

这里写图片描述

我们可以将应用的各个组件,环境等都装进一个集装箱中,通过Docker运送到各个“码头上”

总结出一个Docker的最最简单的介绍:方便打包发布应用到容器中

我们来看看Docker的层次图:

这里写图片描述

最底层的lxc,aufs都收kernel内核中运行的

lxc:Linux Container,是Linux上的一种实现Container虚拟化的技术,早期的Docker就基于lxc实现的,最新的版本中已经用libcontainer代替了
aufs:Advanced multi layer Unification FileSystem,翻译成中文就是高级的,分层的,联合的文件系统,它最总要的内容就是可以将两个目录合并在一起,并可以设置操作权限(read-only/read-write)。Docker使用aufs来实现分层的文件管理

倒数第二层的Debian和BusyBox都是在Kernel之上的Image,Image就是一个镜像,可以通过这个镜像来创建多个Container,Image在aufs中是只读的

中间层就是通过Image创建出来的Container,Container在aufs中是可读可写的,通过一个只读的Image创建出一个Container,可以对这个Container进行修改(如上图中添加了一个emacs),然后在打包成一个不可读的Image,而这个Image又可以创建出基于它的Container

通过上面的描述不难得出一个结论:Docker中的Image是层层关联的,每个Image都有一个Parent Image(只有一个除外,那就是Base Image,即最基本的镜像,其他的Image都是在Base Image基础上得到的),使用一个Image时,Docker会找到其Parent Image直到Base Image

Docker在启动Container的时候, aufs会将下层的文件系统设置成read-only,然后将Container的read-write挂载到下层的文件系统之上,构成一个完整的文件系统

在Container中所做的修改不会影响到其所属的Image(因为它是只读的,通过COW技术将要修改的文件复制到read-write层并改写),如果没有保存这个Container(将其打包成一个新的Image),那么当这个Container生命周期结束之后,所做的修改都会消失

这种机制的好处就是,每个阶段的Image都可以进行大量的重用,在创建Container的时候只需要加入不同的部分即可,而不用每次都将全部所需加载一遍

Docker Hub:

类似于Github的服务,用来分发Images,里面有大量的Image提供Docker用户下载,基于这些Image,可以快速的搭建出我们自己所需要的Image
同时我们也可以将自做的Image push到Docker Hub中提供别人下载

Docker安装:

由于是基于Kernel内核的,所以Docker只能跑在Linux上,而且是必须是64位的
在windows和mac系统上的Docker的宿主机并不是windows或者mac,而是借助一个linux虚拟机作为其宿主机

在这里使用VM创建的一个Ubuntu来作为宿主机,在Ubuntu中安装很简单
步骤如下:

sudo apt-get updatesudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raringsudo rebootsudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9sudo sh -c "echo deb https://get.docker.io/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"sudo apt-get updatesudo apt-get install lxc-docker

期间可能因为网络的原因会卡很久,完成之后输入

docker

如果可以识别命令就是安装成功了

另外,执行docker命令需要root权限,所以除了使用root用户之外,每条命令都要加上sudo
或者也可以通过将当前的用户加入docker用户组(Docker提供的)就可以随时执行docker命令

sudo gpasswd -a ${USER} dockersudo service docker restart#如果没有效果执行下列命令
newgrp - docker
#切换当前会话到新 group 因为 groups 命令获取到的是缓存的组信息,刚添加的组信息未能生效,所以 docker images 执行时同样有错。

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

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

相关文章

杭电4639

居然在最后的输出形式那里卡了很久,忘记除10007,忘记输出Case 希望下次不要犯这种错误 #include "iostream" #include "string.h" using namespace std; int f[10100][100],maxb0; char list[110][10100]; int max(int a,int b){ret…

【RK3399Pro学习笔记】十、ROS服务端Server的编程实现

目录如何实现一个服务器C编写程序配置CMakeLists.txt编译并运行python创建并编写脚本运行平台:华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本:Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615 记录自【古月居】古月ROS入门21讲 | 一学就会的ROS机器人入…

通过WordPress内置函数批量添加文章

http://www.php.cn/blog/detail/2482.html 最近业务需要在网站上批量添加大量的文章。一篇一篇地手动添加绝对会搞死我,所以,我就开始寻找批量添加的方法。其实,文章的相关内容都已经在本地的数据库里了。我最先想到的方法是通过sql语句直接…

关于Unity3D中函数说明

Camera.SetReplacementShader(Shader shader , String replacementTag); 说明: 根据replacementTag设置以后的相机渲染用哪个shader Camera.RenderWithShader(Shader shader , String replacementTag); 说明: 根据replacementTag设置立即使用shader渲染&#xff0…

团队作业-第二周-测试计划

第1章引言 1.1目的 本测试计划文档作为指导此测试项目循序渐进的基础,帮助我们安排合适的资源和进度,避免可能的风险。本文档有助于实现以下目标: 1) 确定现有项目的信息和应测试的软件结构。 2) 列出推荐的测试需求 3) 推荐可采用的测试策略…

【RK3399Pro学习笔记】十一、ROS服务数据的定义与使用

目录自定义服务数据定义srv文件在package.xml中添加功能包依赖在CMakeLists.txt添加编译选项编译生成语言相关文件使用C编写程序person_server.cppperson_client.cpp配置CMakeLists.txt编译并运行python编写程序person_server.pyperson_client.py运行平台:华硕 Thin…

iBATIS存储过程

使用iBATIS配置来调用存储过程。为了理解这一章,首先需要了解我们是如何在MySQL中创建一个存储过程。 在继续对本章学习之前,可以通过MySQL存储过程。 我们已经在MySQL下有EMPLOYEE表: 123456CREATE TABLE EMPLOYEE (id INT NOT NULL auto_i…

WordPress 如何通过ID获取文章标题、内容等信息

原文链接:http://www.isyeo.com/wordpress/wordpress-getpost.html# 在非single.php页面中我们有时候想要调用当前文章的标题、内容等信息,而Wordpress在生成文章页的时候在各个页面中唯一不变的只有当前的文章ID,那么如何这个ID获取到当前文…

Windows server 2012 之路由功能

今天给大家介绍的是Windows服务器的软路由功能,那么什么事软路由呢?软路由:就是将Windows 系统配置成一个路由器下面我们通过一个示例来给大家介绍软路由先说一下实验环境,三台服务器,server02(ip地址为192…

【51单片机快速入门指南】8:看门狗定时器(WDT)

目录硬知识测试程序main.c现象普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 摘自《STC89C52系列单片机器件手册》 适用型号: STC89C51,STC89C52,STC89C53,STC89C14,STC89LE51,STC89LE52,STC89LE53,STC89LE14,STC89C54,…

java 的 == 和equals()区别

先看一个列子: public class Equivalence {public static void main(String[] args) {Integer n1 new Integer(47);Integer n2 new Integer(47);System.out.println(n1 n2);System.out.println(n1 ! n2);} } 通常我们都以为结果是 第一个true第二个false&#xf…

wordpress 文章页面 (single.php)

<?php $id get_the_ID();// 文章当前的 id $title get_post($id)->post_title; $my_data get_the_time(Y-m-d);$my_content get_post($id)->post_content;?>

[转]带花树,Edmonds's matching algorithm,一般图最大匹配

看了两篇博客&#xff0c;觉得写得不错&#xff0c;便收藏之。。 首先是第一篇&#xff0c;转自某Final牛 带花树……其实这个算法很容易理解&#xff0c;但是实现起来非常奇葩&#xff08;至少对我而言&#xff09;。 除了wiki和amber的程序我找到的资料看着都不大靠谱 比如昨…

linux下cat命令详解

简略版&#xff1a; cat主要有三大功能&#xff1a;1.一次显示整个文件。$ cat filename2.从键盘创建一个文件。$ cat > filename 只能创建新文件,不能编辑已有文件.3.将几个文件合并为一个文件&#xff1a; $cat file1 file2 > file参数&#xff1a;-n 或 --number 由 …

firstVue

这是生成的第一个VUE的列子&#xff0c;目录如上所示。config目录里主要表示配置目录&#xff0c;包括端口号等&#xff0c;其中配置文件中dev.env.js&#xff0c;出现了webpack-merge模块&#xff0c;可以把分开配置的config合并&#xff0c;分开生产环境和调试环境 node_modu…

【51单片机快速入门指南】9:省电模式(低功耗)

目录硬知识实验正常工作掉电模式空闲模式普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 摘自《STC89C52系列单片机器件手册》 仅支持掉电模式&#xff0c;不支持空闲模式 STC89C52系列单片机可以运行2种省…

怎样为wordpress主题的文章列表添加无插件分页?

测试时间 2019.04.05 测试版本: wordpress 5.1.1 中文版 测试步骤&#xff1a;共 4 1. 在主题的 functions.php 中&#xff0c;添加分页函数&#xff0c;代码如下 /** * 数字分页函数 * 因为wordpress默认仅仅提供简单分页 * 所以要实现数字分页&#xff0c;需要自定义函数…

datatable DataRow

foreach (DataRow dr in dt.Rows) { ss ss dr["活动名称"].ToString() ","; }转载于:https://www.cnblogs.com/yuluhuang/p/3272237.html

HAproxy部署配置

HAproxy部署配置 拓扑图 说明&#xff1a; haproxy服务器IP&#xff1a;172.16.253.200/16 &#xff08;外网&#xff09;、192.168.29.140/24&#xff08;内网&#xff09; 博客服务器组IP&#xff1a;192.168.29.130/24、192.168.29.131/24 网站服务器组IP&#xff1a;192.16…

Javascript验证上传图片大小[前台处理]

2019独角兽企业重金招聘Python工程师标准>>> 需求分析&#xff1a; 在做上传图片的时候&#xff0c;如果不限制上传图片大小&#xff0c;后果非常的严重。那么我们怎样才可以解决一个棘手的问题呢&#xff1f;有两种方式&#xff1a; 1)后台处理&#xff1a; 也就是…