问题描述
曾经用docker部署过Nginx,用docker stop和docker rm命令停止并删除了容器。但是之后部署rancher的时候提示80端口被占用。
$ docker run -d --privileged --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher
fe8b473d8f5a855e1fe2fd8ba445affa4c2a8782b5c5af051240453044b7429a
docker: Error response from daemon: driver failed programming external connectivity on endpoint beautiful_wilson (db7dace3bb33ebaf0d42ee00f6f3d2eef2bd5b19dd0cce84b9c0ec3e9d35e49b): Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use.
方法1 - lsof
用lsof -i:端口ID
。
不是root的话,该命令什么反应都没有。
$ lsof -i:80
要在前面填上sudo
。
$ sudo lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1133 root 6u IPv4 47894 0t0 TCP *:http (LISTEN)
nginx 1134 nginx 6u IPv4 47894 0t0 TCP *:http (LISTEN)
nginx 1135 nginx 6u IPv4 47894 0t0 TCP *:http (LISTEN)
用PID杀死进程( 似乎只杀第一个user是root的就行。因为杀第二个的时候报 “ No such process ” )
$ sudo kill 1133
再次用lsof的时候发现没有返回值了
$ sudo lsof -i:80
这样就已经把80端口的进程杀掉了,运行rancher的时候不再报错
$ docker run -d --privileged --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher
70a423081911401342c7f6327c6f55fd903053dc5b88a2aa1f1cd5edbc35c564
方法2 - netstat
用netstat -tanlp
。
会发现不是root的话80端口的PID/Program name一栏是“-” 。
$ netstat -tanlp
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
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 -
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN -
tcp 0 0 192.168.73.137:40264 34.107.221.82:80 TIME_WAIT -
tcp 0 0 192.168.73.137:40260 34.107.221.82:80 TIME_WAIT -
tcp 0 0 192.168.73.137:60804 52.36.14.43:443 ESTABLISHED 2127/firefox
tcp6 0 0 ::1:631 :::* LISTEN -
然后根据提示用sudo netstat -tanlp
即可查看。再像方法1那样用sudo kill PID编号
杀死进程即可