检查网络端口被哪个程序占用
操作简介
1
2
3
4
5
|
# 查看进程占用的 80 端口
sudo ss -tlnp | grep ":80\b"
# 查看 Docker 占用的 80 端口
sudo docker ps | grep ":80->"
|
问题详解
一台主机上,如果 2 个程序绑定相同 ip_address:port
,是无法同时运行的,我们经常需要在安装程序之前检查端口是否空闲。运行 Docker 容器映射端口时,也会存在同样的问题。下面是运行 Docker 容器重复映射 80 端口的报错:
1
2
3
|
$ docker run -p 80:80 -d nginx
...
Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use.
|
这里我们用网络工具 ss
来进行排查,它是 netstat
的替代者。ss -tln
可以查看主机正在监听的 TCP 端口,通过过滤器可以筛选出 80 端口:
1
2
3
4
|
sudo ss -tlnp sport = :80
# 或者使用 grep 进行过滤
sudo ss -tlnp | grep ":80\b"
|
1
2
|
$ sudo ss -tlnp | grep ":80\b"
LISTEN 0 128 *:80 *:* users:(("docker-proxy",pid=13256,fd=4))
|
没有输出表示端口空闲。如果输出包括 apache
或者 nginx
,则需要停掉相关的服务。上面的输出包含 docker
相关进程,还需要找到对应的容器:
1
|
sudo docker ps | grep ":80->"
|
1
2
|
$ sudo docker ps | grep ":80->"
d25cdf73b351 nginx "nginx -g 'daemon of…" 0.0.0.0:80->80/tcp nginx-test
|
发现容器 d25cdf73b351
映射了 80 端口,然后停止或删除容器:sudo docker stop d25cdf73b351
ss 常用选项介绍
1
2
3
4
5
6
|
-n, --numeric 不解析服务名,始终显示端口数字
-a, --all 显示所有 sockets
-l, --listening 显示监听的 sockets
-p, --processes 显示所属进程,需要 root 权限
-t, --tcp 仅显示 tcp sockets
-u, --udp 仅显示 udp sockets
|