文章,博客
by
powershell 传教士 原创文章 始于 2017-09-07 ,2018-07-16 ,2019-03-07 ,2020-04-21,2021-05-10 更新。允许转载,但必须保留名字和出处,否则追究法律责任
powershell,docker,cli,命令,docker ps,docker image
docker是这两年新兴的好东西,微软的powershell也来参与了。
docker ps是官方的管理命令,微软公司为这些命令制作了,雷同的山寨命令。
那么问题来了。powershell山寨出来的,马甲docker管理命令,有何好处?下详:
大家好,我把用powershell的docker马甲命令的好处,放在了页面下方,从第4章开始。
目的: 在任意版本的linux(物理机,虚拟机,节点机)中,安装docker服务。
动作: 教程=略,不是本文主要目的。请参考官网。
ubuntu https://docs.docker.com/install/linux/docker-ce/ubuntu/
centos https://docs.docker.com/install/linux/docker-ce/centos/
目的:在linux发行版上,安装powershell。
动作:教程=略,不是本文主要目的。请参考官网。
https://docs.microsoft.com/zh-cn/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7
问:目前哪些版本操作系统上能安装上powershell?
答:
目的:给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列
目的5: 我有3个网络,分别是,bridge,host,none,我想分别获取这些类别中,容器的端口,如何实现?
动作 5:
1 获取docker网络:这里以bridge为例
2 获取 bridge网内含的【所有】容器id:这里只有1个
3 获取这个容器id的,端口映射:
4把代码组合起来:
(Get-ContainerNet -id 868f).Containers.keys | ForEach-Object { (Get-ContainerDetail -ContainerIdOrName $_ ).NetworkSettings.Ports.keys } |
【第五章 结论】
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下面的时间长度是不固定的,可能三列可能四列
我的这篇帖子,很好地说明了这一点。
—————————–谢谢看贴,完。——————————-
分类: powershell
标签: powershell , docker , docker ps , docker image , docker container , 容器 , 镜像
tags: