Docker部署的时候从容器获取宿主机的CPU等信息

        最近在使用go开发后台的时候,有这么一个需求,开发的服务需要做一个license,用户需要license和服务同时在且有效的情况下才能运行服务,其实在正常情况下,也没什么,但是就是因为部署的时候客户那边可能用的是docker部署,那么如何在docker里面获取到宿主机的CPU信息就成了必须,因为license需要用到宿主机的CPU信息,也可以使用主板信息或者MAC信息等,我们这次用的是CPU序列号信息,用来做license的绑定。

        我先说下我的整个流程,代码里面我先是用go语言实现了获取CPU序列号信息,使用的是linux的dmidecode命令进行的获取,命令如下

[root@dmt ~]# dmidecode -t processor | grep ID | head -1
        ID: 57 06 05 00 FF FB 8B 0F
[root@dmt ~]#

下面附上我使用go来获取CPU序列号的代码,返回两个参数,第一个是CPU序列号的字符串类型数据,第二个参数是错误码数据

//获取CPUID函数
func GET_CPUID() (string, error) {
	cmd := exec.Command("/bin/sh", "-c", `dmidecode -t processor | grep ID | head -1`)
	stdout, err := cmd.StdoutPipe()
	if err != nil {
		fmt.Println("cmd.StdoutPipe: " + err.Error())
		return "", err
	}

	stderr, err := cmd.StderrPipe()
	if err != nil {
		fmt.Println("cmd.StderrPipe: ", err.Error())
		return "", err
	}

	if err := cmd.Start(); err != nil {
		fmt.Println("cmd.Start: ", err.Error())
		return "", err
	}

	bytesErr, err := ioutil.ReadAll(stderr)
	if err != nil {
		fmt.Println("ioutil.ReadAll stderr: ", err.Error())
		return "", err
	}

	if len(bytesErr) != 0 {
		fmt.Printf("stderr is not nil: %s", bytesErr)
		return "", errors.New(string(bytesErr))
	}

	bytes, err := ioutil.ReadAll(stdout)
	if err != nil {
		fmt.Println("ioutil.ReadAll stdout: ", err.Error())
		return "", err
	}

	if err := cmd.Wait(); err != nil {
		fmt.Println("cmd.Wait: ", err.Error())
		return "", err
	}
	cpuId := string(bytes)
	cpuId = strings.Replace(cpuId, "ID: ", "", -1)
	cpuId = strings.Replace(cpuId, "\t", "", -1)
	cpuId = strings.Replace(cpuId, "\n", "", -1)
	cpuId = strings.Replace(cpuId, " ", "-", -1)

	return cpuId, err
}

license的计算逻辑此处不方便公开,差不多

然后我的整个后台服务开发完成后,如果是直接在linux主机上部署,是没有任何问题的,因为直接就可以通过dmidecode命令获取到CPU的相关信息,如果是docker部署的话,需要在docker部署的yml文件里面添加如下内容。

version: '3.4'
services:
  pap:
    image: DOCKER_IMAGE
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - type: bind
        source: /usr/sbin/dmidecode
        target: /usr/sbin/dmidecode
      - type: bind
        source: /dev/mem
        target: /dev/mem
    privileged: true
    ports:
      - "8000:8000"
    restart:
          always

其中我把自己项目相关的代码都去掉了,其实最重要的就是下面这几行,每一行的作用我在后面做了备注

  • 绑定dmidecode,绑定后在docker里面也能访问dmidecode命令了
- type: bind
        source: /usr/sbin/dmidecode
        target: /usr/sbin/dmidecode
  • 绑定/dev/mem,绑定这个是因为dmidecode命令要去访问/dev/mem,不然调用dmidecode的时候会报错
- type: bind
        source: /dev/mem
        target: /dev/mem
  • 设置权限,不然到时候docker里面访问/dev/mem的时候会报权限不足,permission deny
 privileged: true

然后使用添加了这些信息的yml文件部署docker的话,程序在docker里面访问CPU信息的时候就可以正常访问了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Docker容器宿主机的销售是指销售用于部署和运行Docker容器的物理或虚拟服务器。随着Docker技术的发展和普及,容器化应用的需求不断增加,使得Docker容器宿主机的销售成为一个热门领域。 买家可以通过各种途径购买Docker容器宿主机。他们可以选择购买物理服务器,将其配置成Docker宿主机;或者选择使用云服务商提供的虚拟私有云(VPC)实例作为Docker容器宿主机。根据购买者的需求和预算,他们可以选择不同规格和配置的宿主机。一些供应商还提供了成套的容器化解决方案,包括硬件设备、软件平台和技术支持等。 对于直接购买物理服务器的买家来说,他们需要选择适合容器部署的服务器。这些服务器通常具有高性能的CPU和内存,支持虚拟化技术,如Intel VT或AMD-V。此外,服务器上的存储系统也需要具备高速访问和可扩展性,以满足容器化应用对存储的需求。购买者还需要考虑容器化应用的规模和负载特性,以确定适合的服务器数量和规格。 云服务商提供的虚拟私有云实例通常更加灵活和易于管理。购买者可以根据需求选择不同规格和配置的虚拟机实例。云服务商还提供了自动化的容器编排和管理工具,如AWS的Elastic Container Service(ECS)或谷歌的Kubernetes,使得容器化应用的部署和管理更加方便。 总之,Docker容器宿主机的销售是一个与容器化应用需求紧密相关的市场。购买者可以根据自己的需求选择合适的宿主机,无论是购买物理服务器还是使用云服务商提供的虚拟机实例。这些宿主机可以帮助他们快速部署和运行容器化应用,提高应用的灵活性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值