如何限制直接访问Docker容器,仅允许通过Kubernetes Pod访问?
限制Docker容器仅允许通过Kubernetes Pod访问的方案
1. 取消Docker容器的主机端口映射
你的容器当前通过-p 8080:8080参数绑定了主机端口,导致本地可直接访问。只需停止现有容器,重新启动时不映射主机8080端口:
# 停止并删除现有容器(替换为你的容器ID/名称) docker stop <container-id/name> docker rm <container-id/name> # 重新启动容器,不映射主机端口 docker run -d --name <your-container-name> <your-image>
此时容器的8080端口仅在Docker内部网络可见,主机无法直接访问,只有K8s Pod能通过Docker内部网络或集群连通的网络访问容器。
2. 将应用迁移至Kubernetes管理(推荐)
直接把应用部署为K8s Deployment和Service,彻底替代单独运行的Docker容器,所有访问统一通过K8s的NodePort(32729)进行:
编写Deployment和Service配置文件
# app-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: app-deployment spec: replicas: 1 selector: matchLabels: app: your-app template: metadata: labels: app: your-app spec: containers: - name: your-app image: <your-image-tag> ports: - containerPort: 8080 --- # app-service.yaml apiVersion: v1 kind: Service metadata: name: app-service spec: type: NodePort selector: app: your-app ports: - port: 8080 targetPort: 8080 nodePort: 32729 # 指定你需要的端口
部署到Kubernetes集群
kubectl apply -f app-deployment.yaml kubectl apply -f app-service.yaml
部署完成后,删除单独运行的Docker容器,即可通过http://localhost:32729/swagger/index.html正常访问,主机无法直接访问原容器的8080端口。
3. 用防火墙规则限制主机8080端口访问
如果必须保留容器的端口映射,可通过主机防火墙仅放行K8s Pod所在IP段的访问:
# 允许K8s Pod网段访问8080端口(替换为你的集群Pod网段,如10.244.0.0/16) iptables -A INPUT -p tcp --dport 8080 -s 10.244.0.0/16 -j ACCEPT # 拒绝其他所有对8080端口的请求 iptables -A INPUT -p tcp --dport 8080 -j DROP
这样本地直接访问http://localhost:8080/swagger/index.html会被拦截,仅K8s Pod能通过该端口访问容器。
内容的提问来源于stack exchange,提问作者Shujaat Ali
相关产品推荐
相关产品推荐

