暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

通过Linux端口来获取实际的容器名

运维DevOps 2024-08-20
91

当Linux服务器中运行多个docker容器的时候,如果通过-p的形式映射了端口,那么可以很方便的查找到当前端口对应的容器名,但是如果是通过--net=host方式运行的容器,那么很难根据端口来锁定到容器名,需要查找很久,因此写了一个脚本来根据端口获取docker容器名,个人在centos和ubuntu中测试通过,如果换其他环境,可能需要微调,内容如下:

    #!/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: bash $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}')
    if [[ ${ppid} != 1 ]];then
    for i in $(docker ps -q)
    do
    if [[ -n $(docker inspect ${i} | grep -E -w "${pid}|${ppid}") ]];then
    echo "当前端口所在容器ID为: $i"
    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

    用法:

      bash 脚本.sh -p 端口

      实际运行如图:

      注意:脚本使用了/bin/bash解析器,因此建议运行的时候也使用bash来运行,最好不用sh,比如centos中的sh实际解释器为bash,但是ubuntu实际解释为dash,因此用sh运行可能存在问题

      文章转载自运维DevOps,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论