当Linux服务器中运行多个docker容器的时候,如果通过-p的形式映射了端口,那么可以很方便的查找到当前端口对应的容器名,但是如果是通过--net=host方式运行的容器,那么很难根据端口来锁定到容器名,需要查找很久,因此写了一个脚本来根据端口获取docker容器名,个人在centos和ubuntu中测试通过,如果换其他环境,可能需要微调,内容如下:
#!/bin/bash: '@function: 根据TCP端口获取运行的docker容器名@author: gongguan@datetime: 2024-08-20'usage() {echo "Usage: $0 [OPTION]...."echoecho "Options:"echo " -h, --help display this help and exit"echo " -v, --version output version information and exit"echo " -p --port specify the port,expample: bash $0 -p 1000"}#根据传过来的端口参数来获取容器的idgdp(){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" ]];thenfor i in $(docker ps -q)dohost_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" ]];thenecho "当前端口所在容器ID为: $i"fidoneelse #否则,容器是通过--net=host来启动的pid=$(ps -fp ${dpid} | grep -v -i pid |awk '{print $2}')ppid=$(ps -fp ${dpid} | grep -v -i ppid |awk '{print $3}')if [[ ${ppid} != 1 ]];thenfor i in $(docker ps -q)doif [[ -n $(docker inspect ${i} | grep -E -w "${pid}|${ppid}") ]];thenecho "当前端口所在容器ID为: $i"fidoneelseecho "此端口可能运行在本地服务${rs}中!!!!!!"fifielseecho "没有发现$1端口(Port $1 Not Found)!!!!!"fi}#如果脚本的参数为0,打印usageif [ $# -eq 0 ];thenusageelsekey="$1"case $key in-h | help)usageexit 0;;-v | --version)echo "Script Version 1.0"exit 0;;-p | --port )pt=$2if [ -n "$pt" ];thengdp "${pt}"elseusagefi;;*)echo "Error: 未知的选项: $1"echoechousageexit 1;;esacfi
用法:
bash 脚本.sh -p 端口
实际运行如图:


注意:脚本使用了/bin/bash解析器,因此建议运行的时候也使用bash来运行,最好不用sh,比如centos中的sh实际解释器为bash,但是ubuntu实际解释为dash,因此用sh运行可能存在问题
文章转载自运维DevOps,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




