美文网首页
方便的Docker别名

方便的Docker别名

作者: JaeGwen | 来源:发表于2019-04-09 15:35 被阅读0次

    原文链接: 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”的堆栈名称结束命令。


    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屏幕中。

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

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


    有时需要重新启动服务。该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 {{.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别名

          本文链接:https://www.haomeiwen.com/subject/qegbiqtx.html