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

docker 容器内执行宿主机命令

  •  
  •   xiaochocking · 2018-11-28 17:07:17 +08:00 · 16381 次点击
    这是一个创建于 2182 天前的主题,其中的信息可能已经有所发展或是发生改变。
    事情就是用容器跑了一个 nodejs 网关,用来分发流量到其他几个后端接口容器,想在 nodejs 网关的前端配置页面就能执行宿主机脚本,以依次重启、更新接口容器的代码,相当于热重启了。有没有较优雅的方式实现,google 了几轮,都没有人这样做的吗?
    第 1 条附言  ·  2018-12-04 16:43:00 +08:00

    找到一个类似的做法

    6 creative ways to solve problems with Linux containers and Docker #Scenario 4

    e..这个也是只读

    32 条回复    2018-12-05 09:35:52 +08:00
    xiaochocking
        1
    xiaochocking  
    OP
       2018-11-28 17:08:08 +08:00
    自己回复一条骗大佬进来
    ChristopherWu
        2
    ChristopherWu  
       2018-11-28 17:10:09 +08:00
    @xiaochocking 宿主机起一个后端服务,接受 nodejs 网关的调用,从而执行宿主机脚本。
    cluulzz
        3
    cluulzz  
       2018-11-28 17:11:33 +08:00 via iPhone   ❤️ 1
    宿主跑 pm2
    你暴露了
    xiaochocking
        4
    xiaochocking  
    OP
       2018-11-28 17:13:10 +08:00
    @ChristopherWu 这样还有用 docker 跑 node 的必要吗..
    wfd0807
        5
    wfd0807  
       2018-11-28 17:16:32 +08:00
    应该不会有 docker 的原生解决方案
    shylockhg
        7
    shylockhg  
       2018-11-28 17:20:27 +08:00
    -v 不知道可以不
    Kilerd
        8
    Kilerd  
       2018-11-28 17:35:45 +08:00   ❤️ 1
    当然有啊。

    在 NodeJS Gateway 的 Docker 里面传入宿主机的 docker.sock 不就可以操作这台机子的所有 docker 容器了嘛
    NotNil1
        9
    NotNil1  
       2018-11-28 17:41:04 +08:00
    --privileged 试一试
    stebest
        10
    stebest  
       2018-11-28 17:43:49 +08:00
    直接挂载目录不行么
    xiaochocking
        11
    xiaochocking  
    OP
       2018-11-28 18:48:49 +08:00
    @Kilerd 这样能执行宿主机的 bash 吗

    @shylockhg @ljtletters @stebest 想要的效果是执行宿主机的 bash..
    jeffson
        12
    jeffson  
       2018-11-28 18:54:42 +08:00
    问题刁钻
    jinhan13789991
        13
    jinhan13789991  
       2018-11-28 18:57:10 +08:00 via Android
    可以啊,本机开启 SSH,docker 宿主机登录然后操作
    xiaochocking
        14
    xiaochocking  
    OP
       2018-11-28 18:57:53 +08:00
    @jeffson /doge
    xiaochocking
        15
    xiaochocking  
    OP
       2018-11-28 18:58:47 +08:00
    @jinhan13789991 查到有人是这样做的
    uoryon
        16
    uoryon  
       2018-11-28 19:02:07 +08:00
    @xiaochocking 你想执行宿主机的 bash,那就把 bash 以及 bash 操作的东西都能让这个容器访问到呀。
    zn
        17
    zn  
       2018-11-28 19:05:58 +08:00 via iPhone
    docker 一大功能,或者说亮点,就是防止这种事的发生………
    killadm
        18
    killadm  
       2018-11-28 19:06:38 +08:00
    ssh 进去
    mritd
        19
    mritd  
       2018-11-28 19:10:19 +08:00 via iPhone
    事实上,你本就不应该这么做
    mritd
        20
    mritd  
       2018-11-28 19:11:12 +08:00 via iPhone
    这个事是编排工具 或者 ci 做的,所以你会发现 google 没啥结果
    xiaochocking
        21
    xiaochocking  
    OP
       2018-11-28 19:36:02 +08:00
    @zn 感觉的确是反模式,除了需要执行宿主命令,还是挺适合在容器里跑的,所以才想找找方法
    gam2046
        22
    gam2046  
       2018-11-28 19:49:46 +08:00   ❤️ 2
    十分诡异的需求,docker 设计的目的就是为了资源隔离,结果你现在希望在容器中逃逸。

    你有这样的需求,你的 nodejs 就不应该在 docker 中运行,直接在宿主运行即可。

    如果你希望在 docker 中控制(启动、终止、创建、删除)其他容器,只需要将宿主环境下的 /var/docker/docker.sock 挂载到容器内即可。
    vakara
        23
    vakara  
       2018-11-28 22:05:43 +08:00 via Android   ❤️ 1
    挂宿主机 /proc 到容器 /host/proc,
    运行容器加 --privileged,
    然后容器里面通过 nsenter --mount=/host/proc/1/ns/mnt sh -c "ls /root" 这样执行。

    如果需要网络数据的话用 nsenter --net=/host/proc/1/ns/net sh ...
    vakara
        24
    vakara  
       2018-11-28 22:06:30 +08:00 via Android
    这个需求不诡异,一些监控功能的容器都是这样用的。
    yujincheng08
        25
    yujincheng08  
       2018-11-28 23:44:07 +08:00 via Android
    挂载目录,然后弄个管道。host 弄个监控教程 fork 然后执行命令?
    NotNil1
        26
    NotNil1  
       2018-11-29 09:53:11 +08:00
    @xiaochocking 可以的,我的可以
    julyclyde
        27
    julyclyde  
       2018-11-29 10:46:40 +08:00
    “用 docker ”是“穿上裤子再放那个本来应该光屁股的时候就放的屁”
    hotsymbol
        28
    hotsymbol  
       2018-11-30 00:46:25 +08:00
    到 Moby (原 Docker )提个 Issues 不就行了
    xiaochocking
        29
    xiaochocking  
    OP
       2018-12-04 16:20:53 +08:00
    @ljtletters   老哥你还做了什么步骤
    xiaochocking
        30
    xiaochocking  
    OP
       2018-12-04 16:32:39 +08:00
    @vakara  试了你那个方法 当我执行 touch 的时候 报 Read-only file system
    vakara
        31
    vakara  
       2018-12-04 22:58:59 +08:00 via Android
    @xiaochocking 你往哪里 touch 的?怎么执行的?
    xiaochocking
        32
    xiaochocking  
    OP
       2018-12-05 09:35:52 +08:00
    @vakara 就是你那句 nsenter --mount=/host/proc/1/ns/mnt sh -c "ls /root" ,list /root 改成 touch xxx
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3425 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 00:42 · PVG 08:42 · LAX 16:42 · JFK 19:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.