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:
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 :)
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 :)
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;
}
}
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
.
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
.
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 docker
run
, 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.
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