Apakah mungkin menggunakan Docker untuk memisahkan situs web untuk pengguna?

Saya mengelola server di mana pengguna memiliki situs web mereka 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 pahami, 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 : contoh Docker 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 !) danmysql pada instance Docker apa pun.

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

Terima kasih atas bantuan Anda.

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

  1. Set DNS CNAME.
  2. Jalankan instance docker dan petakan port mereka 80 ke port, katakanlah, 12345~12347 dari host docker.
  3. Jalankan Server Apache di docker host dan atur Host Virtual untuk setiap URL dan atur ProxyPass dan ProxyPassReverse ke localhost:12345 yang merupakan salah satu instance docker 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>

Saya tahu ini sudah dijawab namun 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 cara mengkonfigurasi dua situshttps://hub.docker.com/r/vect0r/httpd-proxy/

Seperti yang dikatakan jihun, Anda harus memastikan bahwa Anda memiliki set konfigurasi vhost Anda. 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:latestMaintainer vect0rLABEL Vendor="CentOS"RUN yum -y update && yum clean allRUN yum -y install httpd && yum clean allEXPOSE 80 81#Simple startup script to aviod some issues observed with container restartADD run-httpd.sh /run-httpd.shRUN chmod -v +x /run-httpd.sh#Copy config file acrossCOPY ./httpd.conf /etc/httpd/conf/httpd.confCOPY ./example.com /var/www/example.comCOPY ./example2.com /var/www/example2.comCOPY ./sites-available /etc/httpd/sites-availableCOPY ./sites-enabled /etc/httpd/sites-enabledCMD ["/run-httpd.sh"]

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

Salam,

V

Hal ini dimungkinkan. Anda dapat menggunakan apache (atau lebih baik lagi, haproxy, nginx atau varnish, yang mungkin lebih efisien daripada apache hanya untuk tugas pengalihan itu) di server utama, untuk mengalihkan ke port apache dari setiap wadah.

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

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

Ini adalah pengaturan terakhir, dan 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 docker saya harus menyiapkan header SSL proxy. Dalam kasus saya, wadah menjalankan nginx dan sesuatu yang disebut semua untuk menyiapkan aplikasi ruby. Saya pikir ini dapat diatur dalam file konfigurasi nginx juga. Akan menuliskannya sebagai hanya dalam kasus seseorang menemukan ini bermanfaat

nginx['redirect_http_to_https'] = truenginx['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 hostnginx['real_ip_header'] = 'X-Real-IP'nginx['real_ip_recursive'] = 'on'

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

Secara teoritis dimungkinkan, Apache akan melakukan ProxyPass terhadap port yang didengarkan oleh setiap instance Docker.