L'attribution vhosts à Docker ports
J'ai un wildcard DNS mis en place afin que toutes les requêtes web à un domaine personnalisé (*.foo) de la carte à l'adresse IP du Panneau d'accueil. Si j'ai plusieurs conteneurs de Apache (ou Nginx), chacune contenant des cartes de Apache port (80) pour certaines externe port entrant.
Ce que je voudrais faire est de faire une demande de conteneur-1.toto, qui est déjà associée à l'adresse IP correcte (du Panneau d'accueil) par l'intermédiaire de mon serveur DNS personnalisés, mais proxy le port 80 par défaut demande à la bonne Docker du port externe tels que la bonne Apache instance du conteneur spécifié est en mesure de répondre en fonction du domaine personnalisé. De même, un conteneur-2.foo n'proxy dans un second récipient de apache, et ainsi de suite.
Est-il un pré-construit solution pour cela est mon meilleur pari pour exécuter un proxy Nginx sur le Panneau d'accueil, ou devrais-je écrire un node.js proxy avec le potentiel pour gérer les conteneurs Docker (start/stop/reuild via le web), ou...? Quelles options dois-je le ferait en utilisant les conteneurs Docker plus comme un événement naturel, et non pas quelque chose avec des étrangers ports à conteneurs et de jonglage?
- J'ai aussi cette question - aussi loin que je peux dire, de l'exécution de chaque application dans un conteneur Docker et ensuite de faire le routage de l'hôte à l'aide d'un serveur nginx (peut-être dans son propre conteneur) est la manière de le faire. Je me demande si je dois exécuter le serveur d'application autonome (c'est à dire exposer un php-fpm, puma, etc. serveur) ou un (inutile?) nginx instance.
- Jetez un oeil à github.com/dotcloud/hipache, qui est un reverse-proxy configurable par l'intermédiaire d'redis.
Vous devez vous connecter pour publier un commentaire.
Cette réponse pourrait être un peu tard, mais ce que vous avez besoin est un système automatique de proxy inverse. J'ai utilisé deux solutions pour cela:
Avec le temps, ma préférence va à l'utilisation Traefik. Surtout parce qu'il est bien documenté et maintenu, et est livré avec des fonctionnalités en plus (l'équilibrage de charge avec les différentes stratégies et les priorités, healthchecks, disjoncteurs, automatique certificats SSL avec ACME/Let's Encrypt, ...).
À l'aide de jwilder/nginx-proxy
Lors de l'exécution d'un conteneur Docker Jason Wilder nginx-proxy Docker image, vous obtenez un nginx serveur qui est configuré comme un serveur proxy inverse pour les autres récipients avec pas de config à maintenir.
Il suffit d'exécuter vos autres récipients avec de l'
VIRTUAL_HOST
variable d'environnement et nginx-proxy découvrirez leur ip:port et mise à jour de la config nginx pour vous.Disons que votre DNS est configuré de sorte que
*.test.local
correspond à l'adresse IP de votre Panneau d'accueil, ensuite il suffit de commencer la suite de conteneurs pour obtenir une démonstration rapide en cours d'exécution:À L'Aide De Traefik
Lors de l'exécution d'un Traefik conteneur, vous obtenez un serveur proxy inverse qui va reconfigurer ses règles de transmission de donnée docker étiquettes trouvé sur vos contenants.
Disons que votre DNS est configuré de sorte que
*.test.local
correspond à l'adresse IP de votre Panneau d'accueil, ensuite il suffit de commencer la suite de conteneurs pour obtenir une démonstration rapide en cours d'exécution:-v /var/run/docker.sock:/tmp/docker.sock
Est-il dangereux de solution? Conteneur ce proxy nginx a accès au panneau de l'hôte du démon? Cela peut-il être possible faille de sécurité?/var/run/docker.sock
n'est pas une garantie que le panneau d'accueil ne peut pas être exploité à partir d'un conteneur. Panneau de sécurité est un sujet à part.Voici deux réponses possibles: (1) installation de ports directement avec Docker et l'utilisation de Nginx/Apache proxy les vhosts, ou (2) l'utilisation Dokku pour gérer les ports et les vhosts pour vous (ce qui est la façon dont j'ai appris à faire la Méthode 1).
Méthode 1a (directement affecter des ports avec menu fixe)
Étape 1: Installation de nginx.conf ou Apache sur l'hôte, avec les affectations de numéro de port. Ce serveur web, en cours d'exécution sur l'hôte, va faire le vhost de l'utilisation de proxy. Il n'y a rien de spécial au sujet de ce à l'égard de Docker - il est normal d'hébergement de serveur virtuel. La partie spéciale qui vient ensuite, dans l'Étape 2, pour faire Docker utiliser le bon numéro de port hôte.
Étape 2: Force affectations de numéro de port dans le menu fixe avec l'option "-p" pour régler le Panneau de mappages de port, et en "-e" pour définir des variables d'environnement dans le Panneau, comme suit:
Méthode 1b codée en Dur dans l'application de port
...si vous êtes à la demande utilise une codé en dur port, par exemple le port 5000 (c'est à dire ne peut pas être configuré via le PORT variable d'environnement, comme dans la Méthode 1a), alors il peut être codé en dur par le biais de Docker comme ceci:
Méthode 2 (laissez Dokku comprendre les ports)
À l'heure actuelle, une très bonne option pour la gestion du menu fixe vhosts est Dokku. Une prochaine option peut être d'utiliser Flynn, mais à partir de maintenant Flynn est juste de commencer, et pas tout à fait prêt. Donc, nous allons avec Dokku pour l'instant: Après la Dokku instructions d'installation, pour un seul domaine, permettre vhosts par la création de la "VHOST" fichier:
Maintenant, quand une application est poussé via SSH à Dokku (voir Dokku docs pour savoir comment faire), Dokku regarde le fichier VHOST et pour l'application particulière poussé (disons que vous avez poussé "conteneur-1"), il va générer le fichier suivant:
Et il aura le contenu suivant:
Lorsque le serveur est redémarré, Dokku permettra de s'assurer que le Panneau lance l'application avec le port mappé à son déploiement initial de port (49162 ici), plutôt que de se assignés au hasard à un autre port. Pour atteindre cet déterministe affectation, Dokku enregistre le initialement affecté port en
/home/git/container-1/PORT
et sur le prochain lancement il définit laPORT
de l'environnement à cette valeur, et aussi des cartes de Docker du port des affectations à ce port sur le côté hôte et l'application de leur côté. C'est par opposition à la première de lancement, lors de la Dokku sera misPORT=5000
et ensuite déterminer quel port aléatoire Dokku cartes sur le VPS côté de 5000 sur le côté app. C'est autour (et pourrait changer dans le futur), mais ça fonctionne!La façon VHOST œuvres, sous le capot, est: sur un git push de l'application via SSH, Dokku exécutera les crochets qui vivent dans
/var/lib/dokku/plugins/nginx-vhosts
. Ces crochets sont également situés dans la Dokku code source ici et sont responsable de la rédaction dunginx.conf
fichiers avec le bon serveur virtuel paramètres. Si vous n'avez pas ce répertoire sous/var/lib/dokku
, puis essayez d'exécuterdokku plugins-install
.Avec docker, vous voulez l'ip interne pour rester "normal" (p. 80) et de comprendre comment câbler les ports aléatoires.
Une façon de les gérer, c'est avec un reverse proxy comme hipache. Pointez votre dns, et alors vous pouvez reconfigurer le proxy que vos contenants venir en haut et en bas. Jetez un oeil à http://txt.fliglio.com/2013/09/protyping-web-stuff-with-docker/ pour voir comment cela pourrait fonctionner.
Si vous êtes à la recherche de quelque chose de plus robuste, vous pouvez prendre un coup d'oeil à "la découverte du service." (un coup d'oeil à la découverte de service avec docker: http://txt.fliglio.com/2013/12/service-discovery-with-docker-docker-links-and-beyond/)