分享一个查看容器对外网络连接情况的shell脚本

33 篇文章 2 订阅
26 篇文章 1 订阅

将应用封装到容器内运行可以极大的提升应用的可移植性、可维护性,但是在宿主机上运行netstat或ss指令就无法抓取到容器对外的网络连接情况了。本文分享一个在宿主机上运行查看容器对外网络连接情况的shell脚本。

一、直接上脚本

"vi checklink.sh"写入shell脚本文件,内容如下:

#!/bin/bash
##__author__='daigjianbing'

function check_netlink {
# 遍历容器名
for container_name in `docker ps | awk 'NR > 1 {print $NF}'`
do
# 查询容器cid
container_id=$(docker ps -aqf "name=$container_name")
echo "##############start##################"
echo "Check container:$container_name( container_id:$container_id ) now!"

# 在容器内执行网络查询命令,如果容器内没有netstat命令执行出错则继续执行ss
echo "# netstat -antup"
docker exec $container_id netstat -antup ||docker exec $container_id ss -antup
echo "##############end#################"
done
}

check_netlink 

二、测试运行

1、本机环境,可以看到有一个应用容器和一个数据库容器

# cat /etc/os-release
NAME="openEuler"
VERSION="22.03 LTS"
ID="openEuler"
VERSION_ID="22.03"
PRETTY_NAME="openEuler 22.03 LTS"
ANSI_COLOR="0;31"

# docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                    NAMES
70cd3d673f84        phpipam/phpipam-www:1.5x   "/sbin/tini -- /bin/…"   3 months ago        Up 3 months         0.0.0.0:80->80/tcp       ipam
c5fb20613b5d        mariadb:10.5.18            "docker-entrypoint.s…"   3 months ago        Up 3 months         0.0.0.0:3306->3306/tcp   mysqldb

2、测试运行

root权限执行sh checklink.sh,输出结果如下:

##############start##################
Check container:ipam( container_id:70cd3d673f84 ) now!
# netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      20/httpd
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      20/httpd
tcp        0      0 172.17.0.2:46502        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46460        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46506        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:80           192.168.17.234:64623     ESTABLISHED -
tcp        0      0 172.17.0.2:46468        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46518        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46440        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46464        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46532        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46498        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46436        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46484        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46522        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46528        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46428        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46494        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46472        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46488        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46480        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46432        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46452        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46476        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46444        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:80           192.168.17.234:64614     TIME_WAIT   -
tcp        0      0 172.17.0.2:46514        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:46456        192.168.17.241:3306      TIME_WAIT   -
tcp        0      0 172.17.0.2:80           192.168.17.234:64631     TIME_WAIT   -
tcp        0      0 172.17.0.2:46510        192.168.17.241:3306      TIME_WAIT   -
##############end#################
##############start##################
Check container:mysqldb( container_id:c5fb20613b5d ) now!
# netstat -antup
OCI runtime exec failed: exec failed: container_linux.go:330: starting container process caused "exec: \"netstat\": executable file not found in $PATH": unknown
Netid State     Recv-Q Send-Q       Local Address:Port        Peer Address:Port Process                                                                         
tcp   LISTEN    0      152                      *:3306                   *:*                                                                                    
tcp   TIME-WAIT 0      0      [::ffff:172.17.0.3]:3306 [::ffff:172.17.0.1]:51276                                                                                
tcp   TIME-WAIT 0      0      [::ffff:172.17.0.3]:3306 [::ffff:172.17.0.1]:51200                                                                                
tcp   TIME-WAIT 0      0      [::ffff:172.17.0.3]:3306 [::ffff:172.17.0.1]:51242                                                                                
##############end#################

3、数据分析示例

172.17.0.2为应用容器ipam,172.17.0.3为数据库容器mysqldb,宿主机实ip为192.168.17.241。可见数据库容器mysqldb仅有ipam容器通过宿主机172.17.0.1访问其172.17.0.3;3306端口的内部连接。应用容器ipam则有连接数据库容器192.168.17.241:3306的连接和来自外部192.168.17.234访问其80端口的连接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个简单的自动启停Docker容器Shell脚本: ``` #!/bin/bash # 定义变量 CONTAINER_NAME="my-container" # 容器名称 IMAGE_NAME="my-image" # 镜像名称 DOCKERFILE_PATH="/path/to/Dockerfile" # Dockerfile文件路径 DOCKERFILE_DIR=$(dirname $DOCKERFILE_PATH) # Dockerfile所在目录 # 检查容器是否已经运行 if [ "$(docker ps -q -f name=$CONTAINER_NAME)" ]; then # 如果容器已经运行,停止并删除容器 echo "Stopping and removing container: $CONTAINER_NAME" docker stop $CONTAINER_NAME docker rm $CONTAINER_NAME fi # 检查镜像是否存在,如果不存在则构建镜像 if [ ! "$(docker images -q $IMAGE_NAME)" ]; then # 如果镜像不存在,构建镜像 echo "Building image: $IMAGE_NAME" docker build -t $IMAGE_NAME $DOCKERFILE_DIR fi # 启动容器 echo "Starting container: $CONTAINER_NAME" docker run -d --name $CONTAINER_NAME -p 80:80 $IMAGE_NAME ``` 上述脚本包含了以下几个步骤: 1. 定义变量:定义了容器名称、镜像名称、Dockerfile文件路径等变量。 2. 检查容器是否已经运行:使用`docker ps`命令检查容器是否已经运行,如果已经运行,则停止并删除容器。 3. 检查镜像是否存在:使用`docker images`命令检查镜像是否已经存在,如果不存在,则使用`docker build`命令构建镜像。 4. 启动容器:使用`docker run`命令启动容器,并将容器端口映射到主机的80端口上。 您可以将上述代码保存为一个`.sh`文件,并使用`chmod +x`命令将其设置为可执行文件,然后在命令行中执行该脚本即可自动启停Docker容器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代先生.重庆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值