Czy można używać Dockera do oddzielania stron internetowych dla użytkowników?

12

Zarządzam serwerami, na których użytkownicy mają własne strony internetowe, do których można uzyskać dostęp przez FTP (jak firma hostingowa) i zamiast pracować nad izolacją procesów stosu LAMP, zastanawiałem się, czy można wdrożyć Docker i użyć obrazów na stronę.

Z tego, co rozumiem, możesz ujawnić wystąpienie Dockera za pośrednictwem ich portów, więc jeśli uruchomisz dwa wystąpienie dokera na tym samym serwerze, będziesz musiał udostępnić dwa różne porty.

Ale czy można eksportować nie porty, ale nazwę serwera, na przykład:

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

I to na tym samym serwerze.

Myślałem o zainstalowaniu tylko Apache na serwerze, który przekierowałby żądanie do dedykowanej instancji Docker na podstawie nazwy serwera, ale wtedy musiałbym zainstalować Apache (ponownie!) I MySQL na dowolnych instancjach Docker.

Czy jest to możliwe, a ponadto, czy jest to interesujące pod względem wydajności (lub wcale)?

Dziękuję za pomoc

Cyryl N.
źródło
1
Teoretycznie jest to możliwe, Apache wykona ProxyPass w kierunku portu, którego nasłuchuje każda instancja Dockera.
thanasisk

Odpowiedzi:

12

Tak to mozliwe. Co musisz zrobić, to zapewnić kilka 80 portów. jeden dla każdego adresu URL. Możesz to zrobić za pomocą np. Wirtualnego hosta Apache działającego na serwerze hosta Docker.

  1. Ustaw DNS CNAME.
  2. Uruchom instancje dokera i zamapuj ich port 80 na port, powiedzmy 12345 ~ 12347 hosta dokera.
  3. Uruchom serwer Apache na hoście dokera i ustaw wirtualny host dla każdego adresu URL oraz ustaw ProxyPass i ProxyPassReverse na localhost: 12345, który jest jedną z instancji dokera.

Plik konfiguracyjny Apache będzie wyglądał następująco:

<VirtualHost *:80>
ServerName www.somewebsite.com
  <Proxy *>
    Allow from localhost
  </Proxy>
  ProxyPass        / http://local.hostname.ofDockerHost:12345/
  ProxyPassReverse / http://local.hostname.ofDockerHost:12345/
</VirtualHost>
Jihun
źródło
4
Dzięki! To bardzo pomogło. Jest też, ProxyPreserveHost Onwięc nie kończy się wiele linków do local.hostname.ofDockerHost: 12345 w witrynie. Oto więcej informacji, które były dla mnie pomocne: digitalocean.com/community/tutorials/…
Sebastián Ramírez
Czy doker zapisze zmiany w bazie danych itp.?
EminezArtus
3

To jest możliwe. Możesz użyć apache (lub jeszcze lepiej, haproxy, nginx lub lakier, który może być bardziej wydajny niż apache tylko do tego zadania przekierowania) na głównym serwerze, aby przekierować do portów apache każdego kontenera.

Jednak w zależności od witryn, które tam uruchamiasz (i ich konfiguracji apache), może to wymagać znacznie więcej pamięci niż używanie jednego centralnego apache z wirtualnymi hostami, szczególnie jeśli masz moduły (np. Php), które wymagają dużej ilości pamięci RAM.

gmuslera
źródło
Dziękuję za Twoją odpowiedź. Rzeczywiście, usługa „hostingowa”, którą zapewnię, obejmuje takie rzeczy, jak Prestashop, Wordpress itp., Więc w dużej mierze opiera się na PHP i silnikach ciężkich (mówię tutaj o Prestashop).
Cyril N.
1
Czy system wirtualnego hostingu Dockerized byłby lepiej zmodularyzowany poprzez rozdzielenie PHP na własne kontenery Docker i sprawienie, aby kontenery Apache korzystały z tego kontenera do przetwarzania PHP? Czy to samo dotyczy baz danych? Np. Czy hostuje ruch proxy do kontenerów Apache (które zawierają strony użytkowników), które z kolei wysyłają całe przetwarzanie PHP do kontenera PHP, a baza danych odczytuje / zapisuje do kontenera MySQL? A może PHP byłby w ten sposób mniej wymagający zasobów? Czy PHP-FPM, SuPHP lub podobny zapewnia taką samą konfigurację w środowisku innym niż Docker?
ojrask
PHP-FPM w kontenerze byłby co najmniej nieco redundantny pod względem przestrzeni plików: code.google.com/p/sna/wiki/NginxWithPHPFPM Instalacja Apache / Nginx musi skopiować pliki PHP do kontenera PHP-FPM, aby aby ten system działał. Czy zamontowany współużytkowany kontener danych rozwiązałby ten problem?
ojrask
Jeśli potrzebujesz współdzielić dane (tj. Pliki php) między kontenerami, wolisz korzystać z woluminów, możesz montować je z innych kontenerów (nawet tych dedykowanych) lub z prawdziwego systemu plików. Moduł apache był kiedyś najszybszym sposobem uruchamiania kodu php, posiadając jeden tylko dla php, a nie plików statycznych, i posiadający górną warstwę do dostarczania zawartości statycznej / buforowalnej (tj. Lakier) może być dobrym połączeniem.
gmuslera
3

Wiem, że już na nie odpowiedziano, ale chciałem pójść o krok dalej i pokazać wam przykład, jak można to zrobić, aby uzyskać bardziej kompletną odpowiedź.

Proszę zobaczyć mój obraz dokera tutaj z instrukcjami, jak go używać, pokaże to, jak skonfigurować dwie witryny https://hub.docker.com/r/vect0r/httpd-proxy/

Jak powiedział dżihun, będziesz musiał upewnić się, że masz skonfigurowaną konfigurację vhosta. Mój przykład używa portu 80 do wyświetlenia strony testowej example.com i 81 do wyświetlenia strony testowej example2.com. Ważne jest również, aby pamiętać, że będziesz musiał określić swoją zawartość i ujawnić wymagane porty w pliku Docker, takie jak;

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

Mam nadzieję, że to pomoże trochę wyjaśnić ten proces. Prosimy o dalsze pytania w tej sprawie, chętnie pomożemy.

Pozdrowienia,

V.

Vect0r
źródło
Przesłałem również pliki użyte do utworzenia tego obrazu na github; github.com/V3ckt0r/docker-httpd-proxy
Vect0r
1

W moim przypadku musiałem dodać SSLProxyEngine On , ProxyPreserveHost On i RequestHeader ustawić Front-End-Https „On” do mojego pliku vache apache 2.4, ponieważ chciałem włączyć SSL w kontenerze dokera. O local.hostname.DDockerHost , w moim przypadku nazwa serwera hosta, na którym działa kontener Dockera, to Lucas , a port mapowany na port 443 kontenera Dockera to 1443 (ponieważ port 443 był już używany przez apache na hoście serwer), dzięki czemu linia skończyła w ten sposób https: // lucas: 1443 /

To jest końcowa konfiguracja i działa dobrze!

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

Wreszcie w kontenerze dokera musiałem skonfigurować nagłówki SSL proxy. W moim przypadku w kontenerze działał nginx i coś o nazwie omnibus do konfigurowania aplikacji ruby. Myślę, że można to również ustawić w pliku konfiguracyjnym nginx. Spiszę to na wypadek, gdyby ktoś uznał to za pomocne

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'

Kompletny przewodnik dla Apache, ISP Config, serwer Ubuntu 16.04 tutaj https://www.howtoforge.com/community/threads/subdomain-or-subfolder-route-requests-to-running-docker-image.73845/#post-347744

razor7
źródło