当前位置: 首页 > news >正文

容器和云原生(二):Docker容器化技术

 

目录

Docker容器的使用

Docker容器关键技术

Namespace 

Cgroups

UnionFS


Docker容器的使用

        首先直观地了解docker如何安装使用,并快速启动mysql服务的,启动时候绑定主机上的3306端口,查找mysql容器的ip,使用mysql -h containerIP 或者127.0.0.1就可以直接访问mysql服务,暂不考虑mysql的存储卷。

# 安装docker的rpm包
yum install -y docker
# 启动docker服务
systemctl start docker
# 查看image镜像列表,现在没有pull拉取任何镜像,列表为空
docker image list
# 修改镜像源地址为国内
vi /etc/docker/daemon.json
{"registry-mirrors" : ["https://docker.mirrors.ustc.edu.cn","http://hub-mirror.c.163.com"]
}
# 拉取mysql的固定版本镜像mysql:5.7.29
docker image pull mysql:5.7.29
# 查看镜像信息
docker inspect mysql:5.7.29
# 把mysql的镜像run跑起来,--name指定容器名,-p绑定端口映射关系,这里主机和容器的3306绑定,-e环境变量,-d是后台运行
docker run mysql:5.7.29 --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin@123 -d 
# 查看docker的容器进程
docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
39189fab8ca8        mysql:5.7.29        "docker-entrypoint..."   44 minutes ago      Up 5 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
# 查看 mysql的容器ip,知道它的ip是172.17.0.2
docker inspect 39189fab8ca8
# centos系统本地安装mysql客户端
yum install -y mysql
# 在centos中使用docker的ip或者直接主机ip+3306端口访问mysql服务,密码是上面的admin@123
mysql -h 172.17.0.2 -P 3306 -u root -p
mysql -h 127.0.0.1 -P 3306 -u root -p
# 允许mysql的远程访问
MySQL [(none)]> grant all privileges on *.* to 'root'@'%' identified by 'admin@123' with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)
MySQL [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

Docker容器关键技术

        Docker基于 Linux 内核的 Cgroup,Namespace,以及Union FS 等技术对进程进行封装隔离封装,属 于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器,与虚拟化技术相比它有更快的启动时间,更高效的资源利用率,一致的运行环境,更轻松的迁移能和更强的维护性。

 

Namespace 

        Docker 利用 Linux 内核的 namespace 技术来实现容器化。Namespace 是一种隔离机制,它将系统资源封装在一个独立的命名空间中,使得在不同的命名空间中的进程看起来像在独立的操作系统实例中运行,Linux 内核代码中进程的数据结构和Namespace 的数据结构:

namespace的类型有多种:

PID Namespace:每个容器都有自己独立的进程 ID (PID) 命名空间。这意味着容器内部的进程在容器外部是不可见的,进程 ID 在容器之间是隔离的。这使得容器内的进程可以拥有自己的进程树。

Network Namespace:每个容器都有自己独立的网络命名空间。这意味着每个容器拥有自己的网络栈,包括独立的网络接口、IP 地址、路由表和防火墙规则。这使得容器之间网络隔离,可以独立地运行和与外部网络通信。

Mount Namespace:每个容器都有自己独立的文件系统视图。这意味着每个容器可以拥有自己的文件系统挂载点和文件树。容器内部对文件系统的修改不会影响到宿主机或其他容器。

UTS Namespace:每个容器都有自己独立的主机名和域名。这意味着容器可以拥有自己的主机名,并且可以在网络中被识别为一个独立的实体。

IPC Namespace:每个容器都有自己独立的进程间通信 (IPC) 命名空间。这意味着容器之间的进程无法直接进行 IPC,它们被隔离在不同的命名空间中。

Cgroups

 Docker 使用 cgroups(Control Groups)技术来实现对容器资源的限制和管理。cgroups 是 Linux 内核中将一组进程组织在多个层次结构中,并为每个组提供资源隔离/优先级和控制的技术;

CPU 资源管理:Docker 使用 cgroups 将 CPU 资源划分为不同的组,并为每个组分配 CPU 时间片。这允许 Docker 控制容器可以使用的 CPU 资源的数量,并根据需要进行动态调整。

内存资源管理:通过 cgroups,Docker 可以为容器分配特定的内存限制。当容器超出分配的内存限制时,内核会触发 OOM(Out of Memory)机制来处理内存不足的情况。

网络带宽管理:Docker 使用 cgroups 的网络子系统来限制容器的网络带宽。这使得 Docker 可以控制容器可以使用的网络带宽,以防止某个容器占用过多的网络资源。

块设备 I/O 控制:通过 cgroups,Docker 可以对容器的块设备 I/O 进行限制和控制。这允许 Docker 控制容器对磁盘读写的速度,以避免某个容器对存储设备的过度使用。

UnionFS

Docker 使用 UnionFS(Union File System)技术来实现容器镜像的分层和联合挂载,它提供了灵活而高效的容器镜像管理和文件系统隔离功能,能构建、分发和运行容器镜像,同时节省存储空间,并提供了高度的可定制性和可扩展性。

分层镜像:Docker 使用分层镜像的概念来构建容器。每个镜像层都只包含对文件系统的增量修改,这样可以节省存储空间并提高镜像的构建效率。每个镜像层都可以看作是一个只读的文件系统,它们通过 UnionFS 技术联合挂载在一起,形成一个完整的容器镜像。

写时复制(Copy-on-write):当容器启动时,Docker 会为每个容器创建一个可写的容器层。这个可写层是基于镜像层的一个副本,当容器对文件系统进行修改时,UnionFS 使用写时复制技术将修改后的文件存储在可写层中,而不是原始镜像层中。这样可以避免对原始镜像层的修改,使得容器之间可以共享相同的镜像层。

联合挂载:通过 UnionFS 技术,Docker 将不同的镜像层联合挂载到容器的文件系统中,形成一个统一的文件系统视图。这使得容器可以访问并使用镜像层中的文件和目录,就像它们是在容器内部的文件一样。联合挂载还允许容器在运行时共享文件和目录,提高了容器之间的效率和资源利用率。

linux系统启动后,首先将 rootfs 设置为 readonly, 进行一系列检查, 然后将其切换为 “readwrite” 供用户使用,而docker容器启动时也是将 rootfs 以 readonly 方式加载并检查,然而接下来利用union mount 的方式 将一个 readwrite 文件系统挂载在 readonly 的 rootfs 之上, 并且允许再次将下层的 FS(file system) 设定为 readonly 并且向上叠加,这样一组 readonly 和一个 writeable 的结构构成一个 container 的运行时态, 每一个 FS 被称作一个 FS 层。

相关文章:

容器和云原生(二):Docker容器化技术

目录 Docker容器的使用 Docker容器关键技术 Namespace Cgroups UnionFS Docker容器的使用 首先直观地了解docker如何安装使用,并快速启动mysql服务的,启动时候绑定主机上的3306端口,查找mysql容器的ip,使用mysql -h contain…...

学习总结(TAT)

项目写完了,来写一个总的总结啦: 1.后期错误 Connection,Statement,Prestatement,ResultSet都要记得关闭接口;(一定要按顺序关闭); 在写群聊的时候写数据库名的时候不要…...

2023java异常之八股文——面试题

Java异常架构与异常关键字 Java异常简介 Java异常是Java提供的一种识别及响应错误的一致性机制。 Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的…...

数据可视化和数字孪生相互促进的关系

数据可视化和数字孪生是当今数字化时代中备受关注的两大领域,它们在不同层面和领域为我们提供了深入洞察和智能决策的机会,随着两种技术的不断融合发展,很多人会将他们联系在一起,本文就带大家浅谈一下二者之间相爱相杀的关系。 …...

axios使用axiosSource.cancel取消请求后怎么恢复请求,axios取消请求和恢复请求实现

在前端做大文件分片上传,或者其它中断请求时,需要暂停或重新请求,比如这里大文件上传时,可能会需要暂停、继续上传,如下GIF演示: 这里不详细说文件上传的处理和切片细节,后续有时间在出一篇&a…...

SAP动态安全库存简介

动态安全库存:跑需求计划时,ERP系统按设置的库存方式自动计算出满足一定时间内可保障生产的库存数量 SAP动态安全库存的计算公式:动态安全库存=平均日需求*覆盖范围。 平均日需求=特定时期内的总需求/特定时期内的工作天数 覆盖范围指在没又货物供应的情况下,库存可以维…...

JVM基础了解

JVM 是java虚拟机。 作用:运行并管理java源码文件锁生成的Class文件;在不同的操作系统上安装不同的JVM,从而实现了跨平台的保证。一般在安装完JDK或者JRE之后,其中就已经内置了JVM,只需要将Class文件交给JVM即可 写好的…...

QT:event事件分发器,事件过滤器(了解)

Event事件分发器 用于事件的分发 可以用事件分发器做拦截,从而不进入到后面的虚函数中,但是不建议 bool event(QEvent *e); 返回值 如果是true 代表用户处理这个事件,不向下进行分发 e->type()中可选择进行拦截的类…...

若依项目的介绍(前后端分离版本)

目录 一、若依介绍 (一)简单介绍 (二)若依版本 (三)Git远程拉取步骤 二、项目的技术介绍 (一)后端技术 1.spring boot 2.Spring Security安全控制 3.MyBatis 4.MySQL和R…...

DT游乐场建模

丢了一个...

Servlet+JDBC实战开发书店项目讲解第9篇:VIP等级优惠实现

ServletJDBC实战开发书店项目讲解第9篇:VIP等级优惠实现 介绍 在这篇博客中,我们将讲解如何在书店项目中实现VIP等级优惠功能。VIP等级优惠是一种常见的商业策略,可以吸引更多的顾客并提高销售额。我们将使用Servlet和JDBC来实现这个功能。…...

Azure文件共享

什么是Azure文件共享 Azure文件共享是一种在云中存储和访问文件的服务。它允许用户在不同的计算机、虚拟机和服务之间共享数据,并在应用程序中进行访问、修改和管理。 Azure文件共享可以用于各种用途,例如: 共享文件资源给多个虚拟机或服务…...

idea新建web项目

步骤一 步骤二 步骤三 新建两个目录lib、classes 步骤四 设置两个目录的功能lib、classes 步骤五 发布到tomcat...

回归预测 | MATLAB实现BES-SVM秃鹰搜索优化算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现BES-SVM秃鹰搜索优化算法优化支持向量机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现BES-SVM秃鹰搜索优化算法优化支持向量机多输入单输出回归预测(多指标,多图)效…...

电商增强现实3D模型优化需要关注的4个方面

到目前为止,AR技术已经发展到足以在更广泛的范围内实施。 在电子商务中,这项技术有望提供更令人兴奋的购物体验。 为了实现这一目标,在这篇博客中,我将介绍如何针对电子商务中的 AR 优化 3D 模型。 推荐:用 NSDT编辑器…...

【Effective Python】读书笔记-04推导与生成

1. 用列表推导取代 map 与 filter 因为不需要写 lambda 表达式。 可以很容易地跳过原列表中的某些数据。 # 列表推导l [i for i in range(5)] # [0, 1, 2, 3, 4] print(l)# 字典推导d {i: i ** 2 for i in range(5)} # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16} print(d)2. 控制推导…...

Android内存泄漏总结和性能优化技巧

我们在开发安卓应用时,性能优化是非常重要的方面。一方面,优化可以提高应用的响应速度、降低卡顿率和提升应用流畅度,从而提升用户体验;另一方面,优化也可以减少应用的资源占用,提高应用的稳定性和安全性&a…...

leetcode 125.验证回文串

⭐️ 题目描述 🌟 leetcode链接:https://leetcode.cn/problems/valid-palindrome/ 思路: 这道题只判断字符串中的字母与数字是否是回文。虽然小写大写字母可以互相转换,但是里面是含有数字字符的,所以先统一&#xff…...

ZooKeeper客户端使用与经典应用场景

概述 ZooKeeper的应用场景依赖于ZNode节点特性和Watch监听机制。 应用场景 数据发布/订阅 常用于实现配置中心,类似的有nacos。数据发布/订阅的一个常见的场景是配置中心,发布者把数据发布到ZooKeeper的一个或一系列的节点上,供订阅者进行…...

标签准备——labelIMG工具使用——自动化标注

在实际生产项目中,为了提升目标识别的准确性,我们往往需要3000-5000张图片进行标注。而直接参与过标注的人都有一个共同的感觉,就是标注是一个简单、枯燥、无聊且十分耗时费力的差事。为此,我们可以在有了初步训练模型的基础上,采用更加自动化的方式进行标注,届时,你讲不…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

python打卡day49

知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...