根据端口获取对应的Docker容器名字

本脚本可根据服务器上运行的端口来获取端口对应的docker容器名,如下:

#!/bin/bash
: '
  @function: 根据TCP端口获取运行的docker容器名
  @author: gongguan
  @datetime: 2024-08-20
'
usage() {
    echo "Usage: $0 [OPTION]...."
    echo
    echo "Options:"
    echo "  -h,  --help     display this help and exit"
    echo "  -v,  --version  output version information and exit"
    echo "  -p   --port     specify the port,expample: sh $0 -p 1000"
}
#根据传过来的端口参数来获取容器的id
gdp(){
   dpid=$(netstat -lntup |grep -w $1 | sed -n "1p" | awk '{print $7}' | awk -F "/" '{print $1}')
   rs=$(netstat -lntup |grep -w $1  | awk '{print $7}' | awk -F "/" '{print $2}' | sed -n "1p")
   if [ -n "${rs}" ];then
       #如果获取的rs为docker-proxy,说明容器通过—p映射的端口
       if [[ "${rs}" = "docker-proxy" ]];then
           for i in $(docker ps -q)
           do
                  host_port=$(docker inspect ${i} | grep -i HostPort | grep -w $1 | sed -n "1p" |awk -F ":" '{print $2}' | sed "s/\"//g" | sed "s/ //g")
                  if [[ "$1" = "$host_port" ]];then
                      echo "当前端口所在容器ID为: $i"
                  fi
           done
       else    #否则,容器是通过--net=host来启动的
          pid=$(ps -fp ${dpid} | grep -v -i pid |awk '{print $2}')
          ppid=$(ps -fp ${dpid} | grep -v -i ppid |awk '{print $3}')
          #如果ppid为1,那么不是通过容器方式运行的,而是本地
          if [[ ${ppid} != 1 ]];then
              for i in $(docker ps -q)
              do
                    #在容器详情中发现了pid或者ppid,说明当前当前容器就是要找的
                    if [[ -n $(docker inspect ${i} | grep -E -w "${pid}|${ppid}") ]];then
                           echo "当前端口所在容器ID为: $i"
                    else
                           #如果没有pid或者ppid,可能是使用了centos这种基础镜像来重新构建的镜像,并在内部运行了某些端口,然后通过--net=host启动
                           host_port=$(docker inspect ${i} | grep -i HostPort | grep -w $1 | sed -n "1p" |awk -F ":" '{print $2}' | sed "s/\"//g" | sed "s/ //g")
                           if [[ "$1" = "$host_port" ]];then
                              echo "当前端口所在容器ID为: $i"
                           fi
                    fi
              done
          else
              echo "此端口可能运行在本地服务${rs}中!!!!!!"
          fi
       fi
  else 
     echo "没有发现$1端口(Port  $1 Not Found)!!!!!"
  fi
}
#如果脚本的参数为0,打印usage
if [  $# -eq 0  ];then
    usage
else 
    key="$1"
    case $key in
      -h | help)
      usage
      exit 0
      ;;
      -v | --version)
      echo "Script Version 1.0"
      exit 0
      ;;
      -p | --port )
      pt=$2
      if [ -n "$pt" ];then
         gdp "${pt}"
else 
         usage
      fi
      ;;
      *)
      echo "Error:  未知的选项: $1"
      echo
      echo
      usage
      exit 1
      ;;
   esac
fi

使用方法如下:

bah getdocker.sh -p 端口

标签