dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币13236枚
  • 威望5838点
  • 银元150个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
阅读:1038回复:0

[php] 获取docker 容器IP与主机名

楼主#
更多 发布于:2017-03-06 14:45
目标
获取 docker swarm 环境下的容器信息,包括IP,名称,宿主机,三个字段;
最后汇总并输出 Redmine wiki的文本格式(Textile);

环境
docker / swarm 参考这里

代码
cat container.php
<?php

// 获取容器ID
function getId($file) {
    
    // 调用系统命令
    passthru("docker -H 192.168.150.201:3375 ps -q > $file");
    
    // 判断文件是否存在
    if(file_exists($file) === FALSE) {
        die("Error Cant't open $file !!");
    }
    
    // 文件内容存入数组
    $array = file($file);

    // 返回数组
    return $array;
}

// 获取容器内容
function getCont($id,$file) {
  
    // 删除末尾特殊字符
    $mid = rtrim($id);
      
    // 调用系统命令
    passthru("docker -H 192.168.150.201:3375 inspect $mid > $file");
    
    // 转换成字符串
    $string = file_get_contents($file);
    
    // 转换成数组
    $array = json_decode($string,TRUE);
    // 空数组
    $new = [];
    // 替换'/'字符
    $new[0] = str_replace("/","",$array[0]["Name"]);
    // 空值
    if(empty($array[0]["NetworkSettings"]["Networks"]["bridge"]["IPAddress"]) ) {
    $new[1]= 'null';
    } else {
    $new[1]= $array[0]["NetworkSettings"]["Networks"]["bridge"]["IPAddress"];
    }
    $new[2]= $array[0]["Node"]["Name"];
    
    // 返回数组
    return $new;
}

// 临时文件
$idFile = '/tmp/idFile.txt';
$contFile = '/tmp/contFile.txt';

// 获得容器ID
$idResut = getId($idFile);

// 遍历容器
foreach ($idResut as $id) {
    $conts = getCont($id, $contFile);
    echo "|".$conts[0] ."|".$conts[1]."|".$conts[2]."| \n";
}

使用
php container.php
|devhost|172.17.0.5|node2|
|memcache-server|172.17.0.3|node1|
|redis-server|172.17.0.4|node1|
|mysql-server|172.17.0.2|node1|
...

小结
1. 两个函数,一个用于获取容器的ID信息,一个用于根据ID获取容器的详细信息,也就是目标中的3个元素
2. 使用 passthru() 函数,执行系统命令,注意此函数与exec()/system()等函数不同,它没有无返回值
3. 文件系统函数库,中的 file_exists(BOOL)/file(ARRAY)/file_get_contents(STRING) 等函数;
4. 字符串函数,rtrim() 用于删除字符串末端的’空白‘字符,注意不使用第二个参数,仅删除'空白'(不是空格);
                         str_replace(),用于子字符串替换
5. empty()函数,用于检查一个变量是否为空,而这里用于检查数组元素是否为空值, 以下的东西被认为是空的:
    "" (空字符串)
    0 (作为整数的0)
    0.0 (作为浮点数的0)
    "0" (作为字符串的0)
    NULL
    FALSE
    array() (一个空数组)
    $var; (一个声明了,但是没有值的变量)

参考:php 去掉字符串的最后一个字符
#
游客

返回顶部