Joe Blog

原文链接: 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 ' ~  ~  ~  '

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

#!/bin/sh
alias dkps="docker ps --format ' ~  ~  ~  '"

如果你是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”的堆栈名称结束命令。 image.png 一旦docker stack加载,我们可以使用docker ps命令验证它 image.png

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

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

看起来很容易,对吧? 在本文的其余部分中显示屏幕截图时,我将使用上面的设置。 现在我们的别名……这样更好是对的吗? 我们将看到的第一个别名只是为常见的docker命令提供缩写。 我们将看到的第一个别名只是为常见的docker命令提供缩写。 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)命令。 image.png 它评估反引号(`)中的管道命令,并将结果用作docker logs命令的参数。该grep命令使用第一个参数来过滤docker ps命令的结果。最后,该awk命令将输出的第一个字段作为value参数。

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

该docker ps命令返回正在运行的容器列表。 image.png 并docker ps | grep redis返回: image.png 最后,docker ps | grep redis | awk ‘{print $1}’返回Redis的容器ID:f5f0ed387073 image.png 这允许我们按名称查看任何容器的日志。 image.png 当然,您需要确保没有多个与名称匹配的容器。如果这样做,那么只需dkl使用带有容器ID 的命令即可。

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

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

在这篇文章的早些时候,我们查看了dkps(Docker PS)命令。 image.png 这是命令的作用: image.png 另一个有用的别名是dkstats(docker stats)命令: image.png 此命令测试是否提供参数,如果是,则应用grep过滤器 image.png 这允许我们查看所有容器的统计信息或按特定容器名称过滤。

该dktop命令呈现类似顶部的显示,显示内存,CPU,网络I / O和块I / O. 实际的别名非常简单: image.png 您可以使用您更愿意看到的值自由地进行自定义。我选择了一个基本设置,以使显示屏整齐地安装在多窗格iTerm2屏幕中。

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

有时需要重新启动服务。该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)别名的样子: 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 \t\t\t"'
alias dkps="docker ps --format ' ~  ~  ~ '"

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 \t\t  \t\t"
}

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
}