V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
edis0n0
V2EX  ›  程序员

不依赖 docker cli,只有一个/var/run/docker.sock,有办法用 Python 重启指定容器吗?

  •  
  •   edis0n0 · 2022-09-23 01:09:32 +08:00 · 2137 次点击
    这是一个创建于 792 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求是第二个容器暴露一个 API ,其它设备可以通过调用第二个容器的 API 随时重启第一个容器。类似 <https://stackoverflow.com/questions/56239199/restart-a-docker-container-from-another-running-container> 这个场景,找到的教程都是要在第二个容器装 docker cli 。我觉得太重了,] 有办法用 python 脚本直接重启吗?

    (感觉肯定是有办法,但 google 找不到,但不会写 go ,不太想看 docker cli 的代码,只想调别人的轮子)
    18 条回复    2022-09-23 23:06:27 +08:00
    dangyuluo
        1
    dangyuluo  
       2022-09-23 01:13:02 +08:00
    dangyuluo
        2
    dangyuluo  
       2022-09-23 01:13:29 +08:00
    Jirajine
        3
    Jirajine  
       2022-09-23 01:30:09 +08:00
    https://docker-py.readthedocs.io/en/stable/
    当然,之前版本的 docker-compose 就是 Python 写的,自然不缺 docker api 的 SDK 。
    edis0n0
        4
    edis0n0  
    OP
       2022-09-23 01:37:19 +08:00
    @Jirajine #3 对,想找的就是这个,docker.from_env().get("container1_name").restart() 感觉一行代码就够。
    MengiNo
        5
    MengiNo  
       2022-09-23 01:52:11 +08:00 via Android
    之前看过一个在 php 容器里随时重启 nginx 容器。大概是通过 --pid 的方式让 nginx 容器与 php 容器共享一部分 proc 信息,这样两个容器内 ps 出来的内容就是一模一样的。然后只要在 php 容器里 pkill 掉 nginx 的进程,nginx 容器就会因为 "1 号进程" 没了而重启。 虽然有点暴力但是好像可以实现 op 要的效果。 但是缺点是一旦 php 容器停了,则会导致两个容器就一起停掉。
    neilp
        6
    neilp  
       2022-09-23 06:36:03 +08:00 via iPhone
    可以, 用 curl 直接 post 就可以。 Restful 的 api
    rrfeng
        7
    rrfeng  
       2022-09-23 07:35:13 +08:00 via Android
    第二个容器启动时把主机上的 docker cli 和 sock 映射进去就行了。不用单独安装。

    这才是标准方式。
    julyclyde
        8
    julyclyde  
       2022-09-23 08:23:21 +08:00
    1 按说,容器就没有重启这一说法吧。内容应该都复原了,其实是销毁另建?
    2 用 HTTP 协议访问那个 sock 就行了

    0 你的需求是“暴露一个 API”似乎并不是说暴露 dockerd sock 吧?
    zliea
        9
    zliea  
       2022-09-23 09:19:10 +08:00
    docker 需要监听 2375 端口,可以在 systemd 文件 ExecStart 添加-H tcp://0.0.0.0:2375
    然后就可以使用 docker api 了。
    edis0n0
        10
    edis0n0  
    OP
       2022-09-23 10:29:18 +08:00
    @julyclyde 我的场景是容器 1 的服务运行时会缓存一些内容,restart 就没了,需要做一个 HTTP API 给后台调用重启。
    julyclyde
        11
    julyclyde  
       2022-09-23 10:55:43 +08:00
    @edis0n0 这个调用是为了预热填充,还是为了主动让它失效?
    alexsunxl
        12
    alexsunxl  
       2022-09-23 10:57:12 +08:00
    @zliea 你这个有点误导了。 通过 socket 也是可以 connenct dockerd 的,不需要端口的。
    edis0n0
        13
    edis0n0  
    OP
       2022-09-23 10:57:12 +08:00
    @julyclyde 为了主动让它失效
    julyclyde
        14
    julyclyde  
       2022-09-23 10:57:59 +08:00
    @edis0n0 这个需求我觉得在缓存管理方面实现比较好啊。整体重启可能代价有点高
    ragnaroks
        15
    ragnaroks  
       2022-09-23 11:22:11 +08:00
    my3157
        16
    my3157  
       2022-09-23 20:57:26 +08:00 via Android
    mount docker cli 和 sock 进去,想干啥干啥,
    noparking188
        17
    noparking188  
       2022-09-23 22:43:28 +08:00
    @edis0n0 #10 不重启容器里的服务,而是选择重启容器,是因为考虑实现更简单吗?
    edis0n0
        18
    edis0n0  
    OP
       2022-09-23 23:06:27 +08:00
    @noparking188 #17 是
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1061 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:05 · PVG 03:05 · LAX 11:05 · JFK 14:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.