Docker 使用原理流程

# docker 是如何来的?
a. linux 内核本身支持容器技术,LXC (市面上有很多基于 LXC 开发的容器管理软件,如创建容器,查看容器,管理容器, docker 作为管理容器的一款代表工具软件)
b. 容器的作用,
1. 创建独立的 namespace,一个隔离的环境。
2.以及对资源进行限制,
3.以及容器是直接使用宿主机的硬件配置 (没有像虚拟化这种资源损耗)

# docker 和容器的关系
1.docker 就是一个对容器增删改查的一个工具
2.docker 就是基于 golang 语音开发的一款软件
3.学习使用 docker 时要安装 golang 环境


# linux 宿主机  centos
宿主机本身有没有自己的 namespace?

进程
网络
文件系统

举例:nginx     ---pid  14578
               ---port 80
               network 10.0.0.22
               
进程pid->去读取文件系统
/opt/nginx/sbin/cgifx.17
基于文件跑出来的进程
宿主机有这些的 namespace 资源是有数量,路径限制的
因此才会有容器,虚拟机等可以实现隔离环境的作用 说白了就是创建独立的三个 namespace

docker run centos 调用 linux 内核 LXC 容器技术  实现了创建 centos 容器
docker run nginx -> 调用 linux 内核 LXC 容器技术  -> 实现创建容器


资源隔离   作用1
容器 宿主机 网桥 docker0 默认的网段  172.16.17.0/16
所有容器都用 /opt/nginx-1.17/sbin/nginx 这个文件路径,他们的文件路径是不会冲突的

容器1
进程
网络        172.16.17.2
文件系统    /opt/nginx-1.17/sbin/nginx

容器2
进程
网络        172.16.17.3
文件系统    /opt/nginx-1.17/sbin/nginx

容器3
进程
网络        172.16.17.4
文件系统    /opt/nginx-1.17/sbin/nginx

容器4
进程
网络        172.16.17.5
文件系统    /opt/nginx-1.17/sbin/nginx

#
1.linux 本身支持 LXC 技术 对 linux 内核资源隔离 (提供了两个技术:namespace 和 cgroup 技术)
2.docker 基于 golang 开发出来了,docker 的作用就是调用 LXC 技术去管理这些容器 如增删改查
3. 运维,开发基于这些容器去部署这些应用

docker 和 LXC linux容器技术的本质关系,以及我们是如何用的 docker ,以及 docker 资源隔离本质

docker 是管理 LXC linux 容器技术的工具,docker 是用 golang 语言写的
学习 docker 就需要安装 golang 环境
用 docker 命令去实现 容器的增删改查

# docker 工具
容器技术是 linux 系统支持的 名字叫 LXC 容器技术的作用是在操作系统的角度实现资源的隔离与限制,
说白了就是用 LXC 技术去创建独立的 namespace 命名空间,去区分开进程,网络,文件系统这样的一个环境
我们要基于 LXC 技术去创建容器,是很费劲的,有很多其他的容器技术也是去管理 LXC 容器技术 发现他们不好,后来
Docker 公司位于旧金山,原名 dotCloud, 底层利用了 linux 容器技术 (LXC) (在操作系统中实现资源隔离与限制)。为了方便创建和管理这些容器,dotCloud 开发了一些内部工具,之后被命名为"docker".    
Docker 就是这样诞生的

Docker 对容器的管理,命令非常简单,主要围绕 增删改查 四个角度 的命令去使用
增    创建一个容器
删    干掉删除容器记录(删除了某一个名称空间)
改    修改容器内的应用信息以及修改容器的网络模式等,以及修改容器的名字
查    查询当前有多少容器进程

# 创建虚机需要你的 cpu 支持这个  Hypervisor 工具
Hypervisor , 一种运行基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件,常见的 vmware的 workstation,ESXi,微软的 Hyper-v或者思杰的 XenServer.

#  linux 内核 支持 LXC 容器技术
Container Runtime ,通过 linux 内核虚拟化能力管理多个容器。多个容器共享一套操作系统内核。因此摘掉了内核占用的空间及运行所需要的耗时,使得容器极其轻量与快速。
centos 宿主机 (发行版 + linux 内核(支持 LXC 技术)) 即通过 LXC 技术去增删改查容器

#
LXC > Libcontainer (创建一个隔离的,独立的 namespace,也就是容器实例)

docker 的强大在于通过操作系统层面的虚拟化实现进程隔离,因此 docker 容器进程运行后,不需要像虚拟机一样的一个完整的操作系统。。。

红帽官网的虚拟化文章
https://www.redhat.com/zh/topics/virtualization
https://www.redhat.com/zh/containers/whats-a-linux-container

维基百科,什么是操作系统虚拟化
https://zh.wikipedia.org/zh-cn/topics/

# 容器技术

-  Docker 最初是 DotCloud 公司在法国期间发起的一个公司内部项目,后来以 Apache 2.0 授权协议开源,代码在 github 上维护

-  Docker 是基于 Google 公司推出的 Golang 语言开发而来的,基于 Linux 内核的 Cgroups,NameSpace,以及 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。

-  由于隔离的进程独立于宿主机和其他隔离的进程,也被称之为容器。

-  最初的 Docker 是基于 LXC ( Linux Containers  是一种 linux 端 操作系统 级的虚拟化技术,可以实现轻量级容器,每个容器看起来像一个独立的操作系统,他们共享同一个物理服务器,但是互相隔离。LXC容器比传统虚拟机更加轻便,高效,且启动速度快) 的,后来去除 LXC 转而使用自行开发的 Libcontainer。

-  Docker 被定义为开源的容器引擎,可以方便的对容器进行管理,例如对镜像打包封装,引入 Docker Registry 对镜像统一管理。

-  利用 Docker 可以实现开发,测试,生产环境的部署一致性,极大的减少运维成本。

举例分析
宿主机环境
网络
进程
文件系统等信息
基于 centos7 下载安装 docker 工具    yum install docker


docker run nginx 命令
# 容器1
基础镜像,发行版提供 当执行 docker run nginx 这条命令后,会自动下载 debian 系统(默认下载这个系统)
nginx 程序   然后nginx有自己独立的文件系统
独立名称空间
文件系统    /usr/bin/nginx
端口        80
进程        12334


docker 做了什么事情
1.下载镜像
2.运行程序
3.创建整个容器去跑一个 nginx


容器本质上还是跑在 centos7 上的,因此 容器是 centos7 宿主机上的一个进程而与
在宿主机上可以用 ps ef | grep nginx 看到Nginx这个容器 id 记录
容器的本质:就是跑在宿主机上的一个进程而与。
容器就是对 xxx 程序的封装,提供了一个独立运行的环境 是隔离的环境
比如跑一个 nginx 容器 其实就是对 nginx 程序的封装

最初是 linux 基于 LXC 去管理容器 后来 docker 这家公司基于 golang 语言对底层容器技术 LXC 创建技术进行二次开发,
基于 golang 写了一个底层容器驱动,叫 libcontainer  能够在宿主机上看到 containeed 进程


# docker 为什么能够实现多环境的一致性以及快速发布

1.没有容器的部署环境(centos + ubuntu)
- 开发一般不懂 centos(ubuntu)环境  2年以内开发的基本不懂 linux 环境
- windows + java 写源代码   源代码   是基于 windows 环境运行的
- 功能开发 调用的一些驱动都是 windows 环境的
- 你这套源码,他运行后,要下载很多依赖,都是windods

2.测试环境   用 centos 或者 ubuntu
- 源码写完了上传到 gitlab github 测试仓库下载到测试环境
- 基于 源代码 运行环境,去安装一些依赖
- 安装数据库等
-保证跑起来之后,调试功能是否有BUG

发现代码有错,
求运维    jdk 用什么命令
求开发指导环境参数如何,功能是干嘛的

3.生产环境  运维 可以手工部署应用 jenkins
- 源码写完了上传到 gitlab github 线上仓库下载到生产环境
- 单机,
- 单点
- 数据库 测试数据库的假数据


# 如今的企业级虚拟机环境  阿里云 还是私有云,说白了都是虚拟机
环境: 物理机 -> 虚拟化 -> 私有云(阿里云,ESC,机器)->yum install docker->docker run nginx 或者 docker run jenkins 从而实现    nginx容器  jenkins容器

基于虚拟机,源码,jenkins , 多环境发布    问题: 慢 , 容易出错
传统的发布模式只提供源码    所有环境都是临时 安装 的
环境的部署是一个大问题
测试环境 与生产环境又不一样


# 如何实现环境一致性
开发提供好一个部署物料 不仅有源码,运行环境直接发给测试,直接发给运维。(运行环境+源码)

# 没有容器的发布时代,(基于虚拟机的模板发布)
基于vmware 模板机实现,有一个机器是专门跑 tomcat 这套台机器提供了稳定的模板基础,基于这台机器,克隆出你需要的运行的测试环境,生产环境  这样尽量减少环境不一致的问题
虚拟机模板克隆技术是很重量级的 都是 linux 内核一套 + 发行版一套,你安装的镜像4-10GB左右 安装完成之后最少20GB

# 有容器的发布时代    Docker 镜像 只有软件运行的依赖环境,只有发行版,你的代码是基于 centos,ubuntu,macos  发行版+xxx依赖 所以体积很小

 

# 基于容器实现的环境一致性发布
# 容器化部署架构

LXC开源仓库 GitHub - lxc/lxc: LXC - Linux Containers

LXC容器:概念介绍及简单上手操作指导
1、介绍LXC(Linux Containers)是一种Linux端操作系统级的虚拟化技术,可以实现轻量级容器,每个容器看起来像一个独立的操作系统,它们共享同一台物理服务器,但是互相隔离。LXC容器比传统虚拟机更加轻便、高效,且启动速度快。LXC中创建的为非特权容器,相较于特权容器,其有更高的安全性,更小的攻击面,同时便于管理和升级。下面介绍一下LXC的架构和基本上手操作指导。开源仓库:https://github.com/lxc/lxc官网:https://linuxcontainers.org/lxc/
2、LXC架构宿主机(Host OS):运行LXC命令和LXC用户空间的操作系统。LXC用户空间(Userspace):包括LXC库、配置文件和容器元数据等组件。LXC模板(Templates):用于创建容器的基础镜像。LXC命令(Commands):用于管理和操作LXC容器的命令工具。LXC库(Library):提供容器相关的API和函数库。LXC配置(Configs):用于配置和定制容器的参数和选项。LXC网络脚本(Net Scripts):用于管理容器的网络连接和配置。LXC工具(Tools):提供各种辅助工具和脚本,用于管理和维护LXC容器。LXC 容器(LXC Container):相互独立运行的轻量容器。LXC的核心功能是利用Linux内核提供的Namespace和Cgroups等机制来实现容器的隔离和虚拟化,从而使得容器可以独立运行和管理。同时,LXC还支持各种网络选项和安全特性,可以根据不同的应用场景进行定制和配置。
3、检查Linux Kernel容器的要求如下内核版本要求:Linux kernel >= 3.12依赖包要求:# to allow for capability drops
libcap
# to set a different apparmor profile for the container
libapparmor
# to set a different selinux context for the container
libselinux
# to set a seccomp policy for the container
libseccomp
# for various checksumming
libgnutls
# for the LUA binding
liblua
# for the python3 binding
python3-dev

 

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

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

相关文章

利用python批量将.shp文件转换坐标生成.geojson文件,再将.geojson转换成.csv文件,最后将csv文件插入数据库表

第一步:.shp批量转.geojson # author: JMY # 创建时间: 2024/2/26 17:12 # 批量将.shp文件生成geojson文件并转换坐标为3857import os import geopandas as gpd# 定义输入和输出文件夹路径 input_folder shp文件 output_folder geojson文件# 定义输入和输出坐标系…

【王道操作系统】ch1计算机系统概述-04操作系统结构

文章目录 【王道操作系统】ch1计算机系统概述-04操作系统结构操作系统的内核操作系统的体系结构考纲新增内容(红色为全新内容,黄色为原有内容):01 分层结构02 模块化03 宏内核(大内核)和微内核04 外核 【王…

redis03 八种数据类型

思维草图 String类型 字符串类型,是redis中最简单的存储类型,可以包含任何数据,例如jpg图片或者序列化的对象等,底层都是以字节数组形式存储,最大能存储512MB的数据。 常用命令 KEY命名规范 加前缀,分…

802.11局域网的 MAC 帧

目录 802.11 局域网的 MAC 帧 802.11 数据帧的三大部分 1.关于 802.11 数据帧的地址 最常用的两种情况 2.序号控制字段、持续期字段和帧控制字段 802.11 局域网的 MAC 帧 802.11 帧共有三种类型:控制帧、数据帧和管理帧。 802.11 数据帧的三大部分 MAC 首部&…

总结springboot启动jar,指定配置文件

第一:覆盖 -- 覆盖系统中的文件中的application-dev.yml文件,两种指定方法都可以 springboot默认优先读取application.properties>application.yml>指定文件(application-dev.yml) 公共配置可以在application.yml,其他配置在applicatio…

基于 STM32U5 片内温度传感器正确测算温度

目录预览 1、引言 2、问题 3、小结 01 引言 STM32 在内部都集成了一个温度传感器,STM32U5 也不例外。这个位于晶圆上的温度传感器虽然不太适合用来测量外部环境的温度,但是用于监控晶圆上的温度还是挺好的,以防止芯片过温运行。 02 问题…

C# - 类与类之间的继承关系判断

Type.IsSubclassof(Type type) 作用:用来确定 一个类是否派生自另一个类/ValueType/Enum/委托 不能用于确定:接口是派生自另一个接口,还是类实现接口 class A{} class B : A{}A a; B b;var boo b.GetType().IsSubclassOf(typeof(A)) // t…

sqllabs第五关floor报错注入

实验环境sqllabs第五关 floor()报错注入的原因是group by在向临时表插入数据时,由于rand()多次计算导致插入临时表时主键重复,从而报错,又因为报错前concat()中的SQL语句或函数被执行,所以该语句报错且被抛出的主键是SQL语句或函…

go语言中的协程和Java中线程以及进程的区别

理解 Go 语言中的协程(Goroutine)、Java 中的线程和进程之间的区别可以从以下几个方面来看: 轻量性: Goroutine(协程): 协程是非常轻量级的执行单位,创建和销毁的成本很低。在 Go 中…

深入理解Lambda表达式:基础概念与实战演练【第114篇—python:Lambda表达式】

深入理解Lambda表达式:基础概念与实战演练 在现代编程语言中,Lambda表达式作为一种轻量级的匿名函数形式,越来越受到程序员的青睐。特别是在函数式编程兴起的今天,Lambda表达式在简化代码、提高可读性方面发挥着重要作用。本文将…

C++笔记(六)--- 静态成员变量/函数(static)

目录 C语言中静态变量 C静态成员变量 C静态成员函数 C语言中静态变量 1.函数内部用static修饰的变量,只能在此函数使用,但所修饰的变量不随函数释放而释放,下次调用时的值仍为上次结束时的值2.static修饰的全局变量只能在其定义的文件使用…

华为OD技术面试案例6-2024年

个人情况:西电本,二战某985基本寄了。知识储备方面:无任何408基础,学校开过数据结构课程60分过,python纯靠自学,无任何刷题经验,无项目经验,简历东拼西凑。 大概是12月底和OD联系&a…

数据可视化原理-腾讯-热力图

在做数据分析类的产品功能设计时,经常用到可视化方式,挖掘数据价值,表达数据的内在规律与特征展示给客户。 可是作为一个产品经理,(1)如果不能够掌握各类可视化图形的含义,就不知道哪类数据该用…

CSP-201712-2-游戏

CSP-201712-2-游戏 解题思路 初始化变量:定义整数变量n和k,分别用来存储小朋友的总数和淘汰的特定数字。然后定义了num(用来记录当前报的数)和peopleIndex(用来记录当前报数的小朋友的索引)。 初始化小朋…

MATLAB环境下基于离散小波变换的体外血管图像处理

下面简要介绍小波变换的部分应用。 信号去噪。小波去噪是根据有效信号和噪声信号在小波变换后表现出的不同特性实现的,一般可用于去除语音、图像、视频等中的噪声信号。小波去噪方法根据对小波系数的非线性处理方式分为三类,分别是小波变换模极大值去噪…

电子电器架构新趋势 —— 最佳着力点:域控制器

电子电器架构新趋势 —— 最佳着力点:域控制器 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师…

备战蓝桥杯---状态压缩DP基础1之棋盘问题

它只是一种手段,一种直观而高效地表示复杂状态的手段。 我们先来看一道比较基础的: 直接DFS是肯定不行,我们发现对某一行,只要它前面放的位置都一样,那么后面的结果也一样。 因此我们考虑用DP,并且只有0/…

Vue3+Element-Plus中ELMessage样式丢失处理

Vu3Element-Plus项目中,element-plus使用按需引入有时会出现样式失效和在vscode中使用会报错[找不到名称“ElMessage”。ts(2304)]错误 ELMessage弹框样式丢失处理方法 使用按需引入就不能手动再引入 import { ElMessage } from "element-plus";ElMessage.success…

蓝桥杯-单片机组基础6——定时计数器与外部中断混合使用(附小蜜蜂课程代码)

蓝桥杯单片机组备赛指南请查看这篇文章:戳此跳转蓝桥杯备赛指南文章 本文章针对蓝桥杯-单片机组比赛开发板所写,代码可直接在比赛开发板上使用。 型号:国信天长4T开发板(绿板),芯片:IAP15F2K6…

常见的浏览器跨域解决方法

1. 前端方法&#xff1a;JSONP&#xff08;仅适用于GET请求&#xff09; JSONP&#xff08;JSON with Padding&#xff09;是一种利用<script>标签的src属性不受同源策略限制的特性来实现跨域数据请求的方法。JSONP通过在前端动态创建<script>标签&#xff0c;并将…