web-dev-qa-db-fra.com

Est-il possible d'utiliser Docker pour séparer les sites Web pour les utilisateurs?

Je gère des serveurs où les utilisateurs ont leurs propres sites Web qui peuvent être accessibles par FTP (comme une société d'hébergement) et au lieu de travailler sur des processus de pile de lampes isolant, je me demandais s'il était possible de mettre en œuvre Docker et d'utiliser des images par site Web.

D'après ce que je comprends, vous pouvez exposer une instance Docker via leurs ports. Si vous exécutez deux instances Docker sur le même serveur, vous devrez exposer deux ports différents.

Mais est-il possible d'exporter non des ports, mais un nom de serveur, comme:

  • www.somewebsite.com: instance Docker 1
  • www.otherwebsite.com: instance Docker 2
  • www.etc.com: instance Docker ...

Et que dans le même serveur.

J'ai pensé à ne pas installer qu'Apache sur le serveur, qui redirigerait la demande à l'instance Docker dédiée basée sur le nom du serveur, mais je devrais ensuite installer Apache (encore une fois!) AndMySQL sur des instances de Docker.

Est-ce possible et d'ailleurs, est-ce intéressant en termes de performance (ou pas du tout)?

Merci de votre aide.

12
Cyril N.

Oui c'est possible. Ce que vous devez faire est de fournir plusieurs 80 ports. un pour chaque URL. Vous pouvez faire cela en utilisant, par exemple. Hôte virtuelle d'Apache exécutant sur Docker Host Server.

  1. Définir DNS CNAME.
  2. Exécutez les instances Docker et cartographiez leur port 80 à Port, disons, 12345 ~ 12347 de l'hôte Docker.
  3. Exécutez Apache Server sur l'hôte Docker et définissez un hôte virtuel pour chaque URL et définissez Proxypass et ProXypassReverse sur localhost: 12345 qui est l'une de vos instances de docker.

Le fichier de configuration Apache ressemblera à ceci:

<VirtualHost *:80>
ServerName www.somewebsite.com
  <Proxy *>
    Allow from localhost
  </Proxy>
  ProxyPass        / http://local.hostname.ofDockerHost:12345/
  ProxyPassReverse / http://local.hostname.ofDockerHost:12345/
</VirtualHost>
12
Jihun

C'est possible. Vous pouvez utiliser Apache (ou mieux encore, Haproxy, Ngroxy, Ngoinx ou Vernis, qui peut être plus efficace que Apache pour une seule tâche de redirection) dans le serveur principal, pour rediriger les ports Apache de chaque conteneur.

Mais, en fonction des sites que vous exécutez (et de leurs configurations Apache), cela peut nécessiter une mémoire bien plus que d'utiliser une seule apache centrale avec VirtualHosts, spécialement si vous avez des modules (c'est-à-dire PHP) qui nécessitent beaucoup de RAM.

3
gmuslera

Je sais que cela a déjà été répondu, mais je voulais faire une étape plus loin et vous montrer un exemple de la manière dont cela pourrait être fait, de fournir une réponse plus complète.

S'il vous plaît voir mon image Docker ici avec instructions sur la manière de l'utiliser, cela vous montrera comment configurer deux sites https://hub.docker.com/r/vect0r/httpd-proxy/

Comme le dit Jihun, vous devrez vous assurer que votre ensemble de configuration de Vhost. Mon exemple utilise le port 80 pour afficher un site de test exemple.com et 81 pour afficher l'exemple de site test2.com. Il est également important de noter que vous devrez spécifier votre contenu et exposer les ports requis de votre dockerfile, comme tel;

FROM centos:latest
Maintainer vect0r
LABEL Vendor="CentOS"

RUN yum -y update && yum clean all
RUN yum -y install httpd && yum clean all

EXPOSE 80 81

#Simple startup script to aviod some issues observed with container restart
ADD run-httpd.sh /run-httpd.sh
RUN chmod -v +x /run-httpd.sh

#Copy config file across
COPY ./httpd.conf /etc/httpd/conf/httpd.conf
COPY ./example.com /var/www/example.com
COPY ./example2.com /var/www/example2.com
COPY ./sites-available /etc/httpd/sites-available
COPY ./sites-enabled /etc/httpd/sites-enabled

CMD ["/run-httpd.sh"]

J'espère que cela aide à expliquer un peu le processus d'être plus. N'hésitez pas à me poser des questions supplémentaires sur cette question, heureuse d'aider.

Salutations,

V

3
Vect0r

Dans mon cas, j'avais besoin d'ajouter SSLProxyEngine ON, proxypresveHost ON et DemandeHeader Set Front-End-HTTPS "On" Pour mon fichier Apache 2.4 Vhost, car je voulais activer SSL sur le conteneur Docker. Sur le local.hostname.ofdockerherhost, dans mon cas, le nom du serveur hôte exécutant le conteneur Docker était Lucas et le port mappé sur le port 443 de Le conteneur Docker était 1443 (Parce que le port 443 était déjà utilisé par Apache dans le serveur hôte), de sorte que la ligne a fini de cette manière https: // lucas : 1443 /

C'est la configuration finale et ça fonctionne très bien!

<VirtualHost *:443> # Change to *:80 if no https required
    ServerName www.somewebsite.com
    <Proxy *>
        Allow from localhost
    </Proxy>
    SSLProxyEngine On # Comment this out if no https required
    RequestHeader set Front-End-Https "On" # Comment this out if no https required
    ProxyPreserveHost    On
    ProxyPass        / http://local.hostname.ofDockerHost:12345/
    ProxyPassReverse / http://local.hostname.ofDockerHost:12345/
</VirtualHost>

Enfin, dans le conteneur Docker, j'avais à configurer des en-têtes SSL proxy. Dans mon cas, le conteneur exécutait Nginx et quelque chose appelé omnibus pour la configuration Ruby applications. Je pense que cela peut être configuré dans un fichier de configuration NGinx. . Je vais l'écrire comme si quelqu'un trouvera cela utile

nginx['redirect_http_to_https'] = true
nginx['proxy_set_headers'] = {
    "Host" => "$http_Host",
    "X-Real-IP" => "$remote_addr",
    "X-Forwarded-For" => "$proxy_add_x_forwarded_for",
    "X-Forwarded-Proto" => "https",
    "X-Forwarded-Ssl" => "on"
}
nginx['real_ip_trusted_addresses'] = ['10.0.0.77'] # IP for lucas Host
nginx['real_ip_header'] = 'X-Real-IP'
nginx['real_ip_recursive'] = 'on'

Guide complet pour Apache, ISP Config, Ubuntu Server 16.04 Ici https://www.howtoforge.com/community/threads/subdomain-or-subdomain-Route-Request-a-Running-Docker-Image.73845/ # post-347744

1
razor7