V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
cy97cool
V2EX  ›  奇思妙想

有没有 ssh 与 docker 结合的方式

  •  
  •   cy97cool · 2018-02-02 23:30:24 +08:00 via Android · 4126 次点击
    这是一个创建于 2477 天前的主题,其中的信息可能已经有所发展或是发生改变。
    考虑这种情景: 老师给一大群学生 linux 账号,但想在保证隔离的基础上给 root 权限随意玩耍,比较适合用 docker

    但如果直接用 docker 的话每个学生即使不登录容器,容器也要对外映射一个 ssh 端口,整个容器就一个 sshd 进程;假如有 100 个学生就有 100 个 sshd 进程,和 100 条端口映射规则。看起来挺浪费内存资源的

    想到能不能改写 ssh,还是通过用户名+密码或用户名+私钥登录,但登录后不是进入这个用户的 bash,而是进入该用户对应的容器 root bash,如果容器没启动就启动起来。

    最好还能做到用户退出所有 sshd 后 1 小时后就关闭容器

    问问这个想法有没有已经实现了的开源项目
    16 条回复    2018-02-04 16:24:02 +08:00
    hxsf
        1
    hxsf  
       2018-02-02 23:33:59 +08:00 via iPhone   ❤️ 1
    试试把登录的 shell 改成 docker run -it --rm alpine sh ?
    hxsf
        2
    hxsf  
       2018-02-02 23:39:10 +08:00 via iPhone   ❤️ 1
    上面的方案我没试过,不过可行性有的

    不过我做过 用 webssh + docker 的方式 可以达到你的目的
    msg7086
        3
    msg7086  
       2018-02-02 23:42:57 +08:00   ❤️ 1
    没玩过这种,但是可以提供一些思路。

    authorized_keys 里可以指定承接连接的命令,看看能不能直接直通到 tty ?

    sshd 进程本来就不大,而且都是相同二进制文件,内存数据可以共享。而且一个 sshd 才吃不到 10M 内存,开 100 个也没 1G,我觉得为了省 1G 内存去折腾那么多东西太浪费时间了。
    cy97cool
        4
    cy97cool  
    OP
       2018-02-02 23:48:51 +08:00 via Android
    @msg7086 内存确实不算个问题
    主要是会导致 docker ps 看着不爽
    am241
        5
    am241  
       2018-02-02 23:52:12 +08:00
    100 个 sshd 进程占用的内存应该比单个 sshd 进程占用内存的 100 倍要小吧
    billwsy
        6
    billwsy  
       2018-02-03 00:17:02 +08:00 via iPhone   ❤️ 1
    billwsy
        7
    billwsy  
       2018-02-03 00:23:01 +08:00 via iPhone   ❤️ 1
    其实我自己还写过一个脚本,也可以作为 login shell。但是应用场景不一样(假设用户是善良的,用户有 docker 组权限)。第一次登录的时候自动创建容器,自动 mount 主目录,以用户的 uid 运行,但是允许不需要密码 sudo,后面登录的时候重用该用户之前创建过的容器,最后脚本也就百来行。
    julyclyde
        8
    julyclyde  
       2018-02-03 09:19:36 +08:00
    linode console 那种嘛,呵呵
    自己做个 shell 或者 authorized_keys 里指定 command,然后直接接管登录后的用户
    rrfeng
        9
    rrfeng  
       2018-02-03 09:50:48 +08:00   ❤️ 1
    最简单的办法:

    bashrc 里写 docker run -it ....

    只要登录就切入进去了。除非起不来~也可以写上起不来就退出。没啥毛病。
    xuanyuanaosheng
        10
    xuanyuanaosheng  
       2018-02-03 09:59:05 +08:00 via Android
    希望楼主找到好的办法 @我一下,感觉会有用
    cy97cool
        11
    cy97cool  
    OP
       2018-02-03 11:05:48 +08:00
    @xuanyuanaosheng 6L 给的看起来不错
    kaneg
        12
    kaneg  
       2018-02-03 12:42:45 +08:00 via iPhone   ❤️ 1
    你可以看看这个: https://github.com/kaneg/httpshell
    不是完全与你的需求相符,但只需要一个端口就可以了,你可以参考下
    artandlol
        13
    artandlol  
       2018-02-03 13:01:59 +08:00 via iPhone   ❤️ 1
    这里之前的 coding.net 的开发者开源了一个 websocket 版的,支持 docker,安装起来也快。叫 ttyd,映射到浏览器的。支持开放特定程序。
    另你是没有见过成千上万个同一进程的吗
    xuyl
        14
    xuyl  
       2018-02-03 16:40:06 +08:00
    貌似实验楼就是这么干的
    hu6360567
        15
    hu6360567  
       2018-02-04 14:01:35 +08:00 via Android
    OpenVZ 啊
    xuanyuanaosheng
        16
    xuanyuanaosheng  
       2018-02-04 16:24:02 +08:00 via Android
    @cy97cool 好的 谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1577 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 17:12 · PVG 01:12 · LAX 09:12 · JFK 12:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.