巧用linux版powershell,管理linux下的docker
owershell,docker,cli,命令,docker ps,docker image
第一章 在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://github.com/PowerShell/PowerShell/blob/master/docs/installation/linux.md
系統需求:
問:目前哪些版本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 Linux
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 '
第三章 升級psreadline(此步驟非必要)
目的:
升級powershell的psreadline模塊。
動作:
1 請把終端軟件的鍵盤,的BACKSPACE,設置成 ascii127(ctrl + ?)
2 pwsh
3 Install-Module -Name PSReadLine -AllowPrerelease -Force -SkipPublisherCheck
第四章 安裝powershell的,docker命令模塊
目的:
給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.0.4版本,有人能接手這個docker模塊,歡迎聯系作者繼續開發。
由于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
-------------------------------------------------------------------------------------
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的馬甲
第五章 正式講解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????? :
-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呼發貼說:“管道中傳對象,是沒必要的”。是這樣么?
我的這篇帖子,很好地說明了這一點。
原文地址:https://www.cnblogs.com/piapia/p/8651332.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的巧用linux版powershell,管理linux下的docker的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2017创建ASP.NET Core
- 下一篇: 从ASP.NET Core2.2到3.0