• 巧用linux版powershell,管理linux下docker的image,container



     
    powershell 传教士 原创文章 始于 2017-09-07 ,2018-07-16 ,2019-03-07 ,2020-04-21 更新。允许转载,但必须保留名字和出处,否则追究法律责任


    powershell,docker,cli,命令,docker ps,docker image

    前 言

    docker是这两年新兴的好东西,微软的powershell也来参与了。

    docker ps是官方的管理命令,微软公司为这些命令制作了,雷同的山寨命令。

    那么问题来了。powershell山寨出来的,马甲docker管理命令,有何好处?下详:

     

    大家好,我把用powershell的docker马甲命令的好处,放在了页面下方,从第4章开始。

     

     

    【第一章 在linux中搭建docker环境】


    目的:
    在任意版本的linux(物理机,虚拟机,节点机)中,安装docker服务。


    动作:
    教程=略,不是本文主要目的。请参考官网。

    ubuntu
    https://docs.docker.com/install/linux/docker-ce/ubuntu/

    centos
    https://docs.docker.com/install/linux/docker-ce/centos/

    【第二章 安装linux版powershell】

    目的:在linux发行版上,安装powershell。

    动作:教程=略,不是本文主要目的。请参考官网。

    https://docs.microsoft.com/zh-cn/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7

    问:目前哪些版本操作系统上能安装上powershell?

    答:

     

     

    【第三章 安装powershell的,docker命令模块】

    目的:给linux版powershell,安装docker模块。完成后,就有了马甲docker命令。

    动作:

    mkdir -p /usr/local/share/powershell/Modules

    cd /tmp

    git clone https://gitee.com/chuanjiao10/powershell_docker_module.git

    cp -r  ./powershell_docker_module/*  /usr/local/share/powershell/Modules/


    查看有哪些马甲docker命令:
    get-command -module docker

    CommandType     Name                                               Version    Source      
    -------------------------------------------------------------------------------------
    Alias           Attach-Container                                   0.1.0.111  Docker                                                              
    Alias           Build-ContainerImage                               0.1.0.111  Docker                                                             
    Alias           Commit-Container                                   0.1.0.111  Docker                                                             
    Alias           Exec-Container                                     0.1.0.111  Docker                                                             
    Alias           Load-ContainerImage                                0.1.0.111  Docker                                                             
    Alias           Pull-ContainerImage                                0.1.0.111  Docker                                                             
    Alias           Push-ContainerImage                                0.1.0.111  Docker                                                             
    Alias           Run-ContainerImage                                 0.1.0.111  Docker                                                             
    Alias           Save-ContainerImage                                0.1.0.111  Docker                                                             
    Alias           Tag-ContainerImage                                 0.1.0.111  Docker                                                             
    Cmdlet          Add-ContainerImageTag                              0.1.0.111  Docker                                                             
    Cmdlet          ConvertTo-ContainerImage                           0.1.0.111  Docker                                                             
    Cmdlet          Copy-ContainerFile                                 0.1.0.111  Docker                                                             
    Cmdlet          Enter-ContainerSession                             0.1.0.111  Docker                                                             
    Cmdlet          Export-ContainerImage                              0.1.0.111  Docker                                                             
    Cmdlet          Get-Container                                      0.1.0.111  Docker                                                             
    Cmdlet          Get-ContainerDetail                                0.1.0.111  Docker                                                             
    Cmdlet          Get-ContainerImage                                 0.1.0.111  Docker                                                             
    Cmdlet          Get-ContainerNet                                   0.1.0.111  Docker                                                             
    Cmdlet          Get-ContainerNetDetail                             0.1.0.111  Docker                                                             
    Cmdlet          Import-ContainerImage                              0.1.0.111  Docker                                                             
    Cmdlet          Invoke-ContainerImage                              0.1.0.111  Docker                                                             
    Cmdlet          New-Container                                      0.1.0.111  Docker                                                             
    Cmdlet          New-ContainerImage                                 0.1.0.111  Docker                                                             
    Cmdlet          New-ContainerNet                                   0.1.0.111  Docker                                                             
    Cmdlet          Remove-Container                                   0.1.0.111  Docker                                                             
    Cmdlet          Remove-ContainerImage                              0.1.0.111  Docker                                                             
    Cmdlet          Remove-ContainerNet                                0.1.0.111  Docker                                                             
    Cmdlet          Request-ContainerImage                             0.1.0.111  Docker                                                             
    Cmdlet          Start-Container                                    0.1.0.111  Docker                                                             
    Cmdlet          Start-ContainerProcess                             0.1.0.111  Docker                                                             
    Cmdlet          Stop-Container                                     0.1.0.111  Docker                                                             
    Cmdlet          Submit-ContainerImage                              0.1.0.111  Docker                                                             
    Cmdlet          Wait-Container                                     0.1.0.111  Docker   

                                                              

    其中:

    pull-ContainerImage===Request-ContainerImage

    Start-ContainerProcess===Exec-Container

    Invoke-ContainerImage===Run-ContainerImage

    Enter-ContainerSession===Attach-Container

    Export-ContainerImage===Save-ContainerImage

    简单使用:
    Import-Module Docker
    Get-Container  #这个命令就是 docker ps的马甲


    【第四章 正式讲解powershell,在管理docker方面的好处】


    目的1:
    使用镜像名,或镜像名内包含的【字符串】来匹配容器,


    动作1:
    Get-Container | Where-Object {$_.Image -eq 'nginx'} |Stop-Container  #Get-Container相当于docker ps


    讲解:
    Get-Container,相当于docker ps。但是Get-Container返回的是对象。

    【|】是管道。powershell的管道,是世界上唯一可以传输对象的。

    Where-Object {} 是过滤语法。

    Container的属性是:
    $_.Image 是镜像名属性,其他属性是
    $_.ID     字符串
    $_.Command  字符串
    $_.Created  日期型
    $_.Status   字符串                
    $_.Names   字符串
     
     
    image的属性是:
    $_.ID          : sha256:的id
    $_.ParentID    :
    $_.RepoTags    : {k8s.gcr.io/kube-controller-manager:v1.13.2}
    $_.RepoDigests :
    $_.Created     : 19-1-11 上午12:06:28  日期型
    $_.Size        : 146227986
    $_.VirtualSize : 146227986
    $_.Labels      :

    Get-ContainerDetail 容器id 返回的属性是:

    ID              : 386ce0ab3e798929ed8b5b27d52f53da86441ca4438a1d379dcc9cc11b73fabf

    Created         : 19-3-11 上午7:51:56

    Path            : /coredns

    Args            : {-conf, /etc/coredns/Corefile}

    State           : Docker.DotNet.Models.ContainerState

    Image           : sha256:f59dcacceff45b5474d1385cd5f500d0c019ed9ca50ed5b814ac0c5fcec8699e

    ResolvConfPath  : /var/lib/docker/containers/5c6a3b0b7a2fec7d1c6031e9db02490fae5263c44075185b3d7b2c843957cdef/resolv.conf

    HostnamePath    : /var/lib/docker/containers/5c6a3b0b7a2fec7d1c6031e9db02490fae5263c44075185b3d7b2c843957cdef/hostname

    HostsPath       : /var/lib/kubelet/pods/cc6bc767-180e-11e9-809f-00155d1ec606/etc-hosts

    LogPath         : /var/lib/docker/containers/386ce0ab3e798929ed8b5b27d52f53da86441ca4438a1d379dcc9cc11b73fabf/386ce0ab3e798929ed8b5b27d52f53da864

                      41ca4438a1d379dcc9cc11b73fabf-json.log

    Node            :

    Name            : /k8s_coredns_coredns-86c58d9df4-5ltfs_kube-system_cc6bc767-180e-11e9-809f-00155d1ec606_5

    RestartCount    : 0

    Driver          : overlay2

    MountLabel      :

    ProcessLabel    :

    AppArmorProfile :

    ExecIDs         :

    HostConfig      : Docker.DotNet.Models.HostConfig

    GraphDriver     : Docker.DotNet.Models.GraphDriverData

    SizeRw          : 0

    SizeRootFs      : 0

    Mounts          : {, , , }

    Config          : Docker.DotNet.Models.Config

    NetworkSettings : Docker.DotNet.Models.NetworkSettings

     

    -eq是表达式。可以有如下表达式:
    $_.Image -eq '字符串' #不区分大小写相等。 'abc' -eq 'Abc'
    $_.Image -match '字符串' #正则匹配。 'abc' -match '^a.c$'
    $_.Image -like '*字符串*' # 'abc' -like '*bc*'
    $_.数值型 -gt 123 # 456 -gt 123

    $a = [datetime]'2018-03-17'
    $_.日期型 -gt $a #


    |Stop-Container,过滤完成后,输出一个或n个对象,然后用Stop-Container停止它。

    ------------------------------------------------------------
    目的2:
    powershell命令行中,tab自动补全,(容器命令相关的)参数名,参数值


    动作2-1:
    Get-Container -c,然后打tab,

    结果2-1:
    命令行出现:
    Get-Container -ContainerIdOrName

    -----------------
    动作2-2:
    Get-Container -ContainerIdOrName,然后打空格,然后依次打n次tab。

    结果2-2:
    命令行出现:
    Get-Container -ContainerIdOrName 【docker ps 中列出的容器名】
    依次打n次shift + tab则从后向前,列出容器名


    -----------------
    动作2-3:
    Get-ContainerImage  -,然后打tab。Get-ContainerImage相当于docker image ls
     

    结果2-3:
    命令行出现:
    Get-ContainerImage -ImageIdOrName
    再打空格,再打tab 出现【docker image ls 中列出的容器名】

    ------------------------------------------------------------
    场景:
    同一个镜像,我运行了很多个,

    ID                   Image           Command              Created                Status               Names              
    --                   -----           -------              -------                ------               -----              
    034c78b5e4e18b772... hello-world     /hello               18-3-19 下午5:20:03      Exited (0) 12 min... ecstatic_khorana   
    8ced2c429e5ba0790... hello-world     /hello               18-3-17 下午9:05:00      Exited (0) 44 hou... objective_villani  
    18cc9a6e1ea14ae8d... hello-world     /hello               18-3-9 下午5:03:08       Exited (0) 10 day... priceless_ardingh...


    目的3-1:
    编写脚本,匹配镜像名,状态码


    powershell脚本代码3-1:
    $状态码字串1 = Get-Container | Where-Object {$_.Image -eq 'hello-world'} | Select-Object Status 
    #$状态码
    #Exited (143) 24 hours ago
    if ($状态码字串1 -like '*Exited (0)*')
    {echo  '正常'}
    else
    {这里做点什么}


    -----------------
    目的3-2:
    1匹配镜像名。
    2排序,并输出
    3取状态码


    powershell脚本代码3-2:
    $状态码字串2 = Get-Container | Where-Object {$_.Image -eq 'hello-world'} |Sort-Object -Property Created |Select-Object Status -Last 1
    $状态码 = $状态码字串2.status.split('(')[1].split(')')[0]

    ------------------------------------------------------------
    docker ps命令有输出对不齐的烦恼,实际上所有linux命令都有输出对不齐的情况,而powershell永远没有这种情况。

    目的4:
    只输出docker ps的,names   command

    动作4:
    Get-Container |Select-Object names,command
    #或Get-Container |Select-Object names,image


    输出:
    Names                           Command            
    -----                           -------            
    {/priceless_ardinghelli}        /hello             
    {/zabbix}                       /config/bootstrap.sh
    {/zabbix-db, /zabbix/zabbix.db} /run.sh            
    {/zabbix-db-storage}            sh                 
    {/pedantic_bose}                /hello    

    ------------------------------------------------------------
    问:如何给docker ps的输出分行,分列?
    答:

    分行:
    (Get-Container)[0]  #输出第一行
     
    分列:
    (Get-Container).Image  #输出image列

             


    【第五章 结论】

    powershell的马甲版docker命令,比docker原生命令,有如下优点:
    1 输出的显示数据,永远没有对不齐的问题。
    2 powershell马甲版docker命令,是面向对象的。通过属性匹配docker的名字和参数,表达式支持正则,更强大。比用grep简单,严谨。
    3 powershell的管道,支持对象。用起来强大简单。
    4 powershell马甲版docker命令的,参数名,参数值,支持tab自动补全,用起来十分方便。
    5 ps的马甲命令Get-Container,相当于docker ps。
    它的输出,分行,分列。如下:用起来比docker ps输出的字符串要好。

    ID  Image  Command  Created  Status  Names              
    --    -----      -------          ------        ------     -----


    需要说明的是,这些优点,本质上和docker命令无关。这是powershell命令行,比linux命令行的优点。

    从前,有一头“青翼蝠王”韦瞎笑,在z呼发贴说:“管道中传对象,是没必要的”。是这样么?

    围观下面这人,狂扣字符串,很好地说明了这一点。

    此人问:请问下如何得到

     

    port这一列字符串,我开始用的方法是awk '{print $11}') 可是发现status下面的时间长度是不固定的,可能三列可能四列

    我的这篇帖子,很好地说明了这一点。

    -----------------------------谢谢看贴,完。-------------------------------

  • 相关阅读:
    jQuery右键菜单contextMenu使用实例
    如何调动员工的积极性 -引用LTP.Net知识库
    Linux 目录管理的相关命令
    linux bash基础特性
    Linux 文件系统简介(FHS:Filesystem Hierarchy Standard)
    Linux 基础命令
    docker 限制容器能够使用的资源
    docker 私有registry harbor安装
    docker Dockerfile里使用的命令说明
    docker 存储卷 Volumes
  • 原文地址:https://www.cnblogs.com/piapia/p/8651332.html
Copyright © 2020-2023  润新知