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

Linux 我可以在docker容器环境中运行主机命令吗?,linux,docker,Linux,Docker,许多docker映像没有基本命令,例如ifconfig、ip、ps等。 所以我想找到一种在docker容器环境中运行主机命令的方法,这样我就不需要将每个命令复制/打包到docker映像 我知道一个命令ip netns exec[ns]ifconfig,它可以在新的网络名称空间中运行命令ifconfig。docker容器有类似的方法吗 这个问题忽略了一个事实,即内核没有“容器”的概念——从它的角度来看,容器是一组不同的抽象(不同的名称空间、cgroup等)。在主机上拥有足够的权限后,您可以独立地管

许多docker映像没有基本命令,例如
ifconfig
ip
ps
等。 所以我想找到一种在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
但是,在输入容器的
pid
名称空间后执行
ps
,不会给出容器进程的列表,而是可以从主机看到的所有进程的列表,因为
ps
/proc
获取信息,因此,要查看正确的进程集,您必须输入容器的
mnt
名称空间(这反过来会使您无法运行主机二进制文件,因为您将不再看到它们)


这就是说,这实际上取决于您想要执行什么以及您想要得到什么结果。

请稍等。如果您想要在主机上运行
ip
命令,您可以通过ssh从docker容器登录到主机。如果您只想运行
ip
,请根据docker容器的分发情况,使用您最喜欢的PackageManagerTM将其安装到docker容器上,例如,apt get install net tools for debian,apk add iproute2 for Alpine,这不是编程问题,可能更多属于unix.stackexchange.com
$ sudo nsenter -t $CONTAINERIZED_PROCESS_PID -u hostname
d65269ecf908