打印出docker ps 显示出的运行容器的开放的端口号,up状态,和名字,不显示Port Status Names
时间: 2023-12-10 21:42:51 浏览: 199
可以使用以下命令来显示运行容器的开放端口、状态和名称:
```
docker ps --format '{{.Ports}} {{.Status}} {{.Names}}' | sed 's/0\.0\.0\.0://g' | awk '{print $1 " " $2 " " $3}'
```
该命令的输出将显示每个容器的端口、状态和名称,其中端口不包含 "0.0.0.0",并且每个字段由空格分隔。
相关问题
写一个linux脚本,查看k8s、docker所有占用的端口号,包括使用ss、netstat命令查不到的
### 回答1:
这是一个可以实现您要求的脚本。注意,这个脚本需要使用 sudo 权限执行,因为它需要访问系统底层的信息。
```bash
#!/bin/bash
# 查看所有已经使用的端口
echo "Using netstat:"
netstat -tulpn
echo
# 查看所有正在运行的 Docker 容器使用的端口
echo "Using Docker:"
docker ps --format '{{.Names}}: {{.Ports}}'
echo
# 查看所有在 Kubernetes 集群中的 Pod 使用的端口
echo "Using Kubernetes:"
kubectl get pods --all-namespaces -o jsonpath='{.items[*].spec.containers[*].ports[*].containerPort}'
```
执行这个脚本之后,您将能够看到所有使用的端口。使用 netstat 命令可以查看系统中所有已经使用的端口,使用 Docker 命令可以查看所有正在运行的 Docker 容器使用的端口,使用 Kubernetes 命令可以查看所有在 Kubernetes 集群中的 Pod 使用的端口。
### 回答2:
以下是一个可以查看k8s和docker所有占用的端口号的Linux脚本:
```shell
#!/bin/bash
# 首先获取k8s的所有Pod列表
k8s_pods=$(kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}')
# 遍历每个Pod,获取其IP地址和端口号
for pod in $k8s_pods; do
pod_ip=$(kubectl describe pod $pod --namespace $(kubectl get pods -o jsonpath="{.items[?(@.metadata.name=='$pod')].metadata.namespace}") | grep IP: | awk '{print $2}')
echo "Kubernetes Pod: $pod"
echo "IP地址: $pod_ip"
# 获取Pod的网络命名空间
pid=$(kubectl get pod $pod --namespace $(kubectl get pods -o jsonpath="{.items[?(@.metadata.name=='$pod')].metadata.namespace}") -o jsonpath="{.metadata.annotations['kubernetes\.io/config\.mirror']}" | awk -F / '{print $(NF)}')
# 使用nsenter进入网络命名空间,查找该命名空间下所有的端口号
sudo nsenter -t $pid -n ss -tln | awk 'NR>1 {split($4,arr,":"); print arr[length(arr)]}'
done
# 获取所有的docker容器ID
docker_containers=$(docker ps -q)
# 遍历每个容器,获取其IP地址和端口号
for container in $docker_containers; do
container_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $container)
echo "Docker容器: $container"
echo "IP地址: $container_ip"
# 使用docker exec进入容器,查找该容器下所有的端口号
sudo docker exec $container ss -tln | awk 'NR>1 {split($4,arr,":"); print arr[length(arr)]}'
done
```
运行该脚本后,会依次输出k8s的每个Pod的名称、对应的IP地址以及占用的端口号;然后输出每个docker容器的ID、对应的IP地址以及占用的端口号。注意运行该脚本需要具有足够的权限,可能需要使用sudo命令。
### 回答3:
要编写一个Linux脚本来查看K8s和Docker所有占用的端口号,包括无法通过ss和netstat命令找到的端口。
下面是一个示例脚本:
```shell
#!/bin/bash
# 获取K8s中的所有容器ID
k8s_pods=$(kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}')
for pod in $k8s_pods; do
# 获取容器的PID
pid=$(kubectl get pod $pod -o jsonpath='{.status.containerStatuses[0].containerID}' | cut -d/ -f3)
# 处理容器的网络命名空间
if [ -z "$pid" ]; then
continue
fi
ns_path="/var/run/netns/$pid"
if [ ! -e "$ns_path" ]; then
mkdir -p "$(dirname "$ns_path")" # 创建目录
ln -s /proc/$pid/ns/net "$ns_path" # 建立软链接
fi
# 获取容器的占用端口号
ports=$(nsenter -n -t $pid ss -lntp | awk 'NR>1{print $5}' | cut -d: -f2)
if [ -n "$ports" ]; then
echo "K8s Pod $pod is using ports $ports"
fi
rm "$ns_path" # 删除软链接
done
# 获取Docker中的所有容器ID
docker_containers=$(docker ps -q)
for container in $docker_containers; do
# 获取容器的占用端口号
ports=$(docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}}{{(index $conf 0).HostPort}} {{end}}' $container)
if [ -n "$ports" ]; then
echo "Docker Container $container is using ports $ports"
fi
done
```
该脚本首先通过kubectl命令获取K8s中的所有容器ID,并使用nsenter命令进入容器的网络命名空间。然后使用ss命令找到容器占用的端口号,最后输出结果。
接下来,脚本使用docker命令获取Docker中的所有容器ID,并使用docker inspect命令获取容器的占用端口号,同样输出结果。
注意,为了运行该脚本,需要确保你拥有足够的权限来执行这些命令,并且在运行脚本之前,确保已经安装了kubectl、nsenter和Docker。
docker grafana localhost 打不开
如果您在本地运行Grafana Docker容器,并且无法通过localhost打开它,可能是因为Docker容器没有正确映射端口到本地。您可以尝试以下步骤来解决这个问题:
1. 确保Grafana Docker容器正在运行。您可以使用以下命令来检查容器的状态:
```
docker ps
```
如果Grafana容器正在运行,则应该能够看到类似于以下内容的输出:
```
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1b5f43f9b4f2 grafana/grafana "/run.sh" 5 minutes ago Up 5 minutes 0.0.0.0:3000->3000/tcp, 80/tcp grafana
```
2. 检查Docker容器的端口映射是否正确。在上面的示例输出中,我们可以看到Grafana容器将端口3000映射到本地主机上的端口3000上。确保您使用的是正确的端口号。
3. 如果端口映射正确,但您仍然无法访问Grafana,则可能是防火墙导致的。请确保您的防火墙已允许端口3000的传入流量。您可以使用以下命令打开端口3000:
```
sudo firewall-cmd --zone=public --add-port=3000/tcp --permanent
sudo firewall-cmd --reload
```
如果您使用的是其他防火墙软件,请查阅相应的文档了解如何打开端口。
4. 最后,请在浏览器中尝试访问以下URL:http://localhost:3000。如果一切正常,您应该能够看到Grafana的登录页面。如果您仍然无法访问,请尝试使用IP地址代替localhost。
阅读全文