你们好,我把用powershell的docker马甲命令的好处,放在了页面下方,从第五章开始。
powershell 传教士 原创文章 始于 2017-09-07 ,2018-07-16 ,2019-03-07 更新。容许转载,但必须保留名字和出处,不然追究法律责任linux
powershell,docker,cli,命令,docker ps,docker imagenginx
目的:
在任意版本的linux(物理机,虚拟机,节点机)中,安装docker服务。git
动做:
教程=略,不是本文主要目的。请参考官网。github
ubuntu
https://docs.docker.com/install/linux/docker-ce/ubuntu/docker
centos
https://docs.docker.com/install/linux/docker-ce/centos/shell
目的:
在linux发行版上,安装powershell。bootstrap
动做:
教程=略,不是本文主要目的。请参考官网。
https://github.com/PowerShell/PowerShell/blob/master/docs/installation/linux.mdubuntu
系统需求:
问:目前哪些版本linux能安装上powershell?
答:
◦Windows 10 IoT Core(arm32的cpu,本质上是win,树莓派硬件上的win10)
◦Raspbian Stretch(arm32的cpu,树莓派官方操做系统Raspbian,基于大便,因此叫树莓便。)
◦MAC OS X 10.11
◦Ubuntu 14.04/16.04/17.10
◦Debian8.x/9.x
◦CentOS 7.x/RHEL 7.x/Fedora25/Fedora26/Fedora27
◦open SUSE 42及以上/SUSE Linux Enterprise Server 12 SP2
◦Docker。LINUX发行版中,安装容器dockerd,docker中运行powershell。
◦Arch Linux (archl inux 没有版本号)
◦Linux AppImage 容器(portable application single binary) https://github.com/probonopd/AppImageKit
◦Kali Linuxcentos
centos7及以上,安装powershell:
curl -o /etc/yum.repos.d/microsoft.repo https://packages.microsoft.com/config/rhel/7/prod.repo
sudo yum remove -y powershell #删除旧版
yum install -y powershell-6.0.5
pwsh -c 'mkdir -p "$env:HOME/.config/powershell" '
pwsh -c 'Add-Content -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile '
pwsh -c 'Add-Content -Value "`nSubsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile" -LiteralPath /etc/ssh/sshd_config 'api
目的:
升级powershell的psreadline模块。
动做:
1 请把终端软件的键盘,的BACKSPACE,设置成 ascii127(ctrl + ?)
2 pwsh
3 Install-Module -Name PSReadLine -AllowPrerelease -Force -SkipPublisherCheck
目的:
给linux版powershell,安装docker模块。完成后,就有了马甲docker命令。
官网在:
https://github.com/Microsoft/Docker-PowerShell/
动做:
pwsh
Register-PSRepository -Name DockerPS-Dev -SourceLocation https://ci.appveyor.com/nuget/docker-powershell-dev
Install-Module Docker -Repository DockerPS-Dev
注意:
此模块在官网已经绝种 ;(
我现把 docker-for-powershell绝种模块.tar.gz 放出。
因为ps 6.1稳定版升级改变了功能。此模块支持ps core 6.04 稳定版。不支持ps core 6.1 稳定版。
你或许须要:
yum remove powershell
rpm -ivh https://packages.microsoft.com/rhel/7/prod/powershell-6.0.4-1.rhel.7.x86_64.rpm
模块的用法:
解压到$env:psmodulepath便可。
对于linux,原来存放模块的路径为:
/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
其中:
Request-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的马甲
目的1:
使用镜像名,或镜像名内包含的【字符串】来匹配容器,
动做1:
Get-Container | Where-Object {$_.Image -eq 'nginx'} |Stop-Container #Get-Container至关于docker ps
讲解:
Get-Container,至关于docker ps。可是Get-Container返回的是对象。
【|】是管道。powershell的管道,是世界上惟一能够传输对象的。
Where-Object {} 是过滤语法。
-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呼发贴说:“管道中传对象,是不必的”。是这样么?个人这篇帖子,很好地说明了这一点。-----------------------------谢谢看贴,完。-------------------------------