根据端口获取对应的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 端口


