V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Riesling
V2EX  ›  问与答

如何远程管理运行中的 docker container?

  •  
  •   Riesling · 2023-06-17 06:53:17 +08:00 · 2305 次点击
    这是一个创建于 525 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我开发了一个基于 Ubuntu 的 docker 在公司内供同事使用. 我怎么才能知道有多少 container 正在运行, 宿主 IP, 并且可以 ssh 到目标 container 来远程管理? 能在公司内局域网实现就可以. 谢谢

    24 条回复    2023-06-18 20:07:34 +08:00
    enki0423
        1
    enki0423  
       2023-06-17 07:00:13 +08:00 via iPhone
    如果你说的是你的同事们在自己的工作电脑上运行 container ,那么是很难实现你的需求的。

    你需要的可能是一个 k8s 集群,每个开发按需使用。
    ltkun
        2
    ltkun  
       2023-06-17 07:00:16 +08:00 via Android
    gui 的管理工具吗 随便用用就 portainer 吧
    Riesling
        3
    Riesling  
    OP
       2023-06-17 07:19:28 +08:00
    @enki0423 是他们自己的电脑. 我希望每个运行的 container 都能向我报告运行信息, 并且允许我 ssh 登录管理. k8s 集群什么的太高大上了, 我原以为在 docker image 里面添加一个后台运行的自动启动脚本就行了呢
    @ltkun 不用 GUI, 不怕简陋, 实现功能就好. 我甚至想我发个什么指令, 然后所有运行中的 container 都给我发个 email 都行. 如果开放 ssh 太难了那我就人工顺着 IP 摸过去. 关键是 container 是后台运行的, 同事也不知道谁的在跑
    ltkun
        4
    ltkun  
       2023-06-17 07:23:58 +08:00 via Android
    那就 docker 命令行解决啊 是管理员啥都能干
    liantian
        5
    liantian  
       2023-06-17 07:57:18 +08:00
    我做过一个类似的事情....

    我们信息安全处要求开发环境也全都有杀毒、HIDS 、审计等....

    解决方法是用 Red Hat Universal Base Image 8 Init 简写 ubi8/ubi-init 的基础容器,装好对应的软件和权限设置后,做为开发环境的 base ,如果你还想登陆进去,那就装个 openssh 罢了...
    ktblack
        6
    ktblack  
       2023-06-17 08:15:22 +08:00 via Android
    所有电脑加入 docker swarm ,然后 swarm 模式部署一个 portainer ,这样是否可行
    gux928
        7
    gux928  
       2023-06-17 08:42:31 +08:00 via iPhone
    你在下个版本的 image 中实现一个脚本,定时发消息,你这接收。
    happyn
        8
    happyn  
       2023-06-17 09:18:08 +08:00
    可以部署一个公共的 fluentd ,接收 log 转发到一个后端,可以存为文件什么的;

    比如部署了一个 fluentd 服务器: 10.x.x.x:24224

    然后要求每个 docker 容器运行的时候,把 log 发送到这个 fluentd 服务器;

    docker run ..... --log-driver=fluentd --log-opt fluentd-address=10.x.x.x:24224


    之后写个小脚本每天分析一下 log 就好了;
    happyn
        9
    happyn  
       2023-06-17 09:27:55 +08:00
    上面方法的优点:

    1. 可扩展性强,不论有多少容器,只要启动的时候加上这个参数,就无缝记录这个容器所有日志
    2. fluentd 后端可以输出到 ES ,文件, syslog ;各种折腾都可以
    3. 不用改 image
    4. 只要部署一次,以后基本上就不用维护了
    5. 没啥依赖,fluentd 也是个容器,启动就完了;

    缺点:
    1. 还是有点部署的工作量的
    2. 所有容器启动都得带那个参数才行
    happyn
        10
    happyn  
       2023-06-17 09:29:38 +08:00
    不过您这个 ssh 登录容器,估计是不行的;而且把 docker 容器开启 ssh 也很奇怪;
    Magentaize
        11
    Magentaize  
       2023-06-17 09:32:22 +08:00
    在同事电脑里用 docker 跑一个 portainer agent
    Riesling
        12
    Riesling  
    OP
       2023-06-17 10:43:48 +08:00
    @gux928 对对,这种怎么实现呢?最基本的能定时汇报宿主 IP 就行
    anubu
        13
    anubu  
       2023-06-17 11:47:57 +08:00
    - 上报宿主 IP 。可以通过日志或者内置 crontab 定时 curl 一个地址,分析访问日志
    - 远程登录容器。首先,要有远程登录服务,如镜像中安装 ssh server 。其次,要解决网络问题。容器不向宿主映射 ssh 端口的话,你是登录不了的。一般会考虑容器主动向服务端发起连接,如 ssh 的反向代理隧道。也可以考虑 mesh 网络一类的自组网络,比如镜像内置 tailscale 。
    以上都是自己手搓的话一些可能的方向,整体上是要实现一个远程控制管理的服务端和客户端。条件允许的话,现成的 swarm+portainer 应该更合适。
    dann73580
        14
    dann73580  
       2023-06-17 14:54:39 +08:00
    不怕恶心的话你甚至可以继承个哪吒探针在 docker 里,我看有人这么做了🌝🌝
    lovelylain
        15
    lovelylain  
       2023-06-17 16:58:32 +08:00 via Android   ❤️ 1
    意思就是想在 image 里埋个后门程序,什么后门程序合适?
    louisxxx
        16
    louisxxx  
       2023-06-17 17:07:11 +08:00
    直接给你所有同事电脑装个飞鸽子吧
    louisxxx
        17
    louisxxx  
       2023-06-17 17:08:32 +08:00
    直接给你所有同事电脑装个灰鸽子
    kgcHQbTYyvcz2w3j
        18
    kgcHQbTYyvcz2w3j  
       2023-06-17 18:29:25 +08:00
    docker context
    hicdn
        19
    hicdn  
       2023-06-17 20:34:59 +08:00 via Android
    下一步就分布式挖矿了?
    amlee
        20
    amlee  
       2023-06-17 21:24:29 +08:00
    我怎么感觉这问题,这需求这么奇怪呢。楼上还一本正经回答?
    xbleey
        21
    xbleey  
       2023-06-17 23:47:35 +08:00 via iPhone
    放开 10250 端口用 socket 不行了吗
    Riesling
        22
    Riesling  
    OP
       2023-06-18 11:48:13 +08:00
    不知道为啥有不少人怀疑我装后门或者挖矿啥的, 真有很多这么干的吗? 就我公司 20 几人, 平均 Intel 7 代 CPU, 一共两块 GTX1070 就是最顶级 GPU, 就算全员挖矿也是赔钱. 我甚至不是搞专业写软件的, 就写了个测试工具, 但是安装比较麻烦才使用 docker 分发. 结果同事总是忘了关闭不用的 container, 占用网络资源. 我最终目的就是 “顺着网线把他们的 container 关了, 至少停掉 container 里面运行的程序”
    感谢 @happyn @anubu 我研究一下怎么弄
    很多提到 swarm 的各位对不起, 这对我一个外行太难了
    yinmin
        23
    yinmin  
       2023-06-18 15:53:36 +08:00
    你的电脑要是用固定 IP 地址,你在你的电脑的 Docker 上安装 portainer ,然后 Environments - Add environment - Docker Standalone - Edge Agent Standard 配置你的电脑 IP 和客户端名称,portainer 会生成一个 docker run 的容器安装命令,你在你同事的机器运行这条 docker run 命令安装客户端,之后你能在自己的 portainer 上管理所有人的 docker 了。
    fox0001
        24
    fox0001  
       2023-06-18 20:07:34 +08:00 via Android
    如果只是获取各个电脑上的 Docker 容器的运行情况,不用 ssh 进去的话,可以考虑系统监控的那一套。比如 Prometheus 、InfluxDB 、Zabbix 等方案。

    比如 InfluxDB 的话,可以在“镜像”装上 telegraf ,找个大家都可以访问的电脑部署 influxdb 。所有 docker 容器都运行 telegraf ,抓取运行数据,并发送到 influxdb 。然后可以使用 influxdb 的图表,或者装个 Grafana ,展示各个 Docker 容器的运行情况。

    Zabbix 是个整体解决方案,应该更容易部署和管理。

    Prometheus 跟 InfluxDB 类似,但采用拉数据的形式。就是各个容器暴露个端口,Prometheus 定时去访问并抓取数据。数据展示就是使用 Grafana 。据说这个更适合管理一堆容器。但我没玩过。

    如果各个容器都跑了 ssh 服务,可以使用 next-terminal 这样的管理系统。可以显示是否在运行、一键 ssh 进去等,更多的状态不知道能否获取。其项目:
    https://github.com/dushixiang/next-terminal
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1092 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 23:25 · PVG 07:25 · LAX 15:25 · JFK 18:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.