当前位置: 首页 > 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.等价向量组…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

基于Java项目的Karate API测试

Karate 实现了可以只编写Feature 文件进行测试,但是对于熟悉Java语言的开发或是测试人员,可以通过编程方式集成 Karate 丰富的自动化和数据断言功能。 本篇快速介绍在Java Maven项目中编写和运行测试的示例。 创建Maven项目 最简单的创建项目的方式就是创建一个目录,里面…...