首页 > 解决方案 > docker 限制容器网络访问

问题描述

我在 docker 上创建了 2 个容器。我的这些容器在同一个网络中。我想限制这些容器访问我的本地网络。

例如; 容器 1 可以访问我的整个网络。但是容器 2 无法到达任何地方,只有我可以访问它。我无法从我的中央防火墙执行此操作,因为所有容器的源地址都是我的 docker 主机的 IP 地址。

我试着用 iptables 来做这件事。我为容器 1 添加了以下规则:

iptables -I DOCKER-USER -s 172.17.0.2 -j ACCEPT

我为容器 2 添加了以下规则:

iptables -I DOCKER-USER -s 172.17.0.4 -j DROP

当我这样做时,容器 1 可以访问我的网络,容器 2 无法访问我的网络。这就是我要的。但因此,容器 2 无法响应我的 TCP 请求,因此我无法访问它。

有针对这个的解决方法吗?

标签: dockeriptablesportainer

解决方案


听起来您正在寻找的是内部网络。内部网络明确限制对网络的外部访问。

你如何发挥它最终取决于你如何部署你的容器。如果您使用的是 docker-compose,那么您需要修改您的 docker-compose.yml 文件,使其看起来像这样:

version: '2'
services:
  app1:
    image: mysql:5.7
    networks:
      - network1 
        
  app2:
    image: someImage
    networks:
      - network1
      - network2
networks:
  network1:
    internal: true
  network2:

如果您正在通过命令行,那么您将创建一个这样的网络:

docker network create -d overlay --internal myprivatenetwork

然后以这种方式将其附加到您的容器中:

docker network connect myprivatenetwork app1

如果您正在寻找跨群体工作的东西,那么覆盖网络可能更适合您的需求。 根据文档

覆盖网络驱动程序在多个 Docker 守护程序主机之间创建分布式网络。该网络位于(覆盖)特定于主机的网络之上,允许连接到它的容器(包括 swarm 服务容器)在启用加密时安全地通信。

通过以下方式创建覆盖网络

docker network create -d overlay --attachable my-attachable-overlay

并且可以像上面提到的那样附加。


推荐阅读