首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

容器管理利器:Web Terminal 简介

作者 | 黄超

杏仁运维工程师,关注容器技术和自动化运维。

一. 前言

在微服务大行其道的今天,容器恰巧又是微服务的主要载体,所以我们操作的对象也由最开始的「物理机」到「虚拟机」再到今天的「容器」。由于这些载体的变更,我们的使用方式也需要随之发生一些改变。比如一个最常用的登入操作,「虚拟机」下我们可能通过 ssh 的方式 ,但如果是容器呢?ssh 的方式就需要在每个容器中都运行一个 sshd 进程,这种做法可行但略显繁琐,也不太符合一个容器只运行一个进程的思想。那么有没有一个即方便快捷又安全的登入方式呢?有,通过 Web Terminal 的方式,通过 Web 的方式即可以避免对客户端的依赖又能够实现用户权限控制。目前,有很多开源的 Web Terminal 的项目,基本上都是通过 ssh 代理的方式调用并返回一个 shell 的虚拟终端(pty)。

二. 实现容器的 Web Terminal

2.1 架构图

2.2 前端 Web Termianl 页面Linux 终端返回的内容会带很多特殊的字符,比如我输入一个指令,终端返回的结果如下:

这样我们就需要自己做穷举处理了,这里推荐使用一款的模拟 Terminal 的 JavaScript 库xterm.js。这个库已经帮我们做了这些复杂操作。

可以看到它已经将这些特殊字符变成了红色:

2.3 调用 Docker Daemon API 返回 Shell 虚拟终端在平常的命令行操作下,我们经常会使用来模拟一个 Shell 的伪终端。在 Web Terminal 实现里,我们需要通过 API 调用的方式来实现同样的操作。当然,我们首先要确保 Docker Daemon 的远程调用是开启的。

先调用来创建一个 Exec。在调用时,需要指定,、和参数均为 true,Cmd 参数为,这样才能获得进程的标准输入输出和错误;

request:

如果调用成功,调用请求会返回该 Exec 的 ID,根据这个 ID 继续调用接口。在调用时,需要指定为 False,为 True,这样才会返回一个 HTTP 的 stream:

request:

response:

2.4 d-terminald-terminal 是这个系统的核心,它分成两个部分:

一部分用于处理用户端的输入和输出,以及存储和展示后端 Docker Dameon 主机的 IP 和 container_id。因为像这样的监控命令需要服务端定时推送数据给客户端,所以使用了 WebSocket 协议以支持服务端推送。

另一部分用于调用 Docker Daemon 返回虚拟终端。对于终端来说,通常是你输入一个字符就会立马返回,直到你输入一个 "归位键" 终端才会把你输入的字符拼接成一个字符串并发送给 shell 解释器,并将 shell 解释器的结果返回。为了提升使用流畅性,新启用了一个线程去调用 Docker Daemon API,当然也可以使用像 epoll 这样的多路复用技术来实现。

d-terminal 是使用 Python 实现的 Web 应用,核心代码如下:

三. 总结

上述仅仅是描述了一个最基本的实现,完全是为了抛砖引玉,后续可以通过在中间层添加一些扩展,比如,用户权限的分配,与自己环境中的容器编排引擎集成等,最终作为 Pass 平台的一个基础的组成部分。最后,上述的 demo 可去github具体查看。效果如下:

四. 参考

一种新的进入容器的方式: WebSocket + Docker Remote API : http://www.yunweipai.com/archives/10449.html

全文完

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180607G1II3Q00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券