方便的Docker别名

原文链接: https://hackernoon.com/handy-docker-aliases-4bd85089a3b8

如果您在命令行中使用过Docker,那么您无疑会编写命令快捷方式,或者至少考虑过这样做。

在这篇文章中,我假设您使用docker命令有点舒服,并且可能对潜在有用的别名有点兴趣。如果你是Docker的新手 - 那么这可能不是一个好的开始。

这篇文章是关于更长的,未缩写的命令的节省时间的快捷方式或别名。因为让我们面对它:

“难道没有人有时间输出整个该死的命令!”

快捷方式可以通过多种方式实现。我们在这里考虑的两个是bash shell别名和shell脚本文件。我将共享的任何快捷方式都可以放在脚本文件或别名文件中。每种方法都有其优点和缺点。

这是一个dkps放在shell脚本中的方便(docker ps)快捷方式。如果您选择这种方法,那么您最终会得到一组脚本,您需要将这些脚本复制到全局可访问的路径,例如/usr/shared/bin,使用PATH或类似的东西。您可能还需要系统权限才能使其正常运行。

#!/bin/sh
docker ps --format '{{.ID}} ~ {{.Names}} ~ {{.Status}} ~ {{.Image}} '

另一种方法是将别名命令放在主目录中的.bash_profile文件中。这使得快捷方式可以移植而无需特殊权限

#!/bin/sh
alias dkps="docker ps --format '{{.ID}} ~ {{.Names}} ~ {{.Status}} ~ {{.Image}} '"

如果你是bash别名的新手,请查看此Bash Aliases

为了保持简洁,我将导入与docker相关的别名,而不是直接将它们添加到我的.bash_profile或.bash_aliases脚本中。
在我的.bash_profile脚本中,我只需添加以下内容即可加载我的新.docker_aliases文件。

if [  -f ~/.docker_aliases ]; then
    . ~/.docker_aliases
fi

在我的实际.bash_profile脚本中,我加载了其他别名,例如.git_aliases脚本。
这种方法也非常便携,因为您可以共享您的docker别名。

在介绍我自己的方便的docker别名之前,让我们创建一个容器样本集,我们可以使用它来测试别名。我们将使用Docker Stack命令和两个众所周知的服务Redis和MongoDB来实现。不要担心,如果你不熟悉它们,我们实际上不会使用它们。

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

启动我们的测试只需要执行docker堆栈部署并传递上面的compose脚本。我们用我们称之为“test”的堆栈名称结束命令。


方便的Docker别名_第1张图片
image.png

一旦docker stack加载,我们可以使用docker ps命令验证它


方便的Docker别名_第2张图片
image.png

注意:为简洁起见,我将缩写某些命令的输出。这具有创建更小图像的额外好处。所以请记住,上面的docker ps命令的输出比显示的长得多

我们可以使用docker stack rm命令拆除堆栈。


方便的Docker别名_第3张图片
image.png

看起来很容易,对吧?
在本文的其余部分中显示屏幕截图时,我将使用上面的设置。
现在我们的别名......这样更好是对的吗? 我们将看到的第一个别名只是为常见的docker命令提供缩写。
我们将看到的第一个别名只是为常见的docker命令提供缩写。

方便的Docker别名_第4张图片
image.png

马上就可以考虑每次使用 dk替换 dockerdocker ps之类的命令时,或者使用 dks来处理Docker服务命令(如docker service ls)时节省时间。键入dks的节省加起来!
因此,不要键入 docker log,而是键入: dkl b7a8
使用 dklf关注日志。
因此,而不是 docker logs -f b7a8,你可以简单地使用 dklf b7a8

另一个方便的日志记录别名是dkln(docker log by name)命令。

方便的Docker别名_第5张图片
image.png

它评估反引号(`)中的管道命令,并将结果用作docker logs命令的参数。该grep命令使用第一个参数来过滤docker ps命令的结果。最后,该awk命令将输出的第一个字段作为value参数。

好吧,这可能会令人困惑。让我们仔细看看。

该docker ps命令返回正在运行的容器列表。


方便的Docker别名_第6张图片
image.png

并docker ps | grep redis返回:


image.png

最后,docker ps | grep redis | awk '{print $1}'返回Redis的容器ID:f5f0ed387073
方便的Docker别名_第7张图片
image.png

这允许我们按名称查看任何容器的日志。


方便的Docker别名_第8张图片
image.png

当然,您需要确保没有多个与名称匹配的容器。如果这样做,那么只需dkl使用带有容器ID 的命令即可。

上面示例中的一个关键点是,您可以通过组合shell命令来构建一些非常强大的别名。当我们查看构建和发布容器的别名时,我们将在本文稍后看到另一个示例。

查看运行容器的状态是构建和测试容器化服务的重要部分。以下别名使我们更容易执行此操作。

在这篇文章的早些时候,我们查看了dkps(Docker PS)命令。

image.png

这是命令的作用:
image.png

另一个有用的别名是 dkstats(docker stats)命令:
方便的Docker别名_第9张图片
image.png

此命令测试是否提供参数,如果是,则应用grep过滤器
image.png

这允许我们查看所有容器的统计信息或按特定容器名称过滤。

该dktop命令呈现类似顶部的显示,显示内存,CPU,网络I / O和块I / O.

方便的Docker别名_第10张图片

实际的别名非常简单:
image.png

您可以使用您更愿意看到的值自由地进行 自定义。我选择了一个基本设置,以使显示屏整齐地安装在多窗格iTerm2屏幕中。

在建造集装箱的过程中,有时需要进入集装箱才能环顾四周。这样做通常涉及:

  • docker ps查看容器ID列表
  • docker exec -it {containerID} / bin / sh
使用我们的别名,这变为:
  • dkps
  • dke {containerID}
    这是一个视频示例:


    方便的Docker别名_第11张图片

有时需要重新启动服务。该dksb(搬运工服务弹跳)命令允许我们能够做到这一点。

执行此操作的非别名方法需要使用以下docker service scale命令:

$ docker service scale test_redis = 0 
$ docker service scale test_redis = 1

使用dksb我们只需输入:

$ dksb test_redis 1


我们要看的最后一件事是用于构建和发布docker容器的别名。虽然此过程通常涉及两阶段操作,即docker build / docker push,但您可能还需要执行其他任务以进一步自动化该过程。就我而言,我构建了托管NodeJS微服务的docker容器。我的本地构建的一部分涉及检查.dockerignore文件是否存在,然后查看Node package.json文件内部以提取项目的名称和版本。然后使用名称和版本来形成泊坞标签。

这是dkp(docker publish)别名的样子:

方便的Docker别名_第12张图片
image.png

上面的别名使用 jq(命令行JSON处理器)从package.json文件中提取版本信息。

使用dkp只需输入节点项目目录并键入,dkp然后输入docker hub存储库名称。在下面的示例中,我正在构建和发布HydraRouter docker容器。

1_P4VYcqkzufYWeeahgjgI_g.gif

我希望你在这篇文章中找到了一些方便的docker别名,或者至少它激发了你使用别名来优化你的命令行工作流程。因为记住 -  没有人有时间 ......

这是完整的 .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/\"//g'`
 NAME=`cat package.json | jq .name | sed 's/\"//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/\"//g'`
 NAME=`cat package.json | jq .name | sed 's/\"//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/\"//g'`
 NAME=`cat package.json | jq .name | sed 's/\"//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
}

你可能感兴趣的:(方便的Docker别名)