recherche

Maison  >  Questions et réponses  >  le corps du texte

Il existe plusieurs conteneurs de sites Web différents exécutés sur un hôte Docker. Comment transférer correctement le trafic des ports 80 et 443 vers les conteneurs correspondants ?

Aide. . S'il existe un tutoriel rédigé par Dalao, vous pouvez également poster le lien vers l'article. . Après une partie de Baidu, je suis tombé dans le coma. .

PHP中文网PHP中文网2745 Il y a quelques jours1386

répondre à tous(2)je répondrai

  • 習慣沉默

    習慣沉默2017-06-20 10:07:52

    折腾了一个下午,找到了docker的解决方案
    github:https://github.com/JrCs/docke...

    把重要重点部分摘出来

    Conteneurs séparés (méthode recommandée)

    Le proxy nginx peut également être exécuté en tant que deux conteneurs distincts en utilisant l'image jwilder/docker-gen
    et l'image officielle nginx.

    Vous souhaiterez peut-être faire cela pour éviter que le socket docker ne soit lié à un service de conteneur exposé publiquement (évitez de monter le socket docker dans le conteneur exposé nginx). C'est mieux d'un point de vue sécurité.

    Pour exécuter le proxy nginx en tant que conteneur distinct, vous aurez besoin de :

    1) Pour monter le fichier modèle nginx.tmpl dans le conteneur docker-gen. Vous pouvez obtenir le dernier nginx.tmpl officiel avec une commande telle que :

    curl https://raw.githubusercontent.com/jwilder/nginx-proxy/master/nginx.tmpl > /path/to/nginx.tmpl

    2) Définissez la variable d'environnement NGINX_DOCKER_GEN_CONTAINER sur le nom ou l'identifiant du conteneur docker-gen.

    Exemples :

    • Premier démarrage de nginx (image officielle) avec les volumes :

    $ docker run -d -p 80:80 -p 443:443 \
        --name nginx \
        -v /etc/nginx/conf.d  \
        -v /etc/nginx/vhost.d \
        -v /usr/share/nginx/html \
        -v /path/to/certs:/etc/nginx/certs:ro \
        --label com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true \
        nginx
    • Deuxièmement, démarrez le conteneur docker-gen avec les volumes partagés et le fichier modèle :

    $ docker run -d \
        --name nginx-gen \
        --volumes-from nginx \
        -v /path/to/nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro \
        -v /var/run/docker.sock:/tmp/docker.sock:ro \
        jwilder/docker-gen \
        -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
    • Ensuite, démarrez ce conteneur (la variable NGINX_DOCKER_GEN_CONTAINER doit contenir le nom ou l'identifiant du conteneur docker-gen) :

    $ docker run -d \
        --name nginx-letsencrypt \
        -e "NGINX_DOCKER_GEN_CONTAINER=nginx-gen" \
        --volumes-from nginx \
        -v /path/to/certs:/etc/nginx/certs:rw \
        -v /var/run/docker.sock:/var/run/docker.sock:ro \
        jrcs/letsencrypt-nginx-proxy-companion

    Ensuite, démarrez tous les conteneurs à proxy comme décrit précédemment.

    • Si pour une raison quelconque vous ne pouvez pas utiliser l'option docker --volumes-from, vous pouvez spécifier le nom ou l'identifiant du conteneur nginx avec la variable NGINX_PROXY_CONTAINER.

    Chiffrons

    Pour utiliser le service Let's Encrypt pour créer automatiquement un certificat valide pour les hôtes virtuels.

    Définissez les variables d'environnement suivantes pour activer la prise en charge de Let's Encrypt pour un conteneur proxy. Ces variables d'environnement doivent être déclarées dans chaque conteneur d'application à proxy.

    • LETSENCRYPT_HOST

    • LETSENCRYPT_EMAIL

    La variable LETSENCRYPT_HOST variable most likely needs to be the same as the VIRTUAL_HOST doit très probablement être la même que la variable VIRTUAL_HOST et doit être un domaine accessible au public. Spécifiez plusieurs hôtes avec un délimiteur virgule.

    Les variables d'environnement suivantes sont facultatives et paramétrent le fonctionnement du client Let's Encrypt.

    • LETSENCRYPT_KEYSIZE

    La variable LETSENCRYPT_KEYSIZE détermine la taille de la clé demandée (en bits, par défaut 4096).

    certificats multi-domaines (SAN)

    Si vous souhaitez créer des certificats multi-domaines (SAN), ajoutez le domaine de base comme premier domaine de la LETSENCRYPT_HOST variable d'environnement.

    certificats de test

    Si vous souhaitez créer des certificats de test qui n'ont pas les limites de 5 certificats/semaine/domaine, définissez le LETSENCRYPT_TEST environment variable with a value of true (dans les conteneurs où vous demandez des certificats avec LETSENCRYPT_HOST). Si vous souhaitez faire cela globalement pour tous les conteneurs, définissez ACME_CA_URI comme décrit ci-dessous.

    Renouvellement automatique du certificat

    Toutes les heures (3600 secondes), les certificats sont vérifiés et chaque certificat qui expirera dans les 30 prochains jours (90 jours / 3) est renouvelé.

    Exemple :
    $ docker run -d \
        --name example-app \
        -e "VIRTUAL_HOST=example.com,www.example.com,mail.example.com" \
        -e "LETSENCRYPT_HOST=example.com,www.example.com,mail.example.com" \
        -e "LETSENCRYPT_EMAIL=foo@bar.com" \
        tutum/apache-php

    Variables d'environnement de conteneur facultatives

    Variables d'environnement de conteneur Letsencrypt-nginx-proxy-companion facultatives pour une configuration personnalisée.

    • ACME_CA_URI - Directory URI for the CA ACME API endpoint (default: https://acme-v01.api.letsencrypt.org/directory). If you set it's value to https://acme-staging.api.letsencrypt.org/directory Letsencrypt utilisera des serveurs de test qui n'ont pas les limites de 5 certificats/semaine/domaine. Vous pouvez également créer des certificats de test par conteneur (voir Chiffrons les certificats de test)

    Par exemple

    $ docker run -d \
        -e "ACME_CA_URI=https://acme-staging.api.letsencrypt.org/directory" \
        -v /path/to/certs:/etc/nginx/certs:rw \
        --volumes-from nginx-proxy \
        -v /var/run/docker.sock:/var/run/docker.sock:ro \
        jrcs/letsencrypt-nginx-proxy-companion
    • DEBUG - Set it to true pour activer le débogage du script du point d'entrée et la génération de certificats LetsEncrypt, ce qui pourrait vous aider à identifier tout problème de configuration.

    • L'étiquette "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true" - définissez cette étiquette sur le conteneur nginx-proxy pour indiquer au conteneur docker-letsencrypt-nginx-proxy-companion de l'utiliser comme proxy.

    • ACME_TOS_HASH - Passons un hachage TOS alternatif à simp_le, pour prendre en charge l'implémentation ACME d'autres autorités de certification.

    Exemples :

    Si vous voulez d'autres exemples d'utilisation de ce conteneur, regardez :

    • Exemples de Karl Fathi

    • Plus d'exemples de Karl

    • Exemples de George Ilyes

    • Exemple simple de composition de docker de Dmitry

    注意,这里有个坑,也怪我自己没看清楚,如果镜像已经expose端口就设置VIRTUAL_HOST、LETSENCRYPT_HOST、LETSENCRYPT_EMAIL就行,如果没有就得在设置好三个环境变量之后自己加入--exposer 容器内应用服务端口 参数启动。如果容器是discourse这样的,就得在app.yml内设置好环境变量之后把端口映射的80:80改为未占用端口:80,然后再保存重建启动。

    répondre
    0
  • 大家讲道理

    大家讲道理2017-06-20 10:07:52

    Étant donné que le conteneur ne peut lier directement que le port de l'hôte, par exemple, j'ai 10 conteneurs Web, alors ces conteneurs ont tous besoin de 80 ou 443, donc le paramètre -p n'est pas réalisable, donc utilisez un conteneur comme passerelle inverse conteneur proxy, utilisez nginx, le conteneur nginx pour -p et d'autres conteneurs Web tels que php-fpm et node. Accès via nginx en tant que proxy inverse Le certificat est également directement transmis au serveur nginx et le transfert 443 peut être effectué.

    En fait, ce sont les bases, mais elles n'ont rien à voir avec Docker

    Cet article est un environnement lnmp,
    /a/11...

    S'il existe plusieurs services backend php-fpm ou node ou python, alors nginx devrait être comme suit

    server{
      listen 80;
      server_name web1;
      location /{
        proxy_pass  ....
      }
    }
    
    server{
      listen 80;
      server_name web2;
      location /{
        proxy_pass  ....
      }
    
    }
    
    server{
      listen 80;
      server_name web3;
      location /{
        proxy_pass  ....
      }
    }

    répondre
    0
  • Annulerrépondre