首页 > 解决方案 > Docker 网络架构:隔离容器、基于主机的路由

问题描述

当我不时与 docker 一起玩时,我遇到了一个无法进一步解决的问题

我想创建一个公共“云”,用户可以在其中创建自己的容器。该容器只是一个 http 应用程序,例如 nextcloud。

将容器彼此隔离并允许通过 docker 主机与 Internet 通信的最佳方法是什么,因此如有必要,我可以通过防火墙阻止一些 IP。

这应该适用于传入和传出连接。

我为此创建了一个设置,如下所述:docker macvlan - no route to host (container)但甚至无法使基本设置正常工作。

为了更好地理解,我创建了一个图表:

在此处输入图像描述

在此处输入图像描述

在 docker 主机上运行一个反向代理,它查找特定的 http 标头并将基于该标头的请求转发到所需的容器。

最大的问题是网络设置:我不知道 docker、主机以及需要配置什么才能使其正常工作。

linux下联网不是我的强项。

编辑:也许我遇到了 XY 问题(https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem

标签: dockernetworkingroutescontainersreverse-proxy

解决方案


我可能做的事情有点太容易了,但我认为你不需要为此使用 macvlan。每个容器的正常网络足以分隔所有容器。与主机的所有通信都将通过网关进行。

我只是为了好玩而进行了一些测试:

设置:

rm -f addresses.txt
for i in $( seq 1 5 ) ; do 
    docker network create test$i
done

for i in $( seq 1 5 ) ; do 
    docker run -d --rm \
        --name myspecialtest$i \
        --network test$i \
        alpine sleep 3600

    docker exec -it myspecialtest$i ifconfig eth0 \
        | grep -P -o 'inet addr:\d+\.\d+.\d+.\d+' \
        | cut -d: -f2 >> addresses.txt
done

测试:

for i in $( seq 1 5 ) ; do 
    for ipaddress in $( cat addresses.txt ); do
        docker exec -it myspecialtest$i \
            ping -w 5 $ipaddress
    done
done

清理:

for i in $( seq 1 5 ) ; do
    docker container rm -f myspecialtest$i
    docker network rm test$i
done

如您所见,容器只能 ping 自己,而不能 ping 其他容器。


推荐阅读