O problema está relacionado aos namespaces. O Docker os usa para isolar recursos, o que também significa que eles não contam para os totais do host.
Quando você executa iptables
no host, basicamente, você está apenas examinando o namespace do host, e os pacotes nos quais você está interessado são computados no namespace do contêiner. Para contornar esse problema, você pode usar ip netns
para ainda executar o iptables no host, mas no namespace de rede do contêiner.
Primeiro, ip netns
tem uma interface um pouco intuitiva. Para anexar ao namespace de um processo existente (neste caso, seu contêiner), você deve criar um link em /var/run/netns/
para o namespace do processo:
# ln -sf /proc/'docker inspect -f '{{ .State.Pid }}' YOUR_CONTAINER'/ns/net /var/run/netns/SOME_NAME
(você pode ter que mkdir /var/run/netns
)
Agora você está livre para executar o iptables no namespace do seu contêiner:
# ip netns exec SOME_NAME iptables -L -nv
Note que isso gera o conjunto de regras do iptables dentro do container, que provavelmente estará vazio.
Se você está usando atualmente --uid-owner apenas para ter contadores por usuário, você nem precisa mais dele, porque nesse caso os contadores de cadeia se aplicam apenas ao contêiner e devem ser suficientes.
Finalmente, você pode limpar /var/run/netns
.
Vários contêineres por usuário
Se você tiver vários contêineres por usuário e quiser agrupá-los, poderá iniciar seus contêineres com --net=container:OTHER_CONTAINER_FROM_USER
, para que os namespaces deles sejam mesclados.
Isso tem a desvantagem de mesclar todos os aspectos da pilha de rede, incluindo portas abertas, portanto, você não pode ter dois contêineres para o mesmo usuário que está ouvindo na mesma porta.
Se essa for uma limitação proibitiva, você poderá contar os contêineres individualmente e agrupar com base no uid mais tarde.
Você pode encontrar mais algumas informações sobre esse assunto aqui .