gpt4 book ai didi

linux - 我可以在 docker 容器环境中运行主机命令吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:54 24 4
gpt4 key购买 nike

很多docker镜像没有ifconfigipps等基本命令。所以我想找到一种在 docker 容器环境中运行主机命令的方法,这样我就不需要将每个命令复制/打包到 docker 镜像。

我知道一个命令ip netns exec [ns] ifconfig,它可以在新的网络命名空间中运行命令ifconfig。 docker容器有类似的方法吗?

最佳答案

这个问题忽略了内核没有“容器”概念的事实——从它的角度来看,容器是一组不同的抽象(不同的命名空间、cgroup 等)。在主机上拥有足够的权限,您可以独立管理这些抽象(例如,输入容器的任何单个命名空间,或其中的几个)。也就是说,问题的完整答案取决于“在容器中执行主机的二进制文件”是什么意思(您想在容器的所有 命名空间中执行此二进制文件,还是仅在重要的,哪些会影响您想要获得的结果?)。

从技术上讲,您可以在容器的命名空间(mnt 命名空间除外)内执行任意主机的二进制文件,而无需将此二进制文件复制或安装到容器的文件系统中。根据您要实现的目标,它可能会或可能不会解决您的问题。

例如,在仅进入容器的 net 命名空间后执行一些 ip 操作可能会得到预期的结果:

$ sudo nsenter -t $CONTAINERIZED_PROCESS_PID -n ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
33: eth0@if34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0

来自主机的命令在容器的网络命名空间中执行并正确显示其网络接口(interface)。

或者您可以在容器的 UTS 命名空间内执行 hostname 二进制文件来获取正确的容器主机名:

$ sudo nsenter -t $CONTAINERIZED_PROCESS_PID -u hostname
d65269ecf908

但是,在进入容器的 pid 命名空间后执行 ps 不会为您提供容器进程的列表,而是您能够访问的所有进程的列表从主机上看,因为 ps/proc 获取信息,所以要查看正确的进程集,您必须输入容器的 mnt命名空间(这反过来会让您无法运行主机二进制文件,因为您将不再看到它们)。

也就是说,这实际上取决于您想执行什么以及您希望获得什么结果。

关于linux - 我可以在 docker 容器环境中运行主机命令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52887763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com