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

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

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

    表达能力有限,起了一个奇怪的标题 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   ·   实用小工具   ·   3438 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:32 · PVG 19:32 · LAX 03:32 · JFK 06:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.