[我管我自己] jenkins 在 docker 容器里管理多个 docker 容器? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
div class="sep20">
easterfan
V2EX    问与答

[我管我自己] jenkins 在 docker 容器里管理多个 docker 容器?

  •  
  •   easterfan 2020-12-13 19:22:00 +08:00 2817 次点击
    这是一个创建于 1842 天前的主题,其中的信息可能已经有所发展或是发生改变。

    表达能力有限,起了一个奇怪的标题 QAQ~(望 V 友们海涵 QAQ~)

    太嗦不看版: ** 用 docker 安装的 jenkins 怎样调用物理机上的 docker-compose 命令?**

    嗦版:

    1. 有一台装了 dockerdocker-compose 的 ubuntu 服务器(很奇怪,mac 和 windows 安装的 docker 自带 docker-compose, 服务器端 docker 安装完后,还需要单独安装 docker-compose,通过apt install docker-compose安装,物理机上通过 /usr/bin/docker-compose up -d命令可启动)

    2. 下载 jenkins 镜像并启动,docker pull jenkinsci/blueocean,
      启动命令:

    docker run -d --restart=always --name=my_jenkins -p 8089:8080 -p 50001:50000 -v /root/data/jenkins_home:/var/jenkins_home --user root --privileged -v /var/run/docker.sock:/var/run/docker.sock a1a26454c4cd 

    加上 --privileged -v /var/run/docker.sock:/var/run/docker.sock 参数是为了让身处容器内的 jenkins 能够调用物理机中的 docker 命令~

    1. 但是这样一顿操作后,jenkins 可以执行物理机的 docker 命令,执行到 docker-compose 命令就直接显示无法找到 docker-compose

    各种搜索发现大多是用 docker-compose 管理 jenkins 容器的回答,对于用 jenkins 容器调用 docker-compose 命令这种场景很少~可能我这种用 jenkins 容器启动 docker-compose 的思路不对~

    转念一想,docker 既然已经提供 -v /var/run/docker.sock:/var/run/docker.sock方式允许一个容器调用物理机的docker命令,可能也会允许一个容器通过调用物理机的 docker-compose 命令来管理多个容器,难就难在找不到把物理机 docker-compose 命令映射到 jenkins 容器的路子~

    感谢大佬们指点迷津!!!

    15 条回复    2020-12-15 11:25:24 +08:00
    Mystery0
        1
    Mystery0  
       2020-12-13 19:25:13 +08:00 via Android
    docker-compose 不是要单独装吗,Jenkins 容器里面有装 docker-comppse ?
    kozzzx
        2
    kozzzx  
       2020-12-13 19:34:05 +08:00 via iPhone
    我的解决方法是把宿主机中安装的 docker-compose 也映射进 Jenkins 的容器中 `-v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose`
    easterfan
        3
    easterfan  
    OP
       2020-12-13 19:37:31 +08:00
    @Mystery0 docker-compose 装在物理机里了,想让 jenkins 容器直接调用物理机的 docker-compose,话说 docker 容器里还可以装 docker-compose 呀~我真不知道 QAQ (也没搜索到)~
    easterfan
        4
    easterfan  
    OP
       2020-12-13 20:30:28 +08:00
    @kozzzx 感谢回复!
    刚刚试了一下,物理机是 ubuntu 20,docker-compose 的安装路径是 `/usr/bin/docker-compose`,所以我用
    `-v /usr/bin/docker-compose:/usr/local/bin/docker-compose` 做了映射,进入 jenkins 容器查看`/usr/local/bin/docker-compose`这个文件,是一个 python 脚本,但是因为 jenkins 容器里没有 python3 环境,执行到这一行的时候抛出了找不到 python3 的报错~

    我在想这样直接把 `docker-compose` 文件映射到容器内运行时是有问题的,还需要把物理机的 python3 环境也给映射过来~~

    但显然如果再把 python3 映射进来就背离了映射的初衷了~

    还是很感谢您的思路,如果您对这个问题感兴趣的话,希望能和您进一步交流!

    ![]( https://cdn.jsdelivr.net/gh/easterfan/picgo/blingbling/2020/20201213201623.png)
    Mystery0
        5
    Mystery0  
       2020-12-13 23:48:57 +08:00 via Android
    @easterfan 我最开始用 docker-compose 跑 Jenkins 时候的做法是把宿主机作为一个 slave 运行,单独用来跑这种需要执行对运行的容器做操作的事情。其实我之前的意思是容器里面应该没有 docker-compose 这个运行文件,所以提示 not found
    Mystery0
        6
    Mystery0  
       2020-12-13 23:49:46 +08:00 via Android
    @easterfan 也不一定把 vi 的步骤也丢到宿主机,可以在 Jenkins 里面跑 ci,然后到 cd 的步骤的时候 ssh 到宿主机去执行脚本
    Mystery0
        7
    Mystery0  
       2020-12-13 23:50:10 +08:00 via Android
    @Mystery0 修正,第一 vi 打错了,是 ci
    Jirajine
        8
    Jirajine  
       2020-12-14 00:05:27 +08:00 via Android
    映射 docker.sock 不是为了让容器调用宿主机的 docker 命令,而是为了让容器能直接访问跑在宿主机上的 docker daemon 服务。
    而 docker-compose 是编排容器的,你可以理解为 docker-compose 命令、docker 命令、jenkins 是同类软件,都是和 docker daemon 服务交互的客户端。

    所以正确的做法是把你的构建过程用 jenkins 的写法写出来,如果非要调用其他命令那就额外安装。
    kozzzx
        9
    kozzzx  
       2020-12-14 02:21:48 +08:00
    看了下服务器上 /usr/local/bin/docker-compose 是一个二进制文件。你可能是通过 pip 安装的,所以是个 Python 脚本。
    我是根据官方教程中的这个步骤使用 curl 安装的( Install Compose on Linux systems ):
    https://docs.docker.com/compose/install/
    swulling
        10
    swulling  
       2020-12-14 07:55:48 +08:00 via iPhone
    映射 docker.sock 后容器里安装 docker-compose
    dier
        11
    dier  
       2020-12-14 09:47:59 +08:00
    如果你最终调用 docker-compose 编排的容器是在宿主机上跑而不是在你那个 jenkins 容器里跑,那就把宿主机当做一台 slave 来用,通过 SSH 从 jenkins 中远程到宿主机,执行 docker-compose 来启动容器
    dier
        12
    dier  
       2020-12-14 09:50:03 +08:00
    至于在容器里运行容器,这个操作,理论上是可行的,但肯定不是最合适的
    passerbytiny
        13
    passerbytiny  
       2020-12-14 10:04:16 +08:00 via Android
    docker 是 C/S 架构,你得 docker 命令、docker-compose 、物理机,全部是客户端,docker 容器是运行在服务端的。

    jenkins docker 方式,创建了两个容器,一个是作为服务端的 docker in docker,一个是作为客户端的 jenkins 自身。你物理机上的 docker-compose,跟 jenkins 是不同的客户端,当然是不能相互使用的。
    Win78
        14
    Win78  
       2020-12-14 23:04:54 +08:00
    看了描述,以前遇到过类似的问题,因为 docker 安装方式有问题。我是用云服务器直接生成一个自带 docker 的云服务器(如果支持的话)解决了这个问题。

    手动用 apt install docker-compose,安装的 docker-compose 是个 python 文件,用楼上提供的命令 `-v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose` 映射后,进入到 jenkins 容器里运行 docker-compose 命令对比一下(理论上如果 docker-compose 命令调用成功,你的 jenkins 在执行到对应的脚本的时候应该是过的)

    不过生产实践中,通常不会把 jenkins 放在容器里,我们通常直接将 jenkins 装在物理机中单独做一个 jenkins 服务器,jenkins 打包编译过程对一些大模块项目是非常吃服务器性能的,装在物理机中方便监测 CPU 和 硬盘读写

    #PS 刚巧看到你买过我家的橙子,疫情艰难,渠道商压价严重,借楼给自家脐橙打个广告,望楼主海涵
    julyclyde
        15
    julyclyde  
       2020-12-15 11:25:24 +08:00
    本来好好的,你特地加一层,然后解决了其它做法不存在的问题
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     881 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 21:48 PVG 05:48 LAX 13:48 JFK 16:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86