Docker 基础认识

文章目录

  • 概念铺垫(1)
  • 概念铺垫(2)
  • 概念铺垫 (3)
  • 概念铺垫(4)
  • Docker 定义
  • Docker 特点
  • Docker 架构

概念铺垫(1)

虚拟化相关概念

物理机:实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理机提供给虚拟机以硬件环境,有时也称为“寄主”或“宿主”。

虚拟化:是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

容器化容器化是一种虚拟化技术,又称操作系统层虚拟化(Operating system level virtualization),这种技术将操作系统内核虚拟化,可以允许用户空间软件实例(instances)被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运行。这个软件实例,也被称为是一个容器(containers)。对每个实例的拥有者与用户来说,他们使用的服务器程序,看起来就像是自己专用的。容器技术是虚拟化的一种。docker 是现今容器技术的事实标准。

(对【他们使用的服务器程序,看起来就像是自己专用的】这句话的理解: 每个实例运行的进程只看到自己所占的硬件资源,其他的硬件资源不可见,也不可用,每个实例都被相互隔离了。

概念铺垫(2)

虚拟化常见分类
在这里插入图片描述

①虚拟机:
存在于硬件层和操作系统层间的虚拟化技术。虚拟机通过“伪造”一个硬件抽象接口,将一个操作系统以及操作系统层以上的层嫁接到硬件上,实现和真实物理机几乎一样的功能。比如,在一台 Windows 系统的电脑上使用 Android 虚拟机,就能够用这台电脑打开 Android 系统上的应用。
②容器,存在于操作系统层和函数库层之间的虚拟化技术。容器通过“伪造”操作系统的接口,将函数库层以上的功能置于操作系统上。Docker就是通过容器实现的虚拟化。 Docker是一个基于Linux 操作系统的Namespace 和Cgroup 功能实现的隔离容器,可以模拟操作系统的功能。虚拟机是把整个操作系统封装隔离,容器则是把一个个应用单独封装隔离。所以容器体积比虚拟机小。容器共享一个内核(操作系统),(内核)它安装在硬件上。
③类JVM: 存在于函数库层和应用程序之间的虚拟化技术 。

概念铺垫 (3)

容器化的优势

(部分看不懂,直接跳过,使用以后就明白了)
① 资源利用率高 : 对硬件资源更充分的利用。(简单理解为:A进程和B进程都不会使服务器硬件资源满载,但A和B进程无法在同一种操作系统上运行,容器化解决了这样一个问题,使A和B能在同一服务器上运行,这样就不用开两台服务器分别给A和B,提高了资源利用率)
② 使环境标准化 : 一次构建,随处执行。实现执行环境的标准化发布,部署和运维。开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。
③资源弹性伸缩: 根据业务情况,动态调整计算、存储、网络等硬件及软件资源。(例如高峰期启动更多的服务器)
④差异环境提供: 同时提供多套差异化的执行环境,限制环境使用资源。比如一个服务依赖 Ubuntu 操作系统,另一个服务依赖CentOS 操作系统,但是没有预算购买两个物理机,这个时候容器化就能很好的提供多种不同的环境。
在这里插入图片描述
⑤实现沙箱安全:为避免不安全或不稳定软件对系统安全性、稳定性造成影响,可使用虚拟化技术构建虚拟执行环境。例如,在容器里面执行 rm -rf /* 不会把整个服务器搞死,也不影响其他人部署的程序使用。
⑥比虚拟机轻量:传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。docker 不需要虚拟内核,所以启动可以更快,相当于 windows 的开机时间省去了。
⑦维护和扩展容易:使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。比如 docker hub 提供了很多镜像,各个系统的一个命令就可以拿到了,研发也可以自己定制镜像分享给各个产品

概念铺垫(4)

容器虚拟化实现

①namespace:namespace 是Linux 内核用来隔离内核资源的方式。通过namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个namespace 中。

namespace使用:Linux 提供了多个API 用来操作namespace,它们是clone()、setns() 和unshare() 函数,为了确定隔离的到底是哪项namespace,在使用这些API 时,通常需要指定一些调用参数:CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS 和CLONE_NEWCGROUP。如果要同时隔离多个namespace,可以使用| (按位或)组合这些参数。

(仅作了解,总而言之这些接口可以帮助隔离网络、进程ID等操作系统资源)

/*
clone() 函数是用于创建新进程的系统调用之一,
它允许你指定要复制的命名空间类型。
例如,如果你想要创建一个新的网络命名空间,你可以这样使用 clone():*/
clone(CLONE_NEWNET | CLONE_NEWPID | CLONE_NEWUTS, NULL);
/*
setns() 函数允许一个进程加入到一个已存在的命名空间中
fd 是一个指向已存在命名空间的文件描述符。
通过调用 setns(),你可以将当前进程加入到该命名空间中,
从而让其与该命名空间中的其他进程进行通信和协作*/
setns(fd, CLONE_NEWNET);
/*
unshare() 函数允许一个进程脱离当前的命名空间,
创建一个新的独立命名空间。
*/
unshare(CLONE_NEWNET | CLONE_NEWPID);

②cgroups:cgroups(Control Groups) 是linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。

cgroups的作用具体包括
1.Resource limitation: 限制资源使用,内存使用上限/cpu的使用限制
2.Prioritization: 优先级控制,例:CPU利用/磁盘IO吞吐
3.Accounting: 一些审计或一些统计
4.Control: 挂起进程/恢复执行进程

cgroups的使用(仅作了解,知道cgroups可以用于限制、分配和监控系统资源(如 CPU、内存、磁盘 I/O 等)的使用即可):

# 创建 cgroup
sudo mkdir /sys/fs/cgroup/cpu/mygrou
# 创建 cgroup  cgroup v2
sudo mkdir /sys/fs/cgroup/unified/mygroup
# 要将一个进程分配到特定的 cgroup 中,12345为PID
echo 12345 > /sys/fs/cgroup/cpu/mygroup/cgroup.procs
# 限制 cgroup 中的进程使用的 CPU 时间,这里50000代表50ms
echo 50000 > /sys/fs/cgroup/cpu/mygroup/cpu.cfs_quota_us
# 通过查看 cgroup 文件系统中的各种文件,实时监控 cgroup 中进程的资源使用情况
cat /sys/fs/cgroup/memory/mygroup/memory.usage_in_bytes

③LXC,或者 Linux 容器,是一种操作系统级虚拟化技术,允许多个独立的 Linux 系统容器(container)在单个 Linux 主机上共享相同的内核。这种技术提供了比传统的虚拟机更轻量级的虚拟化解决方案,能够更高效地利用硬件资源。 LXC 使用 cgroups 控制组和 namespaces 命名空间来实现容器之间的隔离,使得每个容器都能够拥有自己的文件系统、网络、进程等资源。

Docker 定义

①Docker本质其实是LXC之类的增强版,它本身不是容器,而是容器的易用工具。容器是linux内核中的技术,Docker只是把这种技术在使用上简易普及了。Docker在早期的版本其核心就是LXC的二次封装发行版。Docker作为容器技术的一个实现,或者说让容器技术普及开来的最成功的实现。

② Docker 是一个开源的平台,用于开发、交付和运行应用程序。它利用容器化技术,将应用程序及其依赖项打包到一个称为容器的独立单元中。这使得应用程序能够在任何环境中快速部署和运行,无需担心环境差异或依赖问题。 Docker 提供了一种轻量级、可移植和自包含的解决方案,使开发人员能够更加高效地构建、交付和管理应用程序。

Docker 特点

Docker的特点和容器化的特点基本一致,大致如下:

docker有比虚拟机更少的抽象层。docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的是实际物理机的硬件资源。因此在cpu、内存利用率上docker将会在效率上有明显的优势。docker利用的是宿主机的内核,而不需要Guest OS,节省了Guest OS占用的资源。

docker不需要Guest OS,创建一个容器时,不需要和虚拟机一样重新加载一个操作系统内核。从而避免引寻、加载操作系统内核返回时耗时耗资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返回新建过程是分钟级别的。而新建一个docker容器只需要几秒钟。

在这里插入图片描述

Docker 架构

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器。Docker 容器通过 Docker 镜像来创建。了解Docker 架构是使用Docker的前提。

例如国内企业的架构:
在这里插入图片描述
Docker 仓库(Registry)
Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub 供了庞大的镜像集合供使用。

Docker daemon
Docker daemon 是服务器组件,是 Docker 最核心的后台进程,我们也把它称为守护进程。

Docker 客户端(Client)
Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。

Docker 主机(Host)
一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

Docker 镜像(Images)
Docker 镜像是用于创建 Docker 容器的模板。

Docker 容器(Container)
容器是独立运行的一个或一组应用。

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

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

相关文章

WordPress 、Typecho 站点的 MySQL/MariaDB 数据库优化

今天明月给大家分享一下 WordPress 、Typecho 站点的 MySQL/MariaDB 数据库优化,无论你的站点采用是 WordPress 还是 Typecho,都要用到 MySQL/MariaDB 数据库,我们以 MySQL 为主(MariaDB 其实跟 MySQL 基本没啥大的区别&#xff0…

JUC下的Java java.util.concurrent.Locks详解

java.util.concurrent.locks 包介绍 java.util.concurrent.locks 包是Java并发编程中非常重要的一个部分,它提供了比内置synchronized关键字更为灵活的锁机制,用于多线程环境下的同步控制。这个包中最核心的是Lock接口,以及一系列实现类&…

如何通过香港站群服务器高效实现网站内容的快速更新?

如何通过香港站群服务器高效实现网站内容的快速更新? 在当今激烈的数字市场竞争中,网站内容的快速更新对于吸引用户和保持竞争优势至关重要。而利用香港站群服务器实现这一目标,则具备诸多优势。下面将详细探讨如何通过香港站群服务器高效实现网站内容…

thinkphp6使用layui分页组件做分页效果

博主用的是layui2.9.8的版本,但这个版本的分页组件是动态效果的,但我需要的是静态分页,所以我自己封装了一个生成layui的分页代码生成代码。代码如下: 1、先创建文件,路径是extent/layui/LayuiPage.php,加…

基于MetaGPT的LLM Agent学习实战(一)

前言 我最近一直在做基于AI Agent 的个人项目, 因为工作加班较多,设计思考时间不足,这里借着Datawhale的开源学习课程《MetaGPT智能体理论与实战》课程,来完善自己的思路,抛砖引玉,和各位开发者一起学习&am…

Run ‘conda init‘ before ‘conda activate‘

使用conda activate 虚拟环境名称的时候提示:Run conda init before conda activate 解决办法: 首先需要确保是管理员身份运行这个cmd窗口。 然后,现在执行一下:conda init 命令,最后再执行:conda activate…

纯血鸿蒙APP实战开发——首页下拉进入二楼效果案例

介绍 本示例主要介绍了利用position和onTouch来实现首页下拉进入二楼、二楼上划进入首页的效果场景,利用translate和opacity实现动效的移动和缩放,并将界面沉浸式(全屏)显示。 效果图预览 使用说明 向下滑动首页页面超过触发距…

冯喜运:5.13黄金原油震荡整理是涨还是跌?今日走势分析

【黄金消息面分析】;自5月初以来,黄金和白银一直在享受需求的回归,买家在过去几天加大了力度,一度推动金价重返2370美元上方,白银重返28.5美元上方。不过,经过几天的盘整后,黄金白银价格双双下跌。然而&…

Redis-详解(基础)

文章目录 什么是Redis?用Redis的特点?用Redis可以实现哪些功能?Redis的常用数据类型有哪些?Redis的常用框架有哪些?本篇小结 更多相关内容可查看 什么是Redis? Redis(Remote DictionaryServer)是一个开源…

下载文件名称乱码或变成了随机码

如图 后端是有正常返回附件名称的,浏览器开发工具中也正常显示了这个数据,但是下载下来的文件名称确实一堆随机码. 其实这个问题的原因是因为跨域 查看console: Refused to get unsafe header "content-disposition" 现象,后端传递到前端的fileName不能被识别,下载…

大模型与AIGC应用相关问题 模型大型

最近经常被问,你看“万亿的模型都出来了,你们训练的千亿模型是不是落伍了?”我想说:“虽然都叫超大模型,但是类型是不一样的,虽说每一类模型训出来都不容易,不过澄清一下概念还是必要的”。 大…

编写Ansible角色实现分布式LNMP安装

前言 本文将介绍如何使用 Ansible 编写角色,在分布式环境下完成 LNMP(Linux、Nginx、MySQL、PHP)的自动化(编译)安装和配置,并验证 PHP 与 MySQL 数据联通性,实现博客和论坛页面的展示。 常规…

Qt---信号和槽

一、信号和槽机制 所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号…

二叉树的四种遍历代码实现

二叉树的遍历大致能分为以下几种 1.前序:根 左 右 2.中序:左 根 右 3.后序:左 右 根 4.层序:从根开始一层一层的向下 如上图访问顺序: 前序:1 2 3 N N N 4 5 N N 6 N N 中序:N 3 N 2 N 1 N 5 N 4 N …

docker-compose安装emqx集群(最新)(host模式)

机器: 10.60.0.20 10.60.0.21 10.60.0.22 一、三台机子都配置域名(/etc/hosts) 10.60.0.20 node1.emqx.io 10.60.0.22 node3.emqx.io 10.60.0.21 node2.emqx.io 二、docker-compose.yml(10.60.0.21) 其他两台机子自…

接搭建仿美团、代付系统源码搭建教程

最近很多粉丝催更、分享一下地球号:xiaobao0214520(WX) 现在大家都很流行搞网恋,我们搭建一个跟美团相似的系统 然后开发一个好友代付,我们在点单的时候转发链接让网恋对象付钱 若只是单点外卖的话,能榨出的油水还是太少。 所以…

Golang — map的使用心得和底层原理

map作为一种基础的数据结构,在算法和项目中有着非常广泛的应用,以下是自己总结的map使用心得、实现原理、扩容机制和增删改查过程。 1.使用心得: 1.1 当map为nil和map为空时,增删改查操作时会出现的不同情况 我们可以发现&#…

【全开源】废品回收微信小程序基于FastAdmin+ThinkPHP+UniApp

介绍 一款基于FastAdminThinkPHPUniApp开发的废品回收系统,适用废品回收站、再生资源回收公司上门回收使用的小程序 功能特性 1、会员注册 支持小程序授权注册和手机号注册 2、回收品类 可设置回收品类,废纸、废金属、废玻璃、旧衣服等 3、今日指导价…

面试高频知识点:Java互联网大厂高频面试题(持续收录)

文章目录 前言一、Java基础题1、Java语言的三大特性2、JDK 和 JRE 有什么区别3、Java基本数据类型及其封装类4、说明一下public static void main(String args[])这段声明里关键字的作用5、java的数据结构有哪些?6、抽象类和接口的区别?7、 与 equals 的区别8、Str…

WordPress插件Show IDs by Echo,后台显示文章、页面、分类、标签、媒体库、评论、用户的ID

WordPress的这款Show IDs by Echo插件,可以让我们设置是增加一列ID还是直接在“编辑 |快速编辑 |查看”操作后面增加ID,而且支持展示以下内容的ID: 文章页面类别标签评论自定义帖子类型自定义分类法用户媒体 Show IDs by Echo插件的安装及启…