web-dev-qa-db-fra.com

Docker - Exécutez Apache sur un hôte et un conteneur pour différents sites Web

Je souhaite utiliser Docker pour pouvoir exécuter une ancienne application nécessitant PHP 5.3, tout en conservant mes autres sites Web sur mon serveur hôte, exécutés sur l'hôte Apache.

J'ai donc siteA.com, siteB.com, siteC.com s'exécutant sur l'hôte, à l'aide de l'hôte Apache/PHP/serveur MySQL, et j'ai SiteZ.com installé dans un conteneur Docker, qui devrait utiliser Apache/PHP du conteneur mais le serveur MySQL de l'hôte.

Voici une représentation de l'architecture que j'aimerais obtenir:

 Representation of my architecture

Mon problème est qu'il semble que je ne peux pas exécuter Apache dans le conteneur, car le port 80 est déjà utilisé sur l'hôte.

Mon objectif serait que les personnes puissent accéder à siteA.com, siteB.com, siteC.com et siteZ.com, sans avoir à spécifier un port différent pour ces sites Web.

J'ai réussi à faire fonctionner siteZ.com en utilisant le port 8080, mais ce n'est évidemment pas une option.

Merci

PS: Veuillez noter que je suis complètement nouveau dans Docker.

Edit: Vous pouvez trouver ma solution de travail ici . Merci à VonC pour me montrant le chemin à suivre :)

13
AntoineB

Grâce à la réponse de VonC J'ai réussi à le faire fonctionner mais j'ai légèrement modifié mon architecture, aboutissant à 3 conteneurs au lieu de 1.

J'ai un conteneur pour chaque version d'Apache/PHP et un conteneur avec Nginx en tant que proxy inverse. Je pense que vous pouvez facilement l'adapter pour installer Nginx sur l'hôte et modifier sa configuration pour qu'elle corresponde à l'architecture que j'ai décrite dans ma question.

Notez que comme je suis nouveau dans Docker et que je suis un novice en matière d’administration de système Linux, il ya probablement des erreurs et des erreurs qui n’ont aucun sens dans les scripts suivants, mais cela fonctionne pour moi. N'hésitez pas à l'améliorer :)


Image du proxy inverse Nginx

Le fichier de docker:

FROM debian:jessie

MAINTAINER AntoineB version: 0.1

RUN apt-get update && \
    apt-get install -y --force-yes \
            nginx \
        nano

EXPOSE 80
EXPOSE 443

ADD ./proxy.conf /etc/nginx/conf.d/proxy.conf

CMD ["nginx"]

Voici le fichier proxy.conf référencé:

proxy_redirect          off;
proxy_set_header        Host            $Host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
client_header_buffer_size 64k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffer_size   16k;
proxy_buffers       32   16k;
proxy_busy_buffers_size 64k;

Et je l'exécute en utilisant le script bash suivant:

docker run -ti -d -p 80:80 -v /home/antoineb/Docker/images/nginxproxy/virtualhosts:/etc/nginx/sites-enabled --name nginxproxy nginxproxy /bin/bash

J'ai un dossier /home/antoineb/Docker/images/nginxproxy/virtualhosts sur mon hôte qui contient le fichier default suivant:

server {
       listen 80;

       server_name  siteZ.com;
       location / {
            proxy_pass http://Apache22php53:80;
       }
}

server {
       listen 80;

       server_name  siteA.com;
       location / {
            proxy_pass http://Apache24php56:80;
       }
}
server {
       listen 80;

       server_name  siteB.com;
       location / {
            proxy_pass http://Apache24php56:80;
       }
}

Apache 2.2 + PHP 5.3 image

Dockerfile:

FROM debian:wheezy

MAINTAINER AntoineB version: 0.1

RUN apt-get update

RUN echo "deb http://packages.dotdeb.org squeeze all" > /etc/apt/sources.list.d/dotdeb_squeeze.list
RUN echo "deb-src http://packages.dotdeb.org squeeze all" >> /etc/apt/sources.list.d/dotdeb_squeeze.list
RUN echo "deb http://ftp.debian.org/debian/ squeeze main contrib non-free" >> /etc/apt/sources.list.d/dotdeb_squeeze.list

RUN echo "Package: *php*" > /etc/apt/preferences.d/php53.pref
RUN echo "Pin: release o=packages.dotdeb.org,n=squeeze" >> /etc/apt/preferences.d/php53.pref
RUN echo "Pin-Priority: 989" >> /etc/apt/preferences.d/php53.pref

RUN apt-get update && \
    apt-get install -y --force-yes \
            Apache2 \
        php5 \
        php5-curl \
        php5-Gd \
        php5-mysql \
        nano

RUN a2enmod \
            php5 \
        rewrite

ENV Apache_RUN_USER www-data
ENV Apache_RUN_GROUP    www-data
ENV Apache_LOG_DIR  /var/log/Apache2
ENV Apache_LOCK_DIR /var/lock/Apache2
ENV Apache_PID_FILE /var/run/Apache2.pid

EXPOSE 80
EXPOSE 443

CMD /usr/sbin/Apache2ctl -D FOREGROUND

Je le lance en utilisant le script suivant:

docker run -ti -d -p 2253:80 -v /home:/home -v /home/antoineb/Docker/images/Apache22php53/virtualhosts:/etc/Apache2/sites-enabled --name Apache22php53 Apache22php53 /bin/bash

Mes sites Web sont stockés dans /home/website.com/www, et mes hôtes virtuels Apache sont stockés sur l'hôte dans /home/antoineb/Docker/images/Apache22php53/virtualhosts.


Apache 2.4 + PHP 5.6.9 image

Dockerfile:

FROM debian:jessie

MAINTAINER AntoineB version: 0.1

RUN apt-get update && \
    apt-get install -y --force-yes \
            Apache2 \
        php5 \
        php5-curl \
        php5-Gd \
        php5-mysql \
        nano

RUN a2enmod \
            php5 \
        rewrite

ENV Apache_RUN_USER www-data
ENV Apache_RUN_GROUP    www-data
ENV Apache_LOG_DIR  /var/log/Apache2
ENV Apache_LOCK_DIR /var/lock/Apache2
ENV Apache_PID_FILE /var/run/Apache2.pid

EXPOSE 80
EXPOSE 443

CMD /usr/sbin/Apache2ctl -D FOREGROUND

Mon script courant:

docker run -ti -d -p 2456:80 -v /home:/home -v /home/antoineb/Docker/images/Apache24php56/virtualhosts:/etc/Apache2/sites-enabled --name Apache24php56 Apache24php56 /bin/bash

Encore une fois, mes sites Web sont stockés dans /home/website.com/www, et mes hôtes virtuels Apache sont stockés sur l'hôte dans /home/antoineb/Docker/images/Apache24php56/virtualhosts.

10
AntoineB

Je ne peux pas exécuter Apache dans le conteneur car le port 80 est déjà utilisé sur l'hôte.

Bien sûr, vous pouvez: dans un conteneur, vous pouvez exécuter Apache sur n’importe quel port.

mais lorsque vous faites dockerrun, alors vous devez mapper ce port conteneur à un port hôte (qui ne sera pas 80, car il est déjà pris , mais par exemple 8080

docker run -d -p 8080:80 yourImage

Mon objectif serait que les personnes puissent accéder à siteA.com, siteB.com, siteC.com et siteZ.com

C'est ce qu'on appelle le proxy inverse, et vous pourriez exécuter sur le port 80 un NGiNX (dans un conteneur ou non) qui renverserait ensuite le proxy sur le site A, B ou C (chacun s'exécutant sur un port différent, dans un conteneur ou non).
Voir, par exemple, " proxy inverse Nginx avec plusieurs domaines ssl ".

Votre Apache principal ne fonctionnerait plus directement sur le port 80 (ou pourrait le faire si vous le mettez dans un conteneur!)

Le but de tout mettre dans son propre conteneur est isolation .
Pas seulement l’isolation de système de fichiers avec chroot ou la mémoire, mais aussi configuration l’isolation: dans un conteneur, un Apache s’exécute toujours (si vous le souhaitez) en 80/443, quel que soit le nombre d’Apache. les conteneurs sont en cours d'exécution.
Vous les lancez simplement avec le mappage de port hôte approprié, mais dans un conteneur, la configuration reste fixe et identique.

9
VonC

Vous pouvez utiliser le routage basé sur l'hôte dans la colle de docker

https://github.com/muayyad-alsadi/docker-glue

c'est un démon léger qui génère des modèles haproxy à la volée (vous pouvez définir un modèle nginx si vous le souhaitez) qui surveille les étiquettes de conteneur de ce type.

docker run -d --name wp1 -l glue_http_80_Host='wp1.example.com' mywordpress/wordpress 
docker run -d --name wp2 -l glue_http_80_Host='wp2.example.com' mywordpress/wordpress 

dans cette configuration, le démon glue générera la configuration haproxy de sorte que le trafic vers wp1.example.com se dirige vers le conteneur wp1

0
Muayyad Alsadi