关于docker的问题

佬们请教一个问题,如果我手上只有一份docker-compose,启动后,我进入到容器了,大概是debian或者ubuntu,系统里是没有curl ping这些命令的,而且是在国内,如果我不改动dockerfile的情况下,有什么办法,可以快速的安装curl ping wget等等,或者类似的这样的工具,我也不太想用apt-update && apt-install 之类的,因为不同系统下面,命令也不同,redheat fedora,centos 等等,发行版是不同的,而且源也是国外的,下载也是非常漫长,另外一个是我也不想去改docker-compose 因为我觉得compose里, 只能加上command,本质上还是去执行apt-update…这样的命令,还是启动容器的时候去执行这样的命令的,可能还是装不上,所以是否有替代的工具,可以快速安装curl ping 这样的替代的命令,举个例子比如说系统起码有java环境,或者python环境node等等,这样,是否有什么黑科技,骚操作,等等这样的方案呢?

吼吼吼,@djyesu 佬已经给出了方案了 nsenter

1.首先找的容器在宿主机上的pid,在宿主机上执行
docker inspect --format ‘{{.State.Pid}}’ 091b9fd93bfb

458659 //假如说就是这个

2.在宿主宿主机上执行
sudo nsenter --target 458659 --net

这个时候,你就可以执行网络相关的命令了
ip addr 返回就是容器里的ip

curl
ping 等命令可以执行了,返回的都是容器的结果

2 个赞

从长久使用来看,肯定还是在Dockerfile中增加相关命令的安装脚本才是正解,其他的即时你在容器中能安装,那这个镜像换地方启动了,你不是还是没有你要的命令吗

1 个赞

我印象里没有,一般都是在本地测好然后打相应的镜像这样,并不会在打好的镜像上调试

非侵入式,我感觉没戏

可以用python写个脚本去下载busybox二进制包,busybox程序可以放在自己国内的服务器上,不知道这样是否可行

1 个赞

就是临时做些操作,就是看下网络,或者其他的,例如说代理是否在容器内有没有挂上,类似的临时操作

你现在的问题是基本的概念不对,Docker 要尽可能小所以不会附带额外的开发工具和环境。你没有说清楚你到底要做什么事情。如果是为了调试的话完全可以通过从外部调用的方式去做。如果是容器内的网络检查也可以保留原有容器,在 Compose 里加上自己的一个调试容器这样做不是吗?只要保证 Docker 在就行了,容器是个运行时重启之后你做的所有修改都会消失的。不太会有你描述这样的需求。

临时性的操作,我举个例子,我想知道 某个容器是否能访问到某个网络,临时做个验证

这个一般不需要怀疑的吧,只要配置没问题,环境网络啥的不会有错的,如果是集群部署的话,测试宿主节点ip的网络问题,可以单独起一个包好net-tools相关服务的容器,然后去这里面测试

不放心你可以挂个自己的容器上去,然后自己就可以随便玩了:

service:
  aaa:
  bbb:

原先的服务是 aaa 你新写的是 bbb 就可以了,保持网络配置类似就行

我是个人平时玩玩,例如说,我发现一个github上面的一个项目不错,有compose的部署方式,我就直接跑了,就想快速验证一下,他的功能,但是网络有时候可以不通,内网,外网,墙外,因为我自己玩的服务是在国内的

那这个你测试宿主机到服务网络就行了,都不要管容器内的

佬这个方案是可以的,自己的容器里走相同的网络配置,但是还是得有些改动成本,有些compose写的就比较复杂,不过这个确实是个方案

那肯定不一样的

1 个赞

可以尝试nsenter工具,本质是宿主机的工具使其运行在容器同一个cgroup下

2 个赞

佬这个方案确实也可以

1 个赞

刚刚看了一下busybox不带curl,你可以静态编一个curl或者wget,ping的话容器里应该都有的吧。这个方法比较偏门,也是我脑洞大开想出来的 :joy:

参考这个
静态编译OpenSSL和curl

1 个赞

看上去有些高级

启动命令那里,直接wget个二进制的curl ping wget的可执行文件进去。