原文鏈接: https://hackernoon.com/handy-docker-aliases-4bd85089a3b8
如果您在命令行中使用過Docker罚屋,那么您無疑會編寫命令快捷方式,或者至少考慮過這樣做。
在這篇文章中,我假設您使用docker命令有點舒服,并且可能對潛在有用的別名有點興趣屎蜓。如果你是Docker的新手 - 那么這可能不是一個好的開始。
這篇文章是關(guān)于更長的,未縮寫的命令的節(jié)省時間的快捷方式或別名棚饵。因為讓我們面對它:
“難道沒有人有時間輸出整個該死的命令递递!”
快捷方式可以通過多種方式實現(xiàn)。我們在這里考慮的兩個是bash shell別名和shell腳本文件扼劈。我將共享的任何快捷方式都可以放在腳本文件或別名文件中。每種方法都有其優(yōu)點和缺點菲驴。
這是一個dkps放在shell腳本中的方便(docker ps)快捷方式荐吵。如果您選擇這種方法,那么您最終會得到一組腳本赊瞬,您需要將這些腳本復制到全局可訪問的路徑先煎,例如/usr/shared/bin,使用PATH或類似的東西巧涧。您可能還需要系統(tǒng)權(quán)限才能使其正常運行薯蝎。
#!/bin/sh
docker ps --format '{{.ID}} ~ {{.Names}} ~ {{.Status}} ~ {{.Image}} '
另一種方法是將別名命令放在主目錄中的.bash_profile文件中。這使得快捷方式可以移植而無需特殊權(quán)限
#!/bin/sh
alias dkps="docker ps --format '{{.ID}} ~ {{.Names}} ~ {{.Status}} ~ {{.Image}} '"
如果你是bash別名的新手谤绳,請查看此Bash Aliases
為了保持簡潔占锯,我將導入與docker相關(guān)的別名,而不是直接將它們添加到我的.bash_profile或.bash_aliases腳本中缩筛。
在我的.bash_profile腳本中消略,我只需添加以下內(nèi)容即可加載我的新.docker_aliases文件。
if [ -f ~/.docker_aliases ]; then
. ~/.docker_aliases
fi
在我的實際.bash_profile腳本中瞎抛,我加載了其他別名疑俭,例如.git_aliases腳本。
這種方法也非常便攜,因為您可以共享您的docker別名钞艇。
在介紹我自己的方便的docker別名之前啄寡,讓我們創(chuàng)建一個容器樣本集,我們可以使用它來測試別名哩照。我們將使用Docker Stack命令和兩個眾所周知的服務Redis和MongoDB來實現(xiàn)挺物。不要擔心,如果你不熟悉它們飘弧,我們實際上不會使用它們识藤。
version: "3.4"
networks:
servicenet:
driver: overlay
ipam:
config:
-
subnet: 10.0.9.0/24
services:
redis:
image: redis:4.0.8-alpine
networks:
- servicenet
ports:
- target: 6379
published: 6379
protocol: tcp
mode: ingress
deploy:
replicas: 1
mongo:
image: mongo:3.4.3
networks:
- servicenet
ports:
- target: 27017
published: 27017
protocol: tcp
mode: ingress
deploy:
replicas: 1
啟動我們的測試只需要執(zhí)行docker堆棧部署并傳遞上面的compose腳本。我們用我們稱之為“test”的堆棧名稱結(jié)束命令次伶。
一旦docker stack加載痴昧,我們可以使用docker ps命令驗證它
注意:為簡潔起見,我將縮寫某些命令的輸出冠王。這具有創(chuàng)建更小圖像的額外好處赶撰。所以請記住,上面的docker ps命令的輸出比顯示的長得多
我們可以使用docker stack rm命令拆除堆棧柱彻。
看起來很容易豪娜,對吧?
在本文的其余部分中顯示屏幕截圖時哟楷,我將使用上面的設置瘤载。
現(xiàn)在我們的別名......這樣更好是對的嗎? 我們將看到的第一個別名只是為常見的docker命令提供縮寫卖擅。
我們將看到的第一個別名只是為常見的docker命令提供縮寫鸣奔。
馬上就可以考慮每次使用
dk
替換docker
和docker ps
之類的命令時,或者使用dks
來處理Docker服務命令(如docker service ls)時節(jié)省時間惩阶。鍵入dks的節(jié)省加起來挎狸!因此,不要鍵入
docker log
琳猫,而是鍵入:dkl b7a8
使用
dklf
關(guān)注日志。因此私痹,而不是
docker logs -f b7a8
脐嫂,你可以簡單地使用dklf b7a8
另一個方便的日志記錄別名是dkln
(docker log by name)命令。
它評估反引號(`)中的管道命令紊遵,并將結(jié)果用作docker logs命令的參數(shù)账千。該grep命令使用第一個參數(shù)來過濾docker ps命令的結(jié)果。最后暗膜,該awk命令將輸出的第一個字段作為value參數(shù)匀奏。
好吧,這可能會令人困惑学搜。讓我們仔細看看娃善。
該docker ps命令返回正在運行的容器列表论衍。
并docker ps | grep redis返回:
最后,docker ps | grep redis | awk '{print $1}'返回Redis的容器ID:f5f0ed387073
這允許我們按名稱查看任何容器的日志聚磺。
當然坯台,您需要確保沒有多個與名稱匹配的容器。如果這樣做瘫寝,那么只需dkl使用帶有容器ID 的命令即可蜒蕾。
上面示例中的一個關(guān)鍵點是,您可以通過組合shell命令來構(gòu)建一些非常強大的別名焕阿。當我們查看構(gòu)建和發(fā)布容器的別名時咪啡,我們將在本文稍后看到另一個示例。
查看運行容器的狀態(tài)是構(gòu)建和測試容器化服務的重要部分暮屡。以下別名使我們更容易執(zhí)行此操作撤摸。
在這篇文章的早些時候,我們查看了dkps(Docker PS)命令栽惶。
這是命令的作用:
另一個有用的別名是
dkstats
(docker stats)命令:此命令測試是否提供參數(shù)愁溜,如果是,則應用grep過濾器
這允許我們查看所有容器的統(tǒng)計信息或按特定容器名稱過濾外厂。
該dktop命令呈現(xiàn)類似頂部的顯示冕象,顯示內(nèi)存,CPU汁蝶,網(wǎng)絡I / O和塊I / O.
實際的別名非常簡單:
您可以使用您更愿意看到的值自由地進行自定義渐扮。我選擇了一個基本設置,以使顯示屏整齊地安裝在多窗格iTerm2屏幕中掖棉。
在建造集裝箱的過程中墓律,有時需要進入集裝箱才能環(huán)顧四周。這樣做通常涉及:
- docker ps查看容器ID列表
- docker exec -it {containerID} / bin / sh
使用我們的別名幔亥,這變?yōu)椋?/h5>
- dkps
-
dke {containerID}
這是一個視頻示例:
dke {containerID}
這是一個視頻示例:
有時需要重新啟動服務耻讽。該dksb(搬運工服務彈跳)命令允許我們能夠做到這一點。
執(zhí)行此操作的非別名方法需要使用以下docker service scale命令:
$ docker service scale test_redis = 0
$ docker service scale test_redis = 1
使用dksb我們只需輸入:
$ dksb test_redis 1
我們要看的最后一件事是用于構(gòu)建和發(fā)布docker容器的別名帕棉。雖然此過程通常涉及兩階段操作针肥,即docker build / docker push,但您可能還需要執(zhí)行其他任務以進一步自動化該過程香伴。就我而言慰枕,我構(gòu)建了托管NodeJS微服務的docker容器。我的本地構(gòu)建的一部分涉及檢查.dockerignore文件是否存在即纲,然后查看Node package.json文件內(nèi)部以提取項目的名稱和版本具帮。然后使用名稱和版本來形成泊塢標簽。
這是dkp(docker publish)別名的樣子:
上面的別名使用jq(命令行JSON處理器)從package.json文件中提取版本信息。
使用dkp
只需輸入節(jié)點項目目錄并鍵入蜂厅,dkp
然后輸入docker hub存儲庫名稱匪凡。在下面的示例中,我正在構(gòu)建和發(fā)布HydraRouter docker容器葛峻。
我希望你在這篇文章中找到了一些方便的docker別名锹雏,或者至少它激發(fā)了你使用別名來優(yōu)化你的命令行工作流程。因為記住 -? 沒有人有時間 ......
這是完整的 .docker_aliases腳本术奖,包括我們在這篇文章中沒有涉及的一些獎勵命令礁遵。
#!/bin/sh
alias dm='docker-machine'
alias dmx='docker-machine ssh'
alias dk='docker'
alias dki='docker images'
alias dks='docker service'
alias dkrm='docker rm'
alias dkl='docker logs'
alias dklf='docker logs -f'
alias dkflush='docker rm `docker ps --no-trunc -aq`'
alias dkflush2='docker rmi $(docker images --filter "dangling=true" -q --no-trunc)'
alias dkt='docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"'
alias dkps="docker ps --format '{{.ID}} ~ {{.Names}} ~ {{.Status}} ~ {{.Image}}'"
dkln() {
docker logs -f `docker ps | grep $1 | awk '{print $1}'`
}
dkp() {
if [ ! -f .dockerignore ]; then
echo "Warning, .dockerignore file is missing."
read -p "Proceed anyway?"
fi
if [ ! -f package.json ]; then
echo "Warning, package.json file is missing."
read -p "Are you in the right directory?"
fi
VERSION=`cat package.json | jq .version | sed 's/\"http://g'`
NAME=`cat package.json | jq .name | sed 's/\"http://g'`
LABEL="$1/$NAME:$VERSION"
docker build --build-arg NPM_TOKEN=${NPM_TOKEN} -t $LABEL .
read -p "Press enter to publish"
docker push $LABEL
}
dkpnc() {
if [ ! -f .dockerignore ]; then
echo "Warning, .dockerignore file is missing."
read -p "Proceed anyway?"
fi
if [ ! -f package.json ]; then
echo "Warning, package.json file is missing."
read -p "Are you in the right directory?"
fi
VERSION=`cat package.json | jq .version | sed 's/\"http://g'`
NAME=`cat package.json | jq .name | sed 's/\"http://g'`
LABEL="$1/$NAME:$VERSION"
docker build --build-arg NPM_TOKEN=${NPM_TOKEN} --no-cache=true -t $LABEL .
read -p "Press enter to publish"
docker push $LABEL
}
dkpl() {
if [ ! -f .dockerignore ]; then
echo "Warning, .dockerignore file is missing."
read -p "Proceed anyway?"
fi
if [ ! -f package.json ]; then
echo "Warning, package.json file is missing."
read -p "Are you in the right directory?"
fi
VERSION=`cat package.json | jq .version | sed 's/\"http://g'`
NAME=`cat package.json | jq .name | sed 's/\"http://g'`
LATEST="$1/$NAME:latest"
docker build --build-arg NPM_TOKEN=${NPM_TOKEN} --no-cache=true -t $LATEST .
read -p "Press enter to publish"
docker push $LATEST
}
dkclean() {
docker rm $(docker ps --all -q -f status=exited)
docker volume rm $(docker volume ls -qf dangling=true)
}
dkprune() {
docker system prune -af
}
dktop() {
docker stats --format "table {{.Container}}\t{{.Name}}\t{{.CPUPerc}} {{.MemPerc}}\t{{.NetIO}}\t{{.BlockIO}}"
}
dkstats() {
if [ $# -eq 0 ]
then docker stats --no-stream;
else docker stats --no-stream | grep $1;
fi
}
dke() {
docker exec -it $1 /bin/sh
}
dkexe() {
docker exec -it $1 $2
}
dkreboot() {
osascript -e 'quit app "Docker"'
countdown 2
open -a Docker
echo "Restarting Docker engine"
countdown 120
}
dkstate() {
docker inspect $1 | jq .[0].State
}
dksb() {
docker service scale $1=0
sleep 2
docker service scale $1=$2
}
mongo() {
mongoLabel=`docker ps | grep mongo | awk '{print $NF}'`
docker exec -it $mongoLabel mongo "$@"
}
redis() {
redisLabel=`docker ps | grep redis | awk '{print $NF}'`
docker exec -it $redisLabel redis-cli
}