docker 清除无用资源

背景

在开发机上运行一段时间的容器后,你能看到有很多的无用容器、磁盘、镜像、网络等,其实大部分都是无用的。这篇文章记录下如何删除无用的资源,以节省磁盘空间。

下文转自:https://gist.github.com/bastman/5b57ddb3c11942094f8d0a97d461b430

步骤

删除磁盘

// 参考 https://github.com/chadoe/docker-cleanup-volumes

$ docker volume rm $(docker volume ls -qf dangling=true)
$ docker volume ls -qf dangling=true | xargs -r docker volume rm

删除网络

$ docker network ls  
$ docker network ls | grep "bridge"   
$ docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')

删除镜像

// 参考 http://stackoverflow.com/questions/32723111/how-to-remove-old-and-unused-docker-images

$ docker images
$ docker rmi $(docker images --filter "dangling=true" -q --no-trunc)

$ docker images | grep "none"
$ docker rmi $(docker images | grep "none" | awk '/ / { print $3 }')

删除容器

// 参考 http://stackoverflow.com/questions/32723111/how-to-remove-old-and-unused-docker-images

$ docker ps
$ docker ps -a
$ docker rm $(docker ps -qa --no-trunc --filter "status=exited")

整体清除

docker system prune -a

参考资料


zsh for centos

背景

个人很喜欢 zsh,社区也有人做了 maximum-awesome 这个专门针对 zsh 的一键安装项目。一开始是只有 Mac OS X 的,后来有人做成了 Debian 系的,无奈没有人做 CentOS 系的,大概是因为 CentOS 都是企业使用,而在企业环境里我们很少安装无用的软件吧。

其实制作起来相对简单的,社区安装使用的是ruby的rake安装,只需要把步骤中的 debian 的语法改成 CentOS 的语法即可。我也做好了发布到 github上: https://github.com/kelvinblood/maximum-awesome-centos

用法

用法也可以参考我另一个Linux安装脚本项目的引用:https://github.com/kelvinblood/KeluLinuxKit

下载后运行

./keluLinuxKit.sh install install_zsh_centos

即可。我在像目录不仅安装了 maximum-awesome,还安装了 tmux-powerline,而且自定义了显示栏内容。

安装的具体命令行脚本如下,想自定义的可以按需修改。

install_zsh_centos() {
    yum -y install zsh tmux git
    # zsh重启生效引入zsh增强插件,支持git,rails等补全,可选多种外观皮肤
    wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh

    echo ''
    echo ''
    echo ''
    echo "-- awesome-tmux -----------------------------------------------------"
    # pass the_silver_searcher install
    yum install -y install build-essential automake pkg-config libpcre3-dev zlib1g-dev liblzma-dev rake
    # awesome-tmux
    cd $DOWNLOAD
    if [ ! -e maximum-awesome-centos ]; then
      git clone https://github.com/kelvinblood/maximum-awesome-centos.git
    fi
    cd maximum-awesome-centos
    rake

    # rake install:solarized['dark']

    cp $DOWNLOAD/maximum-awesome-centos/tmux.conf $DOWNLOAD/maximum-awesome-centos/tmux.conf_backup
    cp $RESOURCE/maximum-awesome-linux/tmux.conf $DOWNLOAD/maximum-awesome-centos/tmux.conf

    # cp $RESOURCE/maximum-awesome-centos/tmux.conf $DOWNLOAD/maximum-awesome
    # cp $RESOURCE/maximum-awesome-centos/.tmux* $HOME
    # cp $RESOURCE/maximum-awesome-centos/.vimrc* $HOME
    # cp $RESOURCE/maximum-awesome-centos/vimrc.bundles $DOWNLOAD/maximum-awesome-centos/vimrc.bundles

    # git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
    # rm -r $HOME/.vim/bundle/vim-snipmate

    # tmux-powerline
    cd $HOME
    touch .tmux.conf.local

    cd $DOWNLOAD
    if [ ! -e tmux-powerline ]; then
      git clone https://github.com/erikw/tmux-powerline.git
    fi
    cp $DOWNLOAD/tmux-powerline/themes/default.sh $DOWNLOAD/tmux-powerline/themes/default.sh_backup
    cp $RESOURCE/tmux-powerline/default.sh $DOWNLOAD/tmux-powerline/themes/default.sh
cat >> $DOWNLOAD/maximum-awesome-linux/tmux.conf<< EOF
# add by Kelu
set-option -g status-left "#($DOWNLOAD/tmux-powerline/powerline.sh left)"
set-option -g status-right "#($DOWNLOAD/tmux-powerline/powerline.sh right)"
source-file ~/.tmux.conf.local
EOF

    cat $RESOURCE/Home/.zshrc >> $HOME/.zshrc
}

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