Apakah mungkin menggunakan Docker untuk memisahkan situs web untuk pengguna?

12

Saya mengelola server di mana pengguna memiliki situs web sendiri di atasnya yang dapat diakses oleh FTP (seperti perusahaan hosting) dan alih-alih bekerja mengisolasi proses tumpukan LAMP, saya bertanya-tanya apakah mungkin untuk mengimplementasikan Docker dan menggunakan gambar per situs web.

Dari apa yang saya mengerti, Anda dapat mengekspos instance Docker melalui port mereka, jadi jika Anda menjalankan dua instance docker di server yang sama, Anda harus mengekspos dua port yang berbeda.

Tetapi apakah mungkin untuk mengekspor bukan port, tetapi nama server, seperti:

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

Dan itu, di server yang sama.

Saya berpikir untuk menginstal hanya Apache di server, yang akan mengarahkan permintaan ke instance Docker khusus berdasarkan nama server, tetapi kemudian saya harus menginstal Apache (lagi!) Dan MySQL pada setiap instance Docker.

Apakah ini mungkin dan apalagi, apakah ini menarik dalam hal kinerja (atau tidak sama sekali)?

Terima kasih untuk bantuannya.

Cyril N.
sumber
1
Secara teoritis dimungkinkan, Apache akan melakukan ProxyPass ke port setiap contoh Docker mendengarkan.
thanasisk

Jawaban:

12

Ya itu mungkin. Yang perlu Anda lakukan adalah menyediakan beberapa 80 port. satu untuk setiap URL. Anda dapat melakukan ini menggunakan, mis. Virtual Host of Apache berjalan pada server host Docker.

  1. Setel DNS CNAME.
  2. Jalankan instance docker dan petakan port 80 mereka ke port, katakanlah, 12345 ~ 12347 dari host buruh pelabuhan.
  3. Jalankan server Apache pada host buruh pelabuhan dan atur Virtual Host untuk setiap URL dan atur ProxyPass dan ProxyPassReverse ke localhost: 12345 yang merupakan salah satu contoh buruh pelabuhan Anda.

File konfigurasi Apache akan terlihat seperti ini:

<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
sumber
4
Terima kasih! Ini sangat membantu. Juga, ada ProxyPreserveHost On, jadi Anda tidak berakhir dengan banyak tautan ke local.hostname.ofDockerHost: 12345 insite situs web Anda. Berikut info lebih lanjut yang membantu saya: digitalocean.com/community/tutorials/…
Sebastián Ramírez
Apakah buruh pelabuhan akan menyimpan perubahan ke database dll?
EminezArtus
3

Itu mungkin. Anda dapat menggunakan apache (atau lebih baik lagi, haproxy, nginx atau varnish, yang mungkin lebih efisien daripada apache untuk tugas pengalihan itu) di server utama, untuk mengarahkan ulang ke port apache dari masing-masing wadah.

Tetapi, tergantung pada situs yang Anda jalankan di sana (dan konfigurasi apache mereka), mungkin memerlukan lebih banyak memori daripada menggunakan satu pusat apache dengan virtualhosts, khususnya jika Anda memiliki modul (yaitu php) yang membutuhkan banyak RAM.

gmuslera
sumber
Terima kasih atas jawaban Anda. Memang, layanan "hosting" yang akan saya sediakan mencakup hal-hal seperti Prestashop, Wordpress, dll, jadi, banyak berdasarkan pada PHP dan mesin berat (saya berbicara lebih banyak tentang Prestashop di sini).
Cyril N.
1
Akankah sistem hosting virtual Dockerized dimodulasi dengan lebih baik dengan memisahkan PHP ke dalam wadah Docker itu sendiri dan membuat wadah Apache menggunakan wadah itu untuk pemrosesan PHP? Apakah hal yang sama untuk database berlaku? Misalnya: Memiliki lalu lintas proxy host ke wadah Apache (yang berisi situs web pengguna), yang pada gilirannya mengirim semua pemrosesan PHP ke wadah PHP dan basis data membaca / menulis ke wadah MySQL? Atau apakah PHP akan kurang haus sumber daya dengan cara ini? Apakah PHP-FPM, SuPHP atau yang sejenisnya menyediakan jenis pengaturan yang sama di lingkungan non-Docker?
ojrask
PHP-FPM dalam sebuah wadah setidaknya akan sedikit file-bijaksana yang berlebihan: code.google.com/p/sna/wiki/NginxWithPHPFPM Instalasi Apache / Nginx perlu menyalin file PHP ke wadah PHP-FPM agar dapat agar sistem ini berfungsi. Apakah wadah data bersama yang dipasang memecahkan masalah ini?
ojrask
Jika Anda perlu berbagi data (yaitu file php) antara kontainer, volume adalah cara untuk pergi, Anda dapat memasang mereka dari wadah lain (bahkan memiliki data yang didedikasikan) atau sistem file nyata. Modul apache digunakan untuk menjadi cara tercepat untuk menjalankan kode php, memiliki satu hanya untuk php, bukan file statis, dan memiliki lapisan atas untuk mengirimkan konten statis / cacheable (yaitu pernis) bisa menjadi kombo yang baik.
gmuslera
3

Saya tahu ini sudah dijawab, tetapi saya ingin mengambil satu langkah lebih jauh dan menunjukkan kepada Anda contoh bagaimana ini bisa dilakukan, untuk memberikan jawaban yang lebih lengkap.

Silakan lihat gambar buruh pelabuhan saya di sini dengan instruksi tentang cara menggunakannya, ini akan menunjukkan kepada Anda bagaimana mengkonfigurasi dua situs https://hub.docker.com/r/vect0r/httpd-proxy/

Seperti yang dikatakan jihun, Anda harus memastikan bahwa Anda telah mengatur konfigurasi vhost. Contoh saya menggunakan port 80 untuk menampilkan situs uji example.com dan 81 untuk menampilkan situs uji example2.com. Juga penting untuk dicatat bahwa Anda perlu menentukan konten Anda dan mengekspos port yang diperlukan di Dockerfile Anda, seperti itu;

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

Semoga ini bisa membantu menjelaskan proses menjadi sedikit lebih. Jangan ragu untuk bertanya kepada saya pertanyaan lebih lanjut tentang ini, dengan senang hati membantu.

Salam,

V

Vect0r
sumber
Saya juga mengunggah file yang digunakan untuk membuat gambar ini di github; github.com/V3ckt0r/docker-httpd-proxy
Vect0r
1

Dalam kasus saya, saya perlu menambahkan SSLProxyEngine On , ProxyPreserveHost On dan RequestHeader mengatur Front-End-Https "On" ke file vhost apache 2.4 saya, karena saya ingin mengaktifkan SSL pada wadah buruh pelabuhan. Tentang local.hostname.ofDockerHost , dalam kasus saya nama server host yang menjalankan wadah buruh pelabuhan adalah lucas , dan port yang dipetakan ke port 443 dari wadah buruh pelabuhan adalah 1443 (karena port 443 sudah digunakan oleh apache di host. server), sehingga baris itu berakhir seperti ini https: // lucas: 1443 /

Ini adalah pengaturan terakhir, dan itu berfungsi dengan baik!

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

Akhirnya, dalam wadah buruh pelabuhan saya harus mengatur header SSL proxy. Dalam kasus saya, wadah itu menjalankan nginx dan sesuatu yang disebut omnibus untuk menyiapkan aplikasi ruby. Saya pikir ini bisa diatur dalam file konfigurasi nginx juga. Akan menuliskannya seperti kalau-kalau seseorang menemukan ini bermanfaat

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'

Panduan lengkap untuk apache, ISP Config, server Ubuntu 16.04 di sini https://www.howtoforge.com/community/threads/subdomain-or-subfolder-route-requests-to-running-docker-image.73845/#post-347744

pisau cukur7
sumber