如何在容器内高效编程?

作者 | Daniel Lemire

译者 | 苏本如,责编 | 郭芮

头图 | CSDN 下载自东方IC

出品 | CSDN(ID:CSDNnews)

以下为译文:

我个人的编程环境中包括了一些服务器、笔记本电脑和台式电脑。我的服务器是在不同的时间购买和配置的,根据需求不同,它们有不同的硬件和软件配置。这些硬件的处理器不同,AMD、英特尔、Ampere和Rockchip的处理器都有。同时这些机器上安装有各种各样的Linux发行版,包括各种旧版本和新版本。在实验室技术人员帮助我做好初始设置后,基本上这些电脑所有的管理工作都是由我一人负责。

所以,最终我时常面对这样的情形:有时候我会遇到一些非常有趣的系统,这些系统都带有旧的Linux发行版,而重新安装新Linux发行版并保证它的安全并非易事。而且,即使我费尽心力地更新了我的Linux发行版,我最终也可能会得到一个与我的合作者不同的Linux发行版,使用不同的编译器等等。更不用说在同一个Linux发行版上安装多个不同的编译器是一件非常耗费时间的事。

那么,应对这种问题,你能做些什么呢?

你可以运行虚拟机。使用VirtualBox之类的工具,你可以在Windows和 macOS中运行Linux。这种方式很简单。然而,它速度很慢,而且计算的代价高昂。

你可以切换到容器,特别是Docker容器,它们的开销要少得多。Docker现在已经是云计算中无处不在的工具。作为一个简单的描述,你可以把Docker看作一个允许你在Linux中运行Linux的容器。Docker实际上是一个沙箱,但它是一个几乎可以直接在主机上运行的沙箱。与虚拟机不同,我的测试显示,在计算密集型任务中,Docker容器可以以“原生速度”(裸机速度)运行。有报道称Docker的交互速度较慢,网络连接和磁盘访问速度也较慢。但就我的用途而言,Decker能很好地满足我的要求。

当然,如果必须的话,你也可以在macOS和Windows下运行Docker容器,不过我想这样做会需要更多的开销。

容器方法的思想始终是基于系统的起始状态。比如说,你定义了你的数据库服务器需要的配置,并且每次都以这种精确的状态(配置)来启动它。这样就使得你的基础架构具有可预测性。

这听起来不是那么完美。你仍然必须依赖于你的容器的起始配置。如果两个具有不同要求的应用程序需要在同一个映像中一起运行,那么你可能需要进行各种配置操作。

话虽如此,容器仍然工作得很好,它们基本上成了维系我们当令技术文明的基础:许多基于云的应用程序都是以某种方式基于容器的。

容器的目是将软件部署到生产环境中去。在容器内编程是不被直接支持的:你将找不到关于容器编程的很多文档,而且围绕着容器编程也根本没有什么业务模型。那么这里我提到的“在容器内编程”是什么意思呢?我的意思是:我要启动一个C编程项目,决定使用Linux Ubuntu16.10发行版,并在Linux Ubuntu16.10下编译和运行我的代码,即使我的服务器可能运行完全不同的Linux发行版(或者可能在macOS下)。

第一个问题是,你的磁盘和从容器构建来的映像的磁盘是不同的。正在运行的映像无法自由访问底层服务器(主机)。记住容器本质上是一个沙箱。

因此,你只可以在映像里面做所有的工作。但是,请记住,容器技术的重点是始终从原始状态开始。如果你加载了一个图像,做了一些工作,然后离开……你的工作就不见了。映像被设计成是不可变的。这是一件很好的事情,因为这保证了你不会因为一不小心就把映像弄乱。

在映像中完成一些工作后,可以为新状态拍摄快照,提交它并创建一个新映像,再从中重新开始。这个过程既复杂又不实用。

那么你能做什么呢?你可以做的是保持映像的无状态,就像一个映像本来就应该是无状态的那样。这样的话,映像中将只能包含编译器和构建工具。因为没有理由频繁地更换这些工具。同时你将所有的代码都放在一个目录中,就像你通常所做的那样。要运行和编译代码,你可以进入映像中并运行命令。你可以在进入代码存储库时将其从主机磁盘绑定到映像。

这种方式效果更好。但是如果直接执行Docker命令行,则会出现以下问题:

1)根据你机器上的Docker配置,你可能会发现无法从映像读取或写入绑定到该映像的磁盘。对这个问题的一个快速修复方法是以特权访问方式来运行映像,但这种方法通常不受欢迎(而且不必要)。

2)从Docker映像中创建或修改的文件显示在主机磁盘上时,通常带有奇怪的文件权限。比如说,可能所有文件都属于根用户。我的一个研究助理有一个很好的变通解决办法:他一直以根用户的身份运行Linux。但是,我不推荐这样的方法。

这些小问题根源在于Docker以一种奇怪的方式来处理权限和安全性。可能与你了解的相反,设置用户和组标识符并不是一件简单的事情:在某些系统上可能足够简单,但在一些需要额外注意的支持增强的安全性的Linux系统上就不那么简单了。

最后,你需要记住很多复杂的命令。如果你和我一样,想把所有的注意力都集中在代码上,而不愿意在Docker上面浪费太多的时间。怎么办?

解决方法是使用一个小小的脚本。以我为例,我使用一个bash脚本。你可以在GitHub上找到它。它可以帮助你理清零乱的命令和文件权限。

尽管多年来,我一直试图避免依赖脚本,但是为了高效的工作,这是无可避免的。

基本上,我的做法是向我工作的目录的根目录中复制两个文件(Dockerfile和run文件),然后键入命令:

./run bash

就是这么简单!现在我进入了主机目录的一个子shell中。我可以在这里运行我的程序,编译我的代码,我对最近的Ubuntu发行版有完全的访问权限,这种方式甚至在我的基于ARM的服务器环境中也能很好地工作。

这个run脚本也可以接受其他命令,因此我可以将它作为其他脚本的一部分。

原文:https://lemire.me/blog/2020/05/22/programming-inside-a-container/

本文为 CSDN 翻译,转载请注明来源出处。

6月3日20:00,CSDN 创始人&董事长、极客帮创投创始合伙人蒋涛携手全球顶级开源基金会主席、董事,聚焦中国开源现状,直面开发者在开源技术、商业上的难题,你绝不可错过的开源巅峰对谈!立即免费围观

推荐阅读

  • 因为一个跨域请求,我差点丢了饭碗

  • 没错,你离分布式搜索只差一个Elasticsearch入门!

  • Python开发之:Django基于Docker实现Mysql数据库读写分离、集群、主从同步详解 | 原力计划

  • 全球Python调查报告:Python 2正在消亡,PyCharm比VS Code更受欢迎

  • 无代码来了,还要程序员吗?

  • 再见,Eclipse | 原力计划

  • 区块链共识算法总结 | 原力计划

真香,朕在看了!

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

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

相关文章

(企业案例)Nacos Config 进阶使用

文章目录一、SpringBoot 使用 Nacos Config 实现多环境切换1. 现象2. 引入依赖3. 添加bootstrap.yaml配置文件4. 配置对应关系图5. 文件格式简述6. 启动nacos7. 添加生产配置8. 添加测试controller9. 启动Springboot工程并观察到如下日志则为成功10. 浏览器验证11. 调整激活环境…

OceanBase如何获得TPC-C测试第1名?

阿里妹导读:TPC-C是TPC组织(国际事务性能委员会)制定的关于商品销售的订单创建和订单支付等的基准测试标准,是数据库联机交易处理系统的权威基准测试标准。 蚂蚁金服自研的分布式关系数据库OceanBase获得TPC-C测试第一名后&#…

由一次磁盘告警引发的“血案”——你知道 du 和 ls 区别吗?

来源 | 程序猿石头责编 | Carol封图 | CSDN下载自视觉中国图来源于 SkyPixel知道为什么会有上面的结果吗?什么又是稀疏文件?这篇文章将为你揭秘。问题背景确切地说,不是收到的自动告警短信或者邮件告诉我某机器上的磁盘满了,而是某…

如何优化大规模推荐?下一代算法技术JTM来了

阿里妹导读:搜索,推荐和广告是互联网内容提供商进行价值创造的核心业务,在阿里巴巴的电子商务交易平台上,搜索,推荐和广告业务同样具有举足轻重的意义和价值。现在,阿里推荐技术又双叒优化了,新…

Sentinel 基于Nacos规则持久化-推模式

文章目录一、推模式架构图二、原理简述2.1. 组件版本关系2.2. 控制台推送规则三、Sentinel控制台改造3.1. 下载源码3.2. 修改pom3.3. 重要文件复制3.4. 注册地址修改3.5. 请求实例需改3.6. 菜单新增四、编译 & 启动4.1. 先启动nacos4.2. 编译打包4.3. 创建微服务 &&…

都听我的,会养猪种菜的工程师最帅了!

来了!今天,阿里数字农业事业部在黑龙江首次亮相,并且定了一个小目标:到2022年,阿里涉农产品全年网络销售额破4000亿元。 黑龙江省牡丹江市的阿里巴巴响水大米种植基地,又到了收割季 数字农业事业部将建立产…

清华硕士一针见血:这些才是机器学习必备的数学基础

现如今,计算机科学、人工智能、数据科学已成为技术发展的主要推动力。无论是要翻阅这些领域的文章,还是要参与相关任务,你马上就会遇到一些拦路虎:想过滤垃圾邮件,不具备概率论中的贝叶斯思维恐怕不行;想试…

如何查看使用 Cloud Toolkit 部署应用的实时日志

之前,我们介绍了《在 IntelliJ IDEA 中部署应用到服务器》。最新版本 Cloud Toolkit 新增了对远程服务器应用部署时,实时日志的查看功能。功能预览如下: 打开应用部署的配置界面,如上图所示,点击「Advanced」标签页&am…

这 10 个云计算错误,会让你的业务一蹶不振!

作者 | John Edwards译者 | 火火酱,责编 | Carol出品 | CSDN 云计算(CSDNcloud)封图 | CSDN 付费下载自视觉中国乐观主义者们总爱说:“乌云总是镶着金边的”,但他们没有说的是,在乌云下常有狂风、暴雨、闪电…

MySQL 8.0.26 简易配置安装教程 (windows 64位)

文章目录一、软件下载解压1. 官网下载2.下载完成后解压二、mysql配置2.1. my.ini2.2. 初始化MySQL2.3. 安装MySQL服务2.4. mysql已经安装过了2.5. 启动MySQL的服务三、密码修改3.1. 登录mysql3.2. 修改密码3.3. 退出mysql四、客户端连接mysql4.1. Navicat4.2. 登录mysql4.3. 操…

类与字节码技术

类文件结构 1.1 魔数 0-3字节,表示它是否是【class】类型的文件 ​ |java| 0000000 ca fe ba be 00 00 00 34 00 23 0a 00 06 00 15 09 1.2 版本 4-7字节,表示类的版本00 34 (52) 表示是Java8 0000000 ca fe ba be 00 00 00…

支付宝 App 是如何建设移动 DevOps 的?

本文系InfoQ对蚂蚁金服技术专家洪锋的采访,洪锋老师即将在 QCon 上海站 2019 分享《移动研发 DevOps 在支付宝 App 内的落地实践》,欢迎关注。 微软 MSDN 上的一篇文章有这样一段话:“移动应用的理想环境需要满足两个条件,一是可以…

淘宝端智能演进和思考

今天分享内容包括三部分,第一是端智能整体趋势和淘宝应用现状,第二是淘宝在应用端智能过程中面临的问题和挑战,以及我们的应对和解决思路,我们构建了端到端的完整技术体系,第三是开源推理引擎 MNN 的最新情况。 01、端…

从零开始入门 K8s | 可观测性:你的应用健康吗?

一、需求来源 首先来看一下,整个需求的来源:当把应用迁移到 Kubernetes 之后,要如何去保障应用的健康与稳定呢?其实很简单,可以从两个方面来进行增强: 首先是提高应用的可观测性;第二是提高应…

技术差的程序员,90%都输在这点上!骨灰级开发:其实都是在瞎努力!

01从未得到过重视的问题“一流程序员学数学,二流程序员学算法,低端看高端就是黑魔法”。可能有人会以为这是段子,而有过开发经验的都知道,这就是程序员的真实写照!而数学不好的程序员,我想你开发过程中&…

layui 单选项 点击显示与隐藏 很实用

html <div class"layui-form-item"><label class"layui-form-label">类型</label><div class"layui-input-block"><input type"radio" name"type" lay-filter"type" value"0&quo…

2. 字节码指令

2. 字节码指令 2.1 入门 public cn.itcast.jvm.t5.HelloWorld();构造方法的字节码指令 ​ 2a b7 00 01 b1 2a> aload_0加载slot 0的局部变量&#xff0c;即this&#xff0c;做为下面的invokespecial 构造方法调用的参数b7 >invokespecial预备调用构造方法&#xff0c…

它是真实的“盗梦空间”?在这里,一切都可能是数据

阿里妹导读&#xff1a;位于杭州阿里巴巴西溪园区旁边的大型商场“亲橙里”2018年正式开业。和传统的线下综合型商场不同的是&#xff0c;亲橙里从规划之初就定位为数字化商场&#xff0c;通过植入自研的IBOS平台完成建筑内的所有子系统的接入&#xff0c;而让建筑和建筑内的设…

BDS-HA:构建高可用、低延迟的HBase服务

HBase可以支持百TB数据规模、数百万QPS压力下的毫秒响应&#xff0c;适用于大数据背景下的风控和推荐等在线场景。阿里云HBase服务了多家金融、广告、媒体类业务中的风控和推荐&#xff0c;持续的在高可用、低延迟、低成本方向上进行优化。目前单集群承诺可用性99.9%&#xff0…

layui 表单动态添加、删除input框

html部分 <div class"layui-form-item" ><label class"layui-form-label">路线</label><div class"layui-input-block" id"last"><div class"layui-input-inline">{empty name"$ways&q…