web-dev-qa-db-fra.com

nginx proxy_pass à un conteneur docker lié

J'ai deux conteneurs docker avec nginx. container1 est lié à container2. Docker ajoute ensuite une entrée à / etc/hosts que j'ai entrée dans la configuration nginx comme ceci:

server {
    location ~ ^/some_url/(.*)$ {
        proxy_pass http://container1/$1;
    }
}

Je peux ping container1 à partir de container2, mais nginx ne peut pas le résoudre:

* 1 aucun résolveur défini pour résoudre le conteneur 1

Comment puis-je proxy_pass une demande à un autre conteneur Docker?

25
Tim-Erwin

Utilisez un bloc en amont au lieu du nom du conteneur directement

upstream backend {
    server container1;
}
server {
    location ~ ^/some_url/(.*)$ {
        proxy_pass http://backend/$1;
    }
}

Cela devrait permettre à la résolution de noms normale de se produire, fournissant un moyen d'utiliser facilement les liens de docker avec nginx.

39
Bruce Stringer

Vous pouvez utiliser le service DNS Docker intégré, si activé, vérifiez votre résolveur de conteneur:

cat /etc/resolv.conf

Devrait être:

nameserver 127.0.0.11

Utilisez cette IP comme résolveur:

server {
    location ~ ^/some_url/(.*)$ {
        resolver 127.0.0.11;
        proxy_pass http://container1/$1;
    } }
35
Thomas Decaux

Vous devriez jeter un œil à cette réponse sur l'utilisation de/etc/hosts comme résolveur: tiliser/etc/hosts comme résolveur pour la réécriture d'URL

Fondamentalement, votre DNS ou votre résolveur n'utilise pas/etc/hosts pour résoudre les noms lors d'une recherche, mais vous pouvez contourner ce problème en installant dnsmasq et en utilisant 127.0.0.1 comme résolveur. Vous pouvez ajouter 127.0.0.1 comme résolveur directement dans votre configuration nginx:

server {
    location ~ ^/some_url/(.*)$ {
        resolver 127.0.0.1;
        proxy_pass http://container1/$1;
    }
}
8
Michael