Zabbix 监控中, 由于将 zabbix agent 封装到了 容器中, 容器脚本或程序需要执行宿主机命令,返回宿主机相关信息。
由于docker使用的是rancher中的托管模式,外部程序是没办法直接连接到容器中的,那么如何解决呢?

前提条件

  1. 将主机 /proc目录挂载到容器中 /proc:/host/:ro
  2. 运行docker的时候添加主机完全访问权限 --privileged

    示例

    ```bash __func() { docker run -itd \
    1. --name="ubuntu" \
    2. -v /proc:/host:ro \
    3. --privileged \
    4. ubuntu:20.04
    } __func
  1. <a name="EJL4S"></a>
  2. ## 容器内部执行宿主机命令
  3. <a name="PvpJU"></a>
  4. #### 执行宿主机常规命令
  5. 例如, 查看正在运行的容器列表
  6. ```bash
  7. nsenter --mount=/host/1/ns/mnt docker ps -a

获取网络信息需要指定 —net

  1. nsenter --mount=/host/1/ns/mnt --net=/host/1/ns/net ip a

执行包含文件路径的命令,需要将命令以文本形式传递到宿主机

  1. nsenter --mount=/host/1/ns/mnt bash -c 'rm -rf /tmp/rmdta'

在容器内删除自身容器

  1. nsenter --mount=/host/1/ns/mnt docker rm -f $(cat /proc/self/cgroup | grep devices | grep -Po '[0-9a-z]{64}' | cut -c1-12)

进入宿主机命令行模式

在容器内部设置命令行别名, 以便更便携的进入宿主机命令行模式

  1. alias host='nsenter --mount=/host/1/ns/mnt --net=/host/1/ns/net bash'

使用 Ctrl+D 或者 命令 exit 退出宿主机命令行模式