Zabbix 监控中, 由于将 zabbix agent 封装到了 容器中, 容器脚本或程序需要执行宿主机命令,返回宿主机相关信息。
由于docker使用的是rancher中的托管模式,外部程序是没办法直接连接到容器中的,那么如何解决呢?
前提条件
- 将主机
/proc
目录挂载到容器中/proc:/host/:ro
- 运行docker的时候添加主机完全访问权限
--privileged
示例
```bash __func() { docker run -itd \
} __func--name="ubuntu" \
-v /proc:/host:ro \
--privileged \
ubuntu:20.04
<a name="EJL4S"></a>
## 容器内部执行宿主机命令
<a name="PvpJU"></a>
#### 执行宿主机常规命令
例如, 查看正在运行的容器列表
```bash
nsenter --mount=/host/1/ns/mnt docker ps -a
获取网络信息需要指定 —net
nsenter --mount=/host/1/ns/mnt --net=/host/1/ns/net ip a
执行包含文件路径的命令,需要将命令以文本形式传递到宿主机
nsenter --mount=/host/1/ns/mnt bash -c 'rm -rf /tmp/rmdta'
在容器内删除自身容器
nsenter --mount=/host/1/ns/mnt docker rm -f $(cat /proc/self/cgroup | grep devices | grep -Po '[0-9a-z]{64}' | cut -c1-12)
进入宿主机命令行模式
在容器内部设置命令行别名, 以便更便携的进入宿主机命令行模式
alias host='nsenter --mount=/host/1/ns/mnt --net=/host/1/ns/net bash'
使用 Ctrl+D 或者 命令 exit
退出宿主机命令行模式