为什么不需要在Docker容器中运行sshd (为什么不需要暑假工)

教程大全 2025-07-19 03:26:41 浏览

当开始使用Docker时,人们经常问:“我该如何进入容器?”,其他人会说“在你的容器里运行一个SSH 服务器 ”。但是,从这篇博文中你将会了解到你根本不需要运行SSHd守护进程来进入你的容器。当然,除非你的容器就是一个SSH服务器。

运行SSH服务器是很想当然的,因为它提供了进入容器的简便方式。在我们公司基本上每个人都最少使用过一次SSH。我们中有很大一部分人每天都会使用它,并且他们很熟悉公钥与私钥,无密码登录,密钥代理,甚至有时会使用端口转发和其他不常用的功能。正因如此,人们建议你在容器中运行SSH并不奇怪。但你应该仔细考虑下。

假设你正在假设一个Redis Server或Java Webservice的Docker镜像, 我会问你以下几个问题:

但我该如何做…

备份我的数据?

你的数据应该存在于volume中. 然后你可以使用–volumes-from选项来运行另一个容器,与***个容器共享这个volume。这样做的好处:如果你需要安装新的工具(如s75pxd)来将你备份的数据长期保存,或将数据转移到其他***存储时,你可以在这个特定的备份容器中进行,而不是在主服务容器中。这很简洁。

检查日志?

再次使用volume! 如果你将所有日志写入一个特定的目录下,且这个目录是一个volume的话,那你可以启动另一个容器(使用–volumes-from,还记得么?)且在这里面做你需要做的事。如果你还需要特殊的工具(或只需要一个有意思的ack-grep),你可以在这个容器中安装它们,这样可以保持主容器的原始环境。

重启service?

基本上所有service都可以通过信号来重启。当你使用/etc/init.d/foo restart或service foo restart时,实际上它们都会给进程发送一个特定的信号。你可以使用docker kill -s 来发送这个信号。一些service可能不会监听这些信号,但可以在一个特定的socket上接受命令。如果是一个TCP socket,只需要通过网络连接上就可以了。如果是一个UNIX套接字,你可以再次使用volume。将容器和service的控制套接字设置到一个特定的目录中,且这个目录是一个volume。然后启动一个新的容器来访问这个volume;这样就可以使用UNIX套接字了。

“但这也太复杂了吧!”-其实不然。假设你名为foo的servcie 在/var/run/foo.sock创建了一个套接字,且需要你运行fooctl restart来完成重启。只需要使用-v /var/run(或在Docker文件中添加VOLUME /var/run)来启动这个service就可以了。当你想重启的时候,使用–volumes-from选项并重载命令来启动相同的镜像。像这样:

很简单吧!

修改我的配置文件

如果你正在执行一个持久的配置变更,你***把他的改变放在image中,因为如果你又启动一个container,那么服务还是使用的老的配置,你的配置变更将丢失。所以,没有您的SSH访问! “但是我需要在服务存活期间,改变我的配置;例如增加一个新的虚拟站点!” 这种情况下,你需要使用……等待……volume!配置应该在volume中,并且该volume应该和一个特殊目的“配置编辑器”容器共享。你可以在这个容器中使用任何你喜欢的东西:SSH + 你最喜欢的编辑器,或一个接受get="_blank">API调用的web服务,或一个从外部源抓取信息的定时任务;诸如此类。另外,分离关注:一个容器运行服务,另外一个处理配置更新 “但是我做临时更改,因为我正在测试不同的值!” 在这种情况下,查看下一章节!

调试我的应用?

这可能是唯一需要进入container的场景了。因为你要运行gdb, strace, tweak配置,等。这种情况下,你需要 nsenter。

介绍 nsenter

nsenter是一个小的工具,用来进入命名空间中。技术上,它可以进入现有的命名空间,或者产生一个进程进入新的一组命名空间。“命名空间是什么?”他们是容器的重要组成部分。 简单点说: 通过使用 nsenter ,你可以进入一个已经存在的container中 ,尽管这个container没有运行ssh 或者任意特殊用途的守护进程。

为什么不需要暑假工 从哪里获得 nsenter ?

在GitHub上查看jpetazzo/nsenter简单的安装是:

它将会把 nsenter 安装到/usr/local/bin 中,你就可以立刻使用它了。

nsenter 也可以在你的发行版中获得(在 util-linux 包中)。

如何使用?

首先,计算出你要进入容器的PID:

然后进入容器:

在容器里,可以操作shell解析器。如果要想以自动化的方式来运行特殊的脚本或程序,把它作为参数添加到nsenter中。除了它使用容器代替了简单目录来工作外,它的工作方式有点像chroot。

远程访问怎么样?

如果你需要从一个远程主机进入一个容器,有(至少)两个方法:

***种方法相对简单;但是需要root权限访问Docker主机(从安全角度来说不是很好)。第二种方法在 SSH 的authorized_keys 文件中使用command=模式。你可能熟悉authorized_keys文件,它看起来像这样:

(当然,实际上一个真正的密钥是很长的,一般都会占据好几行。)你也可以强制使用一个专有的命令。如果你想要在你的系统上查看一个远程的主机上可以有效使用的内存,可以使用SSH密钥,但是你不会希望交出所有的shell权限,你可以在authorized_keys文件中输入下面的内容:

现在,当使用专有的密钥进行连接时,替换取得的shell,它可以执行free命令。除此之外,就不能做其他的。(通常,你可能还想要添加no-port-forwarding;如果希望了解更多信息可以查看authorized_keys(5)的手册(manpage))。这种机制的关键是使得责任分离。Alice把服务放在容器内部;她不用处理远程的访问,登陆等事务。Betty会添加SSH层,在特殊情况(调试奇怪的问题)下使用。Charlotte会考虑登陆。等等。

总结

在一个容器中运行SSH服务器,这真的是一个错误(大写字母W)吗?老实说,没那么严重。当你不去访问Docker主机的时候,这样做甚至是极其方便的,但是这仍然需要在容器中取得一个shell。除此之外,我们还有许多方式可以在容器中运行SSH服务器,并能取得所有我们想要的特性,而且其架构还非常清晰。Docker允许你使用任何最适合你的工作流。但是,在做这些之前,迅速步入“我的容器真的是一个小的VPS”这句流行语的(语境)时,请注意还有其他的解决方案,这样你才可以做出一个明智的决定。

英文原文:WHY YOU DON’T NEED TO RUN SSHD IN YOUR DOCKER CONTAINERS

译文出自:


LinkedList和ArrayList的区别

ArrayListArrayList是一个动态数组,也是我们最常用的集合。 它允许任何符合规则的元素插入甚至包括null。 每一e68a84e8a2ad39个ArrayList都有一个初始容量(10),该容量代表了数组的大小。 随着容器中的元素不断增加,容器的大小也会随着增加。 在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。 所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。 size、isEmpty、get、set、iterator 和 listIterator 操作都以固定时间运行。 add 操作以分摊的固定时间运行,也就是说,添加 n 个元素需要 O(n) 时间(由于要考虑到扩容,所以这不只是添加元素会带来分摊固定时间开销那样简单)。 ArrayList擅长于随机访问。 同时ArrayList是非同步的。 LinkedList同样实现List接口的LinkedList与ArrayList不同,ArrayList是一个动态数组,而LinkedList是一个双向链表。 所以它除了有ArrayList的基本操作方法外还额外提供了get,remove,insert方法在LinkedList的首部或尾部。 由于实现的方式不同,LinkedList不能随机访问,它所有的操作都是要按照双重链表的需要执行。 在列表中索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。 这样做的好处就是可以通过较低的代价在List中进行插入和删除操作。 与ArrayList一样,LinkedList也是非同步的。 如果多个线程同时访问一个List,则必须自己实现访问同步。 一种解决方法是在创建List时构造一个同步的List:List list= (new LinkedList(...));综述: 是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 这一点要看实际情况的。 若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。 但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList.因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。

溴化锂机组高温发生器温度高怎么处理

工作原理与循环 溶液的蒸气压力是对平衡状态而言的。 如果蒸气压力为0.85kPa的溴化锂溶液与具有1kPa压力(7℃)的水蒸气接触,蒸气和液体不处于平衡状态,此时溶液具有吸收水蒸气的能力,直到水蒸气的压力降低到稍高于0.85kPa(例如:0.87kPa)为止。 0.87kPa和0.85kPa之间的压差用于克服连接管道中的流动阻力以及由于过程偏离平衡状态而产生的压差。 水在5℃下蒸发时,就可能从较高温度的被冷却介质中吸收气化潜热,使被冷却介质冷却。 为了使水在低压下不断气化,并使所产生的蒸气不断地被吸收,从而保证吸收过程的不断进行,供吸收用的溶液的浓度必须大于吸收终了的溶液的浓度。 为此,除了必须不断地供给蒸发器纯水外,还必须不断地供给新的浓溶液。 实际上采用对稀溶液加热的方法,使之沸腾,从而获得蒸馏水供不断蒸发使用。 系统由发生器、冷凝器、蒸发器、节流阀、泵和溶液热交换器等组成。 稀溶液在加热以前用泵将压力升高,使沸腾所产生的蒸气能够在常温下冷凝。 例如,冷却水温度为35℃时,考虑到热交换器中所允许的传热温差,冷凝有可能在40℃左右发生,因此发生器内的压力必须是7.37kPa或更高一些(考虑到管道阻力等因素)。 发生器和冷凝器(高压侧)与蒸发器和吸收器(低压侧)之间的压差通过安装在相应管道上的膨胀阀或其它节流机构来保持。 在溴化锂吸收式制冷机中,这一压差相当小,一般只有6.5~8kPa,因而采用U型管、节流短管或节流小孔即可。 离开发生器的浓溶液的温度较高,而离开吸收器的稀溶液的温度却相当低。 浓溶液在未被冷却到与吸收器压力相对应的温度前不可能吸收水蒸气,而稀溶液又必须加热到和发生器压力相对应的饱和温度才开始沸腾,因此通过一台溶液热交换器,使浓溶液和稀溶液在各自进入吸收器和发生器之前彼此进行热量交换,使稀溶液温度升高,浓溶液温度下降。 由于水蒸气的比容非常大,为避免流动时产生过大的压降,需要很粗的管道,为避免这一点,往往将冷凝器和发生器做在一个容器内,将吸收器和蒸发器做在另一个容器内。 也可以将这四个主要设备置于一个壳体内,高压侧和低压侧之间用隔板隔开。 综上所述,溴化锂吸收式制冷机的工作过程可分为两个部分: (1)发生器中产生的冷剂蒸气在冷凝器中冷凝成冷剂水,经U形管进入蒸发器,在低压下蒸发,产生制冷效应。 这些过程与蒸气压缩式制冷循环在冷凝器、节流阀和蒸发器中所产生的过程完全相同; (2)发生器中流出的浓溶液降压后进入吸收器,吸收由蒸发器产生的冷剂蒸气,形成稀溶液,用泵将稀溶液输送至发生器,重新加热,形成浓溶液。 这些过程的作用相当于蒸气压缩式制冷循环中压缩机所起的作用。

应用氨为制冷剂时,常用的防护措施有哪些?

氨(NH3)是目前最广泛应用的中温制冷剂,在特殊凿井行业冻结工程中被大量使用。 氨蒸汽无色、具有强烈的刺激性臭味。 在标准状态下,密度为0.77kg/m2,对空气比重为0.5971,沸点—33.4℃,溶点—77.7℃。 氨在空气中爆炸极限为15~28%,在氧气中的爆炸极限为13.5~79%。 氨极易溶于水,呈碱性,1%水溶液的ph值为11.7左右。 氨属有毒类介质,毒性2级,对人的危害主要表现在对上呼吸道的刺激和腐蚀作用,直接接触高浓度氨时,接触部位可引起碱性化学灼伤,氨还可以引起呼吸道深部及肺部的损伤。 车间空气中氨的最高容许浓度为30 mg/m3,当氨蒸汽在空气中容积浓度达到0.5~0.6%时人在其中停留半小时即可中毒。 氨的上述性质决定了必须加强并落实对氨系统的安全技术措施,落实安全责任制,确保安全。 一、 安全意识与安全责任制 牢固树立安全为天的意识,建立处、项目部、班组三级安全体系,落实安全生产会制度、班前班后安全会等制度。 二、 安全装置与安全防护措施 制冷系统的安全运转除了依靠过硬的安装质量外,必备的安全装置也是必不可少的。 在制冷系统中须安装足够的氨压力表、安全阀、液面计、温度计等,有效且足够的安全装置能够准确监视系统运行工况(如压力、温度等),以便及时察觉制冷系统有无异常,并能在出现系统超压等异常情况时及时动作,避免发生事故。 需要指出的是上述表计必须进行定期校验,确保其在有效期内。 其他的安全防护措施还有: 1、 制冷设备上需安装压力继电器、压差继电器。 2、 监视冻结站内氨气浓度的氨气浓度检测仪,可在空气中氨气浓度超过规定含量时及时报警。 3、 针对氨气浓度比重比空气小的特点,泄漏的氨气易积聚于冻结站顶部,在冻结站屋顶处开设通风口。 4、 冻结站内应设有局扇,其排风能力要求每小时将室内空气更换不少于8次。 而且在室内室外都应装设按扭开关,配备事故电源,在紧急情况下能确保局扇工作。 5、 车间的门应向外开,并最少留有两个进出口,以保证安全。 6、 冻结站应配备带靴的防毒衣、橡皮手套、胶靴、管夹、氧气呼吸器等防护用具,妥善放置在机房进口的专用箱内,要专人管理、定期检查,确保使用。 专用箱在紧急情况下应能强行打开。 7、 冻结站须配备足够数量的二氧化碳或干粉或“1211”等灭火器材,已备扑灭油火、制冷剂火和电火。 三、 安全操作 要制定科学而合理的安全操作规程,并严格遵守执行。 所有冻安工均须持证上岗,确保安全操作。 1、 新安装的制冷系统,必须经过耐压试验、检漏、排污、抽真空,当确认系统无泄漏时,方可充灌制冷剂。 2、 像容器内充灌制冷剂时,阀门开启操作应缓慢进行,以免引起容器的脆性破坏。 3、 制冷系统中,存有液态制冷剂的管道设备,严禁同时将两端阀门关闭。 4、 为避免氨与空气混合遇明火发生爆炸,在冻结站和辅助设备间不能有明火,冬季严禁用明火取暖。 5、 检修设备和管道时,在制冷剂未抽空或未置换完全与大气接通的情况下,严禁拆卸设备进行焊接作业。 四、 事故救援与紧急救护 各项目部须编制事故应急救援预案,并报处审批后执行,必要时要进行演练。 项目部应配备专兼职医生,也2可与附近医院建立联系,保证在人员发生氨中毒时能够采取有效的急救措施。 冻氨工亦应掌握基本的急救措施。 项目部应备有硼酸水、凡士林以及其他必备的药品,以备急用。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐