Então, eu tenho uma rede docker chamada home
onde todos os meus contêineres baseados em raiz (ou contêineres docker que eram simplesmente muito difíceis de portar para o podman) ficam armazenados.
sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
9d5788b45048 bridge bridge local
b1f4756feab4 home bridge local
5d7ee6579f19 host host local
8678a773e2f2 none null local
E, para o podman, tenho uma configuração muito semelhante.
podman network ls
NETWORK ID NAME DRIVER
8b17ae3d5d67 home bridge
2f259bab93aa podman bridge
O problema? Bem, acontece que minha resolução de nomes para contêineres não funciona de uma rede para outra. Então, por exemplo, eu tenho o nginx-proxy-manager
podman em execução e quero redirecionar http://domain/freshrss
para o serviço freshrss especificando freshrss
e o número da porta associado. Isso não funciona, e isso faz sentido para mim, pois a rede docker e a rede podman são fundamentalmente separadas uma da outra.
Então, minha pergunta é simples: Existe alguma maneira de tratar essas duas redes como uma rede unindo-as sem prejudicar a santidade das configurações de rede individualizadas ? Alternativamente, existe alguma maneira de contornar esse problema de comunicação sem ter que especificar novamente o nome de domínio no nome e na porta de encaminhamento? Por exemplo, pensei que encaminhar para 127.0.0.1:<freshrss port>
funcionaria, pois iria para o host e, em seguida, conectaria à porta apropriada, mas isso não funcionou.
docker/podman compose
Respostas personalizadas são bem-vindas, pois é assim que estou configurando meus serviços.
127.0.0.1
, dentro de um contêiner, sempre significa "este contêiner" (a menos que você esteja executando no modo de rede do host). Se você quiser referenciar uma porta que é publicada no host, então você precisa usar um endereço IP atribuído a uma das suas interfaces de host. Você pode usar o nome mágico do hosthost.docker.internal
em muitos casos para se referir ao seu host; em versões recentes do Podman, isso está disponível por padrão, e no Docker está disponível se (a) você estiver usando o Docker Desktop no Windows ou MacOS, ou (b) você estiver no Linux e incluir--add-host host.docker.internal:host-gateway
na suadocker run
linha de comando.Isso significa que se você executar um contêiner como este:
Então, a partir de um contêiner podman ou docker, você pode acessar o serviço assim:
Não há uma maneira fácil de fazer a resolução de nomes funcionar entre os dois ambientes.
A solução mais fácil é escolher apenas um dos podman ou docker. Não está claro na sua pergunta por que você está usando ambos. Note que isso
docker compose
funcionará perfeitamente com o Podman como seu mecanismo de contêiner se você habilitar a API de compatibilidade do docker.Aqui estamos habilitando o soquete do usuário podman (não root) e configurando um contexto do docker que aponta para o soquete:
Podemos apontar a
DOCKER_HOST
variável de ambiente para o soquete podman:E agora os comandos do docker irão interagir com o podman. Por exemplo:
O
docker context
comando permite que você crie configurações nomeadas que se referem a diferentes sockets remotos. Podemos criar umpodman-user
contexto como este:Se ativarmos o contexto:
Todos os comandos Docker subsequentes operarão contra o soquete podman. Você pode então
docker context use default
alternar de volta para o contexto padrão que se conecta ao seu daemon Docker local.