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

你們好,我把用powershell的docker馬甲命令的好處,放在了頁面下方,從第五章開始。
 
powershell 傳教士 原創文章 始於 2017-09-07 ,2018-07-16 ,2019-03-07  更新。容許轉載,但必須保留名字和出處,不然追究法律責任linux


powershell,docker,cli,命令,docker ps,docker imagenginx


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


目的:
在任意版本的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】=========


目的:
在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


=========【第三章 升級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.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的馬甲


========【第五章 正式講解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呼發貼說:「管道中傳對象,是不必的」。是這樣麼?個人這篇帖子,很好地說明了這一點。-----------------------------謝謝看貼,完。-------------------------------

相關文章
相關標籤/搜索