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

在CSDN学Golang云原生(Docker基础)

一,docker安装配置

要在golang中使用Docker,需要先安装并配置好Docker。下面是基本的Docker安装和配置步骤:

  1. 下载并安装Docker

官方下载地址:https://docs.docker.com/get-docker/

根据你的操作系统选择对应版本的Docker,并按照官方文档进行安装。

  1. 配置Docker

在Linux环境下,可以使用以下命令启动Docker服务:

sudo systemctl start docker

为了使当前用户能够访问Docker服务,还需要将该用户添加到docker组中:

sudo usermod -aG docker $USER

然后重启终端会话以使更改生效。

  1. 测试Docker是否成功安装和配置

运行以下命令验证Docker是否已正确安装和配置:

docker run hello-world

如果输出类似于以下内容,则表示已成功安装和配置Docker:

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

至此,你已经完成了golang Docker的安装和配置。现在你可以开始使用golang编写应用程序并构建镜像来部署到容器中。

二,RootFs环境依赖

在golang中使用RootFs可以创建一个基于Linux容器的轻量级环境,但是需要注意环境依赖问题。如果你的程序涉及到外部库或者系统命令,则需要将这些依赖项包含在RootFs镜像中。

一种常见的解决方案是使用Dockerfile构建一个包含所需依赖的基础镜像,并将该镜像作为RootFs的基础镜像。例如,以下Dockerfile用于构建一个包含curl、wget和tar等工具的基础镜像:

FROM alpine:latest
RUN apk update && \apk upgrade && \apk add --no-cache bash curl wget tar

然后,在golang程序中可以通过导入相关库和使用os/exec模块来运行系统命令,如下所示:

package mainimport ("fmt""os/exec"
)func main() {cmd := exec.Command("curl", "-s", "https://www.google.com")out, err := cmd.Output()if err != nil {fmt.Println(err)return}fmt.Println(string(out))
}

最后,在编译golang程序时,可以使用-tags netgo static_build参数强制静态链接所有依赖项,以避免在运行RootFs容器时出现缺少共享库文件的错误。

三,Linux Namespace隔离

Linux Namespace是一种机制,可以使进程看到一个虚拟的系统环境。使用Namespace,可以将某些资源(如网络、文件系统等)隔离开来,从而实现不同进程之间的资源隔离。

下面是在golang中使用Linux Namespace进行隔离的基本步骤:

  1. 导入相关包
import ("os""os/exec""syscall"
)
  1. 创建新的Namespace

使用Clone系统调用创建新的Namespace:

cmd := exec.Command("/proc/self/exe", "init")
cmd.SysProcAttr = &syscall.SysProcAttr{Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS | syscall.CLONE_NEWNET,
}

这里我们创建了5个Namespace:UTS、IPC、PID、Mount和Network。

  1. 在新Namespace中运行应用程序

通过执行上述命令,会启动一个新进程,并在其中创建了新Namespace。现在,我们需要在该进程中运行实际的应用程序。为此,我们需要编写一个可执行文件(如上例中的“init”),并将其作为参数传递给上述命令。

  1. 进行资源配置和管理

一旦你成功地创建了新的Namespace,并在其中运行应用程序,则可以根据需求对其进行配置和管理。例如,你可以限制容器内部访问外部网络或文件系统的权限,并设置各种其他限制和规则。

以上是在golang中使用Linux Namespace进行隔离的基本步骤。

四,Cgroup资源配额限制

Cgroup是Linux内核中的一种机制,可以为进程分配资源配额,并限制它们对系统资源(如CPU、内存、IO等)的使用。在golang中使用Cgroup进行资源配额限制的基本步骤如下:

  1. 导入相关包
import ("os""bufio"
)
  1. 创建新的Cgroup

使用os.Mkdir函数创建新的Cgroup目录:

cgroupName := "my_cgroup"
path := "/sys/fs/cgroup/cpu/" + cgroupName
if _, err := os.Stat(path); os.IsNotExist(err) {if err = os.Mkdir(path, 0755); err != nil {panic(err)}
}

这里我们以CPU Cgroup为例,但同样可以使用其他类型的Cgroups。

  1. 配置资源限制

在创建了新的Cgroup目录后,我们需要通过配置相应参数来限制进程所能使用的各种资源。例如,要限制CPU时间,我们可以将CPU时间配额值写入cpu.cfs_quota_us文件中:

quotaFile, err := os.OpenFile(path+"/cpu.cfs_quota_us", os.O_WRONLY, 0644)
if err != nil {panic(err)
}
defer quotaFile.Close()writer := bufio.NewWriter(quotaFile)
_, _ = writer.WriteString("100000") // 100ms CPU time limit
_ = writer.Flush()

这里我们设置了一个100ms的CPU时间限制。

  1. 启动进程并加入到Cgroup中

最后,在已经完成了Cgroup配置之后,我们需要启动应用程序,并将其加入到Cgroup中:

cmd := exec.Command("/usr/bin/python", "-c", "while True: pass")
cmd.SysProcAttr = &syscall.SysProcAttr{Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS | syscall.CLONE_NEWNET,
}
cmd.Stdin, _ = os.Open(os.DevNull)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderrif err := cmd.Start(); err != nil {panic(err)
}pid := cmd.Process.PidtasksFile, err := os.OpenFile(path+"/tasks", os.O_WRONLY, 0644)
if err != nil {panic(err)
}
defer tasksFile.Close()writer := bufio.NewWriter(tasksFile)
_, _ = writer.WriteString(fmt.Sprintf("%d\n", pid))
_ = writer.Flush()

这里我们使用了exec.Command函数来启动一个新的进程,并使用Clone系统调用创建了新Namespace。然后,我们将该进程的PID写入到Cgroup目录的tasks文件中,以便它被正确地加入到相应的Cgroup中。

相关文章:

在CSDN学Golang云原生(Docker基础)

一,docker安装配置 要在golang中使用Docker,需要先安装并配置好Docker。下面是基本的Docker安装和配置步骤: 下载并安装Docker 官方下载地址:https://docs.docker.com/get-docker/ 根据你的操作系统选择对应版本的Docker&…...

Zookeeper命令总结

目录 1、常用命令2、ls path3、create xxx创建持久化节点创建临时节点创建持久化序列节点 4、get path5、set path6、delete path7、监听器总结1)节点的值变化监听2)节点的子节点变化监听(路径变化)3)当某个节点创建或…...

C语言中的函数(超详细)

C语言中的函数(超详细) 一、函数概述二、C语言中函数的分类1.库函数2.自定义函数三、函数的参数1.实际参数(实参)2.形式参数(形参)四、函数的调用1.传值调用2.传址调用五、函数的嵌套调用和链式访问1.嵌套调…...

华为H3C思科网络设备命令对照表

类别命令功能华为H3C思科通用取消关闭当前设置undoundono通用显示查看displaydisplayshow通用退回上级quitquitquit通用设置设备名称sysnamesysnamehostname通用到全局模式system-viewsystem-viewenable config terminal通用删除文件deletedeletedelete通用重启设备rebootreboo…...

产品需求、系统架构设计经验篇

需求设计思维导图UML 建模原型规范什么样的需求该忽略1.拍拍脑袋得来的想法,往往是没用的2.用户反馈的信息,不应该直接纳入需求3.扭改用户习惯的需求,一律不考虑 什么样的需求该重视1.从运维系统中根据数据结果分析得出的结论2.重视有洞见者的…...

关于websocket的几点注意事项

第一、普通websocket直接集成即可 <!-- Spring Websocket 相关依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency> 第二、web后端两点,创…...

go学习 4、复合数据类型

4、复合数据类型 数组、slice、map和结构体 如何使用结构体来解码和编码到对应JSON格式的数据&#xff0c;并且通过结合使用模板来生成HTML页面 数组和结构体是聚合类型;它们的值由许多元素或成员字段的值组成。数组是由同构的元素组成&#xff08;每个数组元素都是完全相同的…...

Rust: Vec类型的into_boxed_slice()方法

比如&#xff0c;我们经常看到Vec类型&#xff0c;但取转其裸指针&#xff0c;经常会看到into_boxed_slice()方法&#xff0c;这是为何&#xff1f; use std::{fmt, slice};#[derive(Clone, Copy)] struct RawBuffer {ptr: *mut u8,len: usize, }impl From<Vec<u8>&g…...

Python - Opencv + pyzbar实时摄像头识别二维码

直接上代码&#xff1a; import cv2 from pyzbar.pyzbar import decodecap cv2.VideoCapture(0) # 打开摄像头while True: # 循环读取摄像头帧ret, frame cap.read()# 在循环中&#xff0c;将每一帧作为图像输入&#xff0c;使用pyzbar的decode()函数识别二维码barcodes …...

网络安全(黑客)就业分析指导

一、针对网络安全市场分析 市场需求量高&#xff1b;则是发展相对成熟入门比较容易。所需要的技术水平国家政策环境 对于国家与企业的地位愈发重要&#xff0c;没有网络安全就没有国家安全 更有为国效力的正义黑客—红客联盟 可见其重视程度。 需要掌握的知识点偏多 外围打点…...

MySQL 主从复制的认识 2023.07.23

一、理解MySQL主从复制原理 1、概念&#xff1a;主从复制是用来建立一个和 主数据库完全一样的数据库环境称为从数据库&#xff1b;主数据库一般是准实时的业务数据库。 2、作用&#xff1a;灾备、数据分布、负载平衡、读写分离、提高并发能力 3、原理图 4、具体步骤 (1) M…...

elasticsearch查询操作(API方式)

说明&#xff1a;elasticsearch查询操作除了使用DSL语句的方式&#xff08;参考&#xff1a;http://t.csdn.cn/k7IGL&#xff09;&#xff0c;也可以使用API的方式。 准备 使用前需先导入依赖 <!--RestHighLevelClient依赖--><dependency><groupId>org.ela…...

Java版企业工程项目管理系统源码+java版本+项目模块功能清单+spring cloud +spring boot

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…...

理解Android中不同的Context

作者&#xff1a;两日的blog Context是什么&#xff0c;有什么用 在Android开发中&#xff0c;Context是一个抽象类&#xff0c;它是Android应用程序环境的一部分。它提供了访问应用程序资源和执行各种操作的接口。可以说&#xff0c;Context是Android应用程序与系统环境进行交…...

linux判断端口是否占用(好用)

netstat 一般的话使用 netstat -tunlp | grep xxx参数作用-t指明显示TCP端口-u指明显示UDP端口-l仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序)-p显示进程标识符和程序名称&#xff0c;每一个套接字/端口都属于一个程序。-n不进行…...

springboot 自定义注解 ,实现接口限流(计数器限流)【强行喂饭版】

思路&#xff1a;通过AOP拦截注解标记的方法&#xff0c;在Redis中维护一个计数器来记录接口访问的频率&#xff0c; 并根据限流策略来判断是否允许继续处理请求。 另一篇&#xff1a;springboot 自定义注解 &#xff0c;aop切面Around&#xff1b; 为接口实现日志插入【强行喂…...

istio安装部署总结

istio安装部署总结 大纲 istio基础概念版本选择安装istio核心主件卸载istiokiali安装 istio基础概念 https://istio.io/latest/zh/docs/ 中文文档 istio是一个服务治理平台&#xff0c;治理服务间的访问&#xff0c;&#xff08;例如流量控制&#xff0c;安全策略&#xf…...

Linux操作系统~必考面试题⑨

1、rpm 命令 Linux rpm 命令用于管理套件。 rpm(redhat package manager) 原本是 Red Hat Linux 发行版专门用来管理Linux 各项套件的程序&#xff0c;由于它遵循 GPL 规则且功能强大方便&#xff0c;因而广受欢迎。逐渐受到其他发行版的采用。 RPM 套件管理方式的出现&…...

国标GB28181协议视频平台EasyCVR修改录像计划等待时间较长的原因排查与解决

音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成&…...

线性代数(主题篇):第三章:向量组 、第四章:方程组

文章目录 第3章 n维向量1.概念(1)n维单位列向量 2.向量、向量组的的线性关系(线性相关性)(1)线性表示 &#xff1a;AXβ(2)线性相关、线性无关&#xff1a; AX0①线性相关②线性无关③线性相关性7大定理 3.极大线性无关组、等价向量组、向量组的秩1.极大线性无关组2.等价向量组…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...