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

2020-12-13 19:22:00 +08:00
 easterfan

表达能力有限,起了一个奇怪的标题 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 容器的路子~

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

1971 次点击
所在节点    问与答
15 条回复
Mystery0
2020-12-13 19:25:13 +08:00
docker-compose 不是要单独装吗,Jenkins 容器里面有装 docker-comppse ?
kozzzx
2020-12-13 19:34:05 +08:00
我的解决方法是把宿主机中安装的 docker-compose 也映射进 Jenkins 的容器中 `-v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose`
easterfan
2020-12-13 19:37:31 +08:00
@Mystery0 docker-compose 装在物理机里了,想让 jenkins 容器直接调用物理机的 docker-compose,话说 docker 容器里还可以装 docker-compose 呀~我真不知道 QAQ (也没搜索到)~
easterfan
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
2020-12-13 23:48:57 +08:00
@easterfan 我最开始用 docker-compose 跑 Jenkins 时候的做法是把宿主机作为一个 slave 运行,单独用来跑这种需要执行对运行的容器做操作的事情。其实我之前的意思是容器里面应该没有 docker-compose 这个运行文件,所以提示 not found
Mystery0
2020-12-13 23:49:46 +08:00
@easterfan 也不一定把 vi 的步骤也丢到宿主机,可以在 Jenkins 里面跑 ci,然后到 cd 的步骤的时候 ssh 到宿主机去执行脚本
Mystery0
2020-12-13 23:50:10 +08:00
@Mystery0 修正,第一 vi 打错了,是 ci
Jirajine
2020-12-14 00:05:27 +08:00
映射 docker.sock 不是为了让容器调用宿主机的 docker 命令,而是为了让容器能直接访问跑在宿主机上的 docker daemon 服务。
而 docker-compose 是编排容器的,你可以理解为 docker-compose 命令、docker 命令、jenkins 是同类软件,都是和 docker daemon 服务交互的客户端。

所以正确的做法是把你的构建过程用 jenkins 的写法写出来,如果非要调用其他命令那就额外安装。
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
2020-12-14 07:55:48 +08:00
映射 docker.sock 后容器里安装 docker-compose
dier
2020-12-14 09:47:59 +08:00
如果你最终调用 docker-compose 编排的容器是在宿主机上跑而不是在你那个 jenkins 容器里跑,那就把宿主机当做一台 slave 来用,通过 SSH 从 jenkins 中远程到宿主机,执行 docker-compose 来启动容器
dier
2020-12-14 09:50:03 +08:00
至于在容器里运行容器,这个操作,理论上是可行的,但肯定不是最合适的
passerbytiny
2020-12-14 10:04:16 +08:00
docker 是 C/S 架构,你得 docker 命令、docker-compose 、物理机,全部是客户端,docker 容器是运行在服务端的。

jenkins docker 方式,创建了两个容器,一个是作为服务端的 docker in docker,一个是作为客户端的 jenkins 自身。你物理机上的 docker-compose,跟 jenkins 是不同的客户端,当然是不能相互使用的。
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
2020-12-15 11:25:24 +08:00
本来好好的,你特地加一层,然后解决了其它做法不存在的问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/735030

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX