Có thể sử dụng Docker để tách các trang web cho người dùng không?


12

Tôi quản lý các máy chủ nơi người dùng có trang web của riêng họ trên đó có thể truy cập bằng FTP (như một công ty lưu trữ) và thay vì làm việc cô lập các quy trình ngăn xếp LAMP, tôi tự hỏi liệu có thể triển khai Docker và sử dụng hình ảnh trên mỗi trang web không.

Theo những gì tôi hiểu, bạn có thể hiển thị phiên bản Docker thông qua các cổng của họ, vì vậy nếu bạn chạy hai phiên bản docker trên cùng một máy chủ, bạn sẽ phải hiển thị hai cổng khác nhau.

Nhưng có thể xuất không phải cổng, mà là tên máy chủ, như:

  • www.somewebsite.com: Docker dụ 1
  • www.otherwebsite.com: Docker dụ 2
  • www.etc.com: Docker dụ ...

Và trong cùng một máy chủ.

Tôi đã nghĩ về việc chỉ cài đặt Apache trên máy chủ, điều đó sẽ chuyển hướng yêu cầu đến phiên bản Docker chuyên dụng dựa trên tên máy chủ, nhưng sau đó tôi sẽ phải cài đặt Apache (một lần nữa!) Và MyQuery trên mọi phiên bản Docker.

Điều này có thể và hơn thế nữa, điều này có thú vị về mặt hiệu suất (hoặc hoàn toàn không)?

Cảm ơn sự giúp đỡ của bạn.


1
Về mặt lý thuyết là có thể, Apache sẽ thực hiện ProxyPass đối với cổng mà mỗi phiên bản Docker đang lắng nghe.
thanasisk

Câu trả lời:


12

Vâng, nó là có thể. Những gì bạn cần làm là cung cấp một số 80 cổng. một cho mỗi URL. Bạn có thể làm điều này bằng cách sử dụng, ví dụ Máy chủ ảo của Apache đang chạy trên máy chủ lưu trữ Docker.

  1. Đặt DNS CNAME.
  2. Chạy các phiên bản docker và ánh xạ cổng 80 của chúng sang cổng, giả sử, 12345 ~ 12347 của máy chủ docker.
  3. Chạy máy chủ Apache trên máy chủ docker và đặt Máy chủ ảo cho mỗi URL và đặt ProxyPass và ProxyPassReverse thành localhost: 12345, một trong những phiên bản docker của bạn.

Tệp cấu hình Apache sẽ trông như thế này:

<VirtualHost *:80>
ServerName www.somewebsite.com
  <Proxy *>
    Allow from localhost
  </Proxy>
  ProxyPass        / http://local.hostname.ofDockerHost:12345/
  ProxyPassReverse / http://local.hostname.ofDockerHost:12345/
</VirtualHost>

4
Cảm ơn! Điều này đã giúp rất nhiều. Ngoài ra, có ProxyPreserveHost On, vì vậy bạn không có nhiều liên kết đến local.hostname.ofDockerhost: 12345 kích hoạt trang web của bạn. Dưới đây là thông tin hữu ích cho tôi: digitalocean.com/community/tutorials/ Kẻ
Sebastián Ramírez

Docker sẽ lưu các thay đổi vào cơ sở dữ liệu vv?
EminezArtus

3

Điều đó là có thể. Bạn có thể sử dụng apache (hoặc tốt hơn là haproxy, nginx hoặc véc ni, có thể hiệu quả hơn apache cho nhiệm vụ chuyển hướng đó) trong máy chủ chính, để chuyển hướng đến các cổng apache của mỗi container.

Nhưng, tùy thuộc vào các trang web bạn chạy ở đó (và cấu hình apache của chúng), nó có thể cần nhiều bộ nhớ hơn so với sử dụng một apache trung tâm duy nhất với virtualhost, đặc biệt nếu bạn có các mô-đun (ví dụ: php) cần nhiều RAM.


Cảm ơn về câu trả lời của bạn. Thật vậy, dịch vụ "lưu trữ" mà tôi sẽ cung cấp bao gồm những thứ như Prestashop, Wordpress, v.v., vì vậy, dựa rất nhiều vào PHP và các công cụ nặng (tôi đang nói nhiều hơn về Prestashop ở đây).
Cyril N.

1
Hệ thống lưu trữ ảo Dockerized sẽ được mô đun hóa tốt hơn bằng cách tách PHP thành (các) bộ chứa Docker của riêng nó và làm cho (các) bộ chứa Apache sử dụng bộ chứa đó để xử lý PHP? Điều tương tự cho cơ sở dữ liệu sẽ áp dụng? Ví dụ: Có lưu lượng proxy lưu trữ đến các bộ chứa Apache (có chứa các trang web người dùng), lần lượt gửi tất cả xử lý PHP tới bộ chứa PHP và cơ sở dữ liệu đọc / ghi vào bộ chứa MySQL? Hoặc PHP sẽ ít đói tài nguyên hơn theo cách này? PHP-FPM, SuPHP hoặc tương tự có cung cấp cùng loại thiết lập trong môi trường không Docker không?
ojrask

PHP-FPM trong một thùng chứa ít nhất sẽ là một chút không gian tệp dự phòng: code.google.com/p/sna/wiki/NginxWithPHPFPM Việc cài đặt Apache / Nginx cần sao chép các tệp PHP sang bộ chứa PHP-FPM theo thứ tự cho hệ thống này hoạt động. Một thùng chứa dữ liệu chia sẻ gắn kết sẽ giải quyết vấn đề này?
ojrask

Nếu bạn cần chia sẻ dữ liệu (Tức là các tệp php) giữa các thùng chứa, khối lượng là cách để sử dụng, bạn có thể gắn kết chúng từ các thùng chứa khác (thậm chí có các dữ liệu dành riêng cho dữ liệu) hoặc hệ thống tệp thực. Mô-đun apache từng là cách nhanh nhất để chạy mã php, có một tệp chỉ dành cho php, không phải tệp tĩnh và có lớp trên để phân phối nội dung tĩnh / có thể lưu trong bộ nhớ cache (tức là véc ni) có thể là một kết hợp tốt.
gmuslera

3

Tôi biết điều này đã được trả lời tuy nhiên tôi muốn tiến thêm một bước và cho bạn thấy một ví dụ về cách thực hiện việc này, để cung cấp một câu trả lời đầy đủ hơn.

Vui lòng xem hình ảnh docker của tôi ở đây với hướng dẫn về cách sử dụng nó, điều này sẽ chỉ cho bạn cách định cấu hình hai trang web https://hub.docker.com/r/vect0r/httpd-proxy/

Như jihun nói, bạn sẽ phải đảm bảo rằng bạn đã thiết lập cấu hình vhost của mình. Ví dụ của tôi sử dụng cổng 80 để hiển thị trang web thử nghiệm example.com và 81 để hiển thị trang web thử nghiệm example2.com. Cũng cần lưu ý rằng bạn sẽ cần chỉ định nội dung của mình và hiển thị các cổng cần thiết trong Dockerfile của bạn, như vậy;

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

Hy vọng điều này sẽ giúp giải thích quá trình một chút được nhiều hơn. Xin vui lòng hỏi tôi bất kỳ câu hỏi nào về điều này, vui lòng giúp đỡ.

Trân trọng,

V


Tôi cũng đã tải lên các tệp được sử dụng để tạo hình ảnh này trên github; github.com/V3ckt0r/docker-httpd-proxy
Vect0r

1

Trong trường hợp của tôi, tôi cần thêm SSLProxyEngine On , ProxyPreservehost OnRequestHeader đặt Front-End-Https "On" vào tệp aphost 2.4 apache của tôi, vì tôi muốn bật SSL trên thùng chứa docker. Về local.hostname.ofDockerhost , trong trường hợp của tôi, tên của máy chủ lưu trữ chạy bộ chứa dockerlucas và cổng được ánh xạ tới cổng 443 của bộ chứa docker1443 (vì cổng 443 đã được sử dụng bởi apache trong máy chủ máy chủ), do đó, dòng kết thúc theo cách này https: // lucas: 1443 /

Đây là thiết lập cuối cùng, và nó hoạt động tốt!

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

Cuối cùng, trong bộ chứa docker tôi đã phải thiết lập các tiêu đề SSL proxy. Trong trường hợp của tôi, container đang chạy nginx và một thứ gọi là omnibus để thiết lập các ứng dụng ruby. Tôi nghĩ rằng điều này có thể được thiết lập trong một tập tin cấu hình nginx là tốt. Sẽ viết nó xuống như trong trường hợp ai đó thấy điều này hữu ích

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'

Hướng dẫn đầy đủ cho apache, ISP Config, máy chủ Ubuntu 16.04 tại đây https://www.howtoforge.com/community/threads/subdomain-or-subfolder-route-requests-to-ricky-docker-image.73845/#post-347744

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.