在 Docker 容器中直接执行宿主机(host)命令需要特殊配置,因为容器默认与宿主机环境隔离。以下是几种实现方法:
nsenter
# 1. 挂载宿主机的根目录到容器(需特权模式)
docker run -it --privileged --pid=host -v /:/host ubuntu bash
# 2. 在容器内通过 chroot 访问宿主机环境
chroot /host bash -c "ls /usr/local" # 执行宿主机命令
docker exec
调用宿主机的 nsenter
# 1. 找到宿主机的 PID 1 进程(或 systemd 进程)
# 2. 在容器内安装 nsenter(若未内置)
apt-get update && apt-get install -y util-linux
# 3. 通过 nsenter 切入宿主机命名空间
nsenter --target 1 --mount --uts --ipc --net --pid -- bash -c "hostname"
# 1. 启动容器时挂载宿主机 SSH 密钥
docker run -v ~/.ssh:/root/.ssh -it alpine
# 2. 在容器内通过 SSH 执行命令
apk add openssh-client
ssh user@host.docker.internal "ls /tmp"
# 1. 挂载宿主机 Docker 套接字
docker run -v /var/run/docker.sock:/var/run/docker.sock -it alpine
# 2. 在容器内通过 docker 命令操作宿主机
apk add docker
docker run --rm -v /:/host alpine chroot /host ls /home
--privileged
和挂载 /
会完全突破容器隔离性,仅限可信环境使用。/var/run/docker.sock
)等同于赋予容器 root 权限。# 仅挂载需要的宿主机目录
docker run -v /usr/bin/docker:/usr/bin/docker -v /tmp:/host_tmp alpine \
sh -c "docker version && ls /host_tmp"
根据具体需求选择方法,优先考虑最小权限原则。