it-swarm.com.de

Docker - Führen Sie Apache auf dem Host und Container für verschiedene Websites aus

Ich möchte Docker verwenden, um eine alte Anwendung ausführen zu können, für die PHP 5.3 erforderlich ist, während meine anderen Websites weiterhin auf meinem Host-Server laufen und auf dem Host Apache ausgeführt werden.

Also habe ich siteA.com, siteB.com, siteC.com auf dem Host und verwende den Host Apache/PHP/MySQL-Server, und ich habe siteZ.com, das in einem Docker-Container installiert ist sollte den Apache/PHP des Containers verwenden, jedoch den Host MySQL-Server.

Hier ist eine Darstellung der Architektur, die ich erhalten möchte:

 Representation of my architecture

Mein Problem ist, dass es scheint, dass ich Apache nicht im Container ausführen kann, da der Port 80 bereits auf dem Host verwendet wird.

Mein Ziel wäre, dass die Benutzer auf siteA.com, siteB.com, siteC.com und siteZ.com zugreifen können, ohne einen anderen Port für diese Websites angeben zu müssen.

Es ist mir gelungen, siteZ.com über Port 8080 zum Laufen zu bringen, aber es ist offensichtlich keine Option.

Vielen Dank

PS: Bitte beachten Sie, dass ich bei Docker völlig neu bin.

Bearbeiten: Sie finden meine Arbeitslösung hier . Danke an VonC für mir den Weg zu zeigen :)

13
AntoineB

Dank VonCs Antwort habe ich es geschafft, es zum Laufen zu bringen, aber ich habe meine Architektur etwas geändert, was 3 Container statt nur 1 ergab.

Ich habe einen Container für jede Apache/PHP-Version und einen Container mit Nginx als Reverse-Proxy. Ich denke, Sie können dies leicht anpassen, um Nginx auf dem Host zu installieren und seine Konfiguration an die in meiner Frage beschriebene Architektur anzupassen.

Beachten Sie, dass ich neu bei Docker bin und ein Neuling in Bezug auf die Linux-Systemverwaltung bin. Es gibt wahrscheinlich einige Fehler und Dinge, die in den folgenden Skripts keinen Sinn ergeben, aber für mich funktionieren sie. Fühlen Sie sich frei, um es zu verbessern :)


Nginx Reverse Proxy-Bild

Die Dockerfile:

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"]

Hier ist die referenzierte proxy.conf-Datei:

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;

Und ich führe es mit dem folgenden Bash-Skript aus:

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

Ich habe einen /home/antoineb/Docker/images/nginxproxy/virtualhosts-Ordner auf meinem Host, der die folgende default-Datei enthält:

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 Bild

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

Ich starte es mit dem folgenden Skript:

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

Meine Websites werden in /home/website.com/www gespeichert, und meine virtuellen Aposts von Apache werden auf dem Host in /home/antoineb/Docker/images/Apache22php53/virtualhosts gespeichert.


Apache 2.4 + PHP 5.6.9 Bild

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

Mein laufendes Skript:

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

Auch hier werden meine Websites in /home/website.com/www gespeichert, und meine Apache virtualhosts werden auf dem Host in /home/antoineb/Docker/images/Apache24php56/virtualhosts gespeichert.

10
AntoineB

Ich kann Apache nicht im Container ausführen, da der Port 80 bereits auf dem Host verwendet wird.

Natürlich können Sie: In einem Container können Sie Apache an jedem beliebigen Port ausführen.

wenn Sie jedoch dockerrun, then ausführen, müssen Sie map diesen Container-Port zu einem Host-Port (der nicht 80 sein wird, da er bereits belegt ist) , aber zum Beispiel 8080

docker run -d -p 8080:80 yourImage

Mein Ziel wäre, dass die Leute auf siteA.com, siteB.com, siteC.com und siteZ.com zugreifen könnten

Dies wird als Reverse-Proxy bezeichnet, und Sie können an Port 80 ein NGiNX (in einem Container oder nicht) ausführen, der dann den Proxy auf SiteA, B oder C (jeweils auf einem anderen Port, in einem Container oder nicht) ausführen würde.
Siehe zum Beispiel " Nginx Reverse Proxy mit mehreren SSL-Domänen ".

Ihr Haupt-Apache würde nicht mehr direkt auf Port 80 laufen (oder, wenn Sie ihn in einen Container stellen!)

Das Ziel, alles in einen eigenen Container zu stellen, ist isolation .
Nicht nur Dateisystemisolation mit Chroot- oder Speicherisolation, sondern auch Konfiguration -Isolierung: In einem Container wird (wenn Sie möchten) immer ein Apache in 80/443 ausgeführt, unabhängig davon, wie viele Apache verwendet werden Container laufen.
Sie starten sie einfach mit der richtigen Host-Portzuordnung, aber in einem Container bleibt die Konfiguration unverändert und identisch.

9
VonC

Sie können Host-basiertes Routing in Docker-Leim verwenden

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

es ist ein leichter Daemon, der schnell haproxy-Vorlagen generiert (Sie können eine Nginx-Vorlage definieren, wenn Sie möchten), die Container-Labels wie diese überwacht

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 

in diesem Setup generiert der Glue-Daemon die Haproxy-Konfiguration, sodass der Verkehr nach wp1.example.com in den wp1-Container geleitet wird

0
Muayyad Alsadi