php 调用 docker 服务

背景

最近在使用一个云产品,网上看到了相关的api镜像,直接运行容器即可简单操作。如何使用 php 操作呢?于是查了相关的东西,最后完成到自己的项目中。这篇文章记录一下使用过程。官方提供了 golang、python和http的 API调用,社区也做好了各种语言的SDK,有需要的都可以用起来。

Language Library
C libdocker
C# Docker.DotNet
C++ lasote/docker_client
Dart bwu_docker
Erlang erldocker
Gradle gradle-docker-plugin
Groovy docker-client
Haskell docker-hs
HTML (Web Components) docker-elements
Java docker-client
Java docker-java
Java docker-java-api
NodeJS dockerode
NodeJS harbor-master
Perl Eixo::Docker
PHP Docker-PHP
Ruby docker-api
Rust docker-rust
Rust shiplift
Scala tugboat
Scala reactive-docker
Swift docker-client-swift

用法

通过composer添加依赖:

composer require docker-php/docker-php

可以查看社区文档获得更详细的使用方法:https://docker-php.readthedocs.io/en/latest/

连接docker

按常规的方式,如果不做docker配置,则会将其unix:///var/run/docker.sock用作默认配置连接docker。

由于本地的程序是运行在容器里的,所以当然没有这个文件,只能通过tcp方式连接,在服务器上可以通过把宿主机的docker.sock文件映射到容器里进行读取.

值得注意的是,代码中我使用了10.0.75.1:2376这样的地址。IP地址是Windows中源主机的ip,Windows中记得打开docker的访问地址:

54495809413

你应该也注意到了我使用的不是2375端口,因为这个端口只能是127.0.0.1地址才能访问,所以我做了一个转发,你在Windows下开发的时候也要这么做:

netsh interface portproxy add v4tov4 listenport=2376 connectaddress=127.0.0.1 connectport=2375

实现代码如下:


    public static function getClient(){
        if (app()->environment('local')) {
            $client = DockerClientFactory::create([
                'remote_socket' => 'tcp://10.0.75.1:2376',
                'ssl' => false,
            ]);
        } else {
            $client = null;
        }

        return $client;
    }
    
    public static function dockerTest(){
        $cfg = self::getClient();
        if($cfg){
            $docker = Docker::create($cfg);
        }else{
            $docker = Docker::create();
        }

        $containers = $docker->containerList(["all"=>true]);
        foreach ($containers as $container) {
            echo $container->getNames()[0]. "\n";
            if ($container->getState() == 'exited') {
                $docker->containerDelete($container->getId());
            }
        }
    }    

创建容器

设置好所需的镜像和环境变量,再运行即可。敏感的变量我使用了xxx进行替代。


    public static function setConfig($endPoint, $apiKey, $secretKey, $type)
    {
        $containerConfig = new ContainersCreatePostBody();
        $containerConfig->setImage('xxxx');
        $containerConfig->setEnv([
            "END_POINT=" . $endPoint,
            "API_KEY=" . $apiKey,
            "SECRET_KEY=" . $secretKey
        ]);

        $containerConfig->setAttachStdin(true);
        $containerConfig->setAttachStdout(true);
        $containerConfig->setAttachStderr(true);
        switch ($type) {
            case "xxxx":
                break;
            default:
        }

        return $containerConfig;
    }

    public static function basic($func,$cmd = "xxx"){
        $cfg = self::getClient();
        $docker = $cfg ? Docker::create($cfg) : Docker::create();

        foreach (Account::$configs as $key => $config) {
            foreach (Account::$apis as $api) {
                $containerCreateResult = $docker->containerCreate(self::setConfig($api, $config[0], $config[1], $cmd));
                echo $containerCreateResult->getId()."\n";
                $id = $containerCreateResult->getId();
                $attachStream = $docker->containerAttach($id, [
                    'stream' => true,
                    'stdin' => true,
                    'stdout' => true,
                    'stderr' => true
                ]);
                $docker->containerStart($id);

                $output = '';
                $attachStream->onStdout(function ($stdout) use (&$output) {
                    $output .= $stdout;
                });

                $attachStream->wait();

                $result = json_decode($output);

                if (!$result) dd("idcf no return value");

                self::$func($result);
                $docker->containerDelete($id);
            }
        }
    }

参考资料


这可能是人工智能、机器学习和大数据领域覆盖最全的一份速查表 - InfoQ

本文是根据 Stefan Kojouharov 发表在 Medium 上的文章整理而成的一份人工智能、神经网络、机器学习、深度学习和大数据方面的速查表。为了便于查找与使用,本文对每个主题进行了分类,希望可以对各位的工作有所帮助。

注意!这可能是相关领域最全的的一份速查表,文末还列出了各种算法的复杂度统计。

神经网络

image

图 1:神经网络速查表


kubernetes 批量删除 helm chart 应用

在开发环境常常批量安装 helm chart 应用,如果普通删除,会留下很多应用的信息,而且无法安装同名应用。

使用下面简单的命令,快速删除状态为 DELETED 的chart应用。

helm list -a | grep DELETED | awk '{print $1}' |  xargs helm del --purge

centos 7 使用阿里云 ntp 服务器

背景

最近开了几台机器做集群玩,在运行etcd的时候发现两台时间相差超过1分钟!系统日志中一直出现错误告警。遂安装了 NTP 服务器将机器时间同步。

本文部分参考了这篇文章——《如何在 CentOS 中设置 NTP 服务器 - linux.cn》

NTP是什么

网络时间协议(NTP)用来同步网络上不同主机的系统时间。你管理的所有主机都可以和一个指定的被称为 NTP 服务器的时间服务器同步它们的时间。而另一方面,一个 NTP 服务器会将它的时间和任意公共 NTP 服务器,或者你选定的服务器同步。由 NTP 管理的所有系统时钟都会同步精确到毫秒级。

由于制造工艺多种多样,所有的(非原子)时钟并不按照完全一致的速度行走。有一些时钟走的比较快而有一些走的比较慢。因此经过很长一段时间以后,一个时钟的时间慢慢的和其它的发生偏移,这就是常说的 “时钟漂移” 或 “时间漂移”。为了将时钟漂移的影响最小化,使用 NTP 的主机应该周期性地和指定的 NTP 服务器交互以保持它们的时钟同步。

在不同的主机之间进行时间同步对于计划备份、入侵检测记录、分布式任务调度或者事务订单管理来说是很重要的事情。它甚至应该作为日常任务的一部分。

NTP 的层次结构

NTP 时钟以层次模型组织。层级中的每层被称为一个 stratum(阶层)。stratum 的概念说明了一台机器到授权的时间源有多少 NTP 跳。

img

Stratum 0 由没有时间漂移的时钟组成,例如原子时钟。这种时钟不能在网络上直接使用。Stratum N (N > 1) 层服务器从 Stratum N-1 层服务器同步时间。Stratum N 时钟能通过网络和彼此互联。

NTP 支持多达 15 个 stratum 的层级。Stratum 16 被认为是未同步的,不能使用的。

步骤

  1. 安装

    yum install ntp
    systemctl start ntpd.service
    systemctl enable ntpd.service
    
  2. 修改配置

    修改为阿里云ntp服务器

    vim /etc/ntp.conf
    
    # Use public servers from the pool.ntp.org project.
    # Please consider joining the pool (http://www.pool.ntp.org/join.html).
    #server 0.centos.pool.ntp.org iburst
    #server 1.centos.pool.ntp.org iburst
    #server 2.centos.pool.ntp.org iburst
    #server 3.centos.pool.ntp.org iburst
    server ntp.aliyun.com iburst
    server ntp1.aliyun.com iburst
    server ntp2.aliyun.com iburst
    server ntp3.aliyun.com iburst
    server ntp4.aliyun.com iburst
    server ntp5.aliyun.com iburst
    

  3. 验证服务

    # 以下是示例
    # ntpq -p
    
        remote           refid      st t when poll reach   delay   offset  jitter
    ============================================================
    
    +news.neu.edu.cn 202.118.1.46     2 u   14  128  377   44.480    2.868  31.310
    *202.118.1.130   202.118.1.46     2 u   63  128  377   41.726    1.631  21.462
     LOCAL(0)        .LOCL.          10 l    9   64  377    0.000    0.000   0.001
    

    说明:*表示目前正在使用的上层NTP,+表示已连线,可提供时间更新的候补服务器

  4. 确认已进行同步

    ntpstat
    
    synchronised to NTP server (202.118.1.130) at stratum 3
       time correct to within 60 ms
       polling server every 128 s
    

参考资料