用php写docker本地管理工具

199 阅读2分钟

1.环境要求

php 7.0+
很简单的一个php驱动的docker管理工具(其实只有删除镜像和查看使用状态),为了方便我将静态页面和脚本放在一起了。有兴趣自己可以扩展一些功能比如:启动容器,docker push部署、优化界面等等。

清理磁盘慎点!!!

2.源码 docker-manager.php

<!-- 引入bootstrap -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

<style>
  body { background: #f3f3f3 }
</style>

<?php
$params = $_GET;
if (isset($params['delete']) && isset($params['id'])) {
  echo "<div class=\"alert alert-success\" role=\"alert\">操作成功</div>";
  shell_exec('docker rmi ' . $params['id']);
  echo "<script> setTimeout(() => { window.location.href = 'docker.php'; }, 1000); </script>";
  return;
} else if (isset($params['clean'])) { // 清理
  echo "<div class=\"alert alert-success\" role=\"alert\">操作成功</div>";
  shell_exec('docker system prune y');
  echo "<script> setTimeout(() => { window.location.href = 'docker.php'; }, 2000); </script>";
  return;
}

$images  = shell_exec("docker images");
$str     = str_getcsv($images, ' ');
$tempArr = [];
$header  = [];
$content = [];
$result  = [];
$i       = 0;

foreach($str as $item) {
  if (!empty($item) && strstr($item, 'SIZE')) { // 查询位置
    array_push($tempArr, 'SIZE');
    array_push($tempArr, str_replace('SIZE', '', $item));
  } else if (!empty($item))
    array_push($tempArr, $item);
}

foreach($tempArr as $k => $item) {
  if ($k < 6) {
    $header[] = $item;
    continue;
  }
  $pattern = "/([0-9|a-z|A-z|\.]+MB?)\w+/";
  preg_match($pattern, $item, $data);
  if ($data && !empty($data) && count($data) > 0) {
    $content[] = $data[0];
    $content[] = str_replace($data[0], "", $item);
  } else if (!empty($item)) {
    $content[] = $item;
  }
}

foreach($content as $k => $item) {
  $result[$i][] = $item;
  if (($k + 1) % 7 === 0) {
    $i ++;
  }
}

$header[2] = $header[2] . ' ' . $header[3];
unset($header[3]);
unset($result[count($result) - 1]);

?>
<div style="width: 1400px;margin: 0 auto;">
  <h2>Docker 命令管理工具</h2>
  <div>
    <pre><?php $a = system('docker system df'); ?></pre>
  </div>
  <div style="padding: 10px 0">
    <a href="/docker.php?clean=true"><button type="button" class="btn btn-info">清理磁盘</button></a>
  </div>
  <table class="table table-condensed" style="background: #fff;">
  <?php foreach($header as $item) { ?>
    <th <?php if($item === 'CREATED') echo "colspan='3'"; ?>><?=$item ?></th>
  <?php } ?>
    <th>操作</th>
  <?php foreach($result as $item) { ?> 
    <tr>
      <?php foreach($item as $s) {
        echo '<td>' . $s .'</td>';
      }?>
      <td>
        <a href="/docker.php?delete=true&id=<?=$item[2]?>"><button type="button" class="btn btn-primary">清空</button></a>
        <a href="/docker.php?start=true"><button type="button" class="btn btn-success">启动容器</button></a>
      </td>
    </tr>
  <?php } ?>
  </table>
</div>

3.运行

php -S localhost:8009 / #docker-manager.php 所在目录

访问http://localhost:8009/docker-manager.php