Docker를 사용하여 사용자를 위해 웹 사이트를 분리 할 수 ​​있습니까?


12

사용자가 FTP로 액세스 할 수있는 자체 웹 사이트가있는 서버 (예 : 호스팅 회사와 같은)를 관리하고 LAMP 스택 프로세스를 분리하는 대신 Docker를 구현하고 웹 사이트 당 이미지를 사용할 수 있는지 궁금합니다.

내가 이해 한 바에 따르면 포트를 통해 Docker 인스턴스를 노출 할 수 있으므로 동일한 서버에서 두 개의 docker 인스턴스를 실행하면 두 개의 다른 포트를 노출해야합니다.

그러나 포트가 아닌 서버 이름을 내보낼 수 있습니다.

  • www.somewebsite.com : Docker 인스턴스 1
  • www.otherwebsite.com : Docker 인스턴스 2
  • www.etc.com : 도커 인스턴스 ...

그리고 그것은 같은 서버에 있습니다.

서버에 Apache 만 설치하는 것에 대해 생각했습니다. 서버 이름을 기반으로 요청을 전용 Docker 인스턴스로 리디렉션하지만 모든 Docker 인스턴스에 Apache (다시!)와 MySQL을 설치해야합니다.

이것이 가능하고 또한 성능 측면에서 흥미 롭습니까?

도와 주셔서 감사합니다.


1
이론적으로 Apache는 각 Docker 인스턴스가 수신하는 포트를 향해 ProxyPass를 수행 할 수 있습니다.
thanasisk

답변:


12

네 가능합니다. 당신이해야 할 일은 몇 개의 80 포트를 제공하는 것입니다. 각 URL마다 하나씩입니다. 예를 들어 Docker 호스트 서버에서 실행되는 Apache의 Virtual Host를 사용 하여이 작업을 수행 할 수 있습니다.

  1. DNS CNAME을 설정하십시오.
  2. 도커 인스턴스를 실행하고 포트 80을 도커 호스트의 12345 ~ 12347 포트에 매핑합니다.
  3. docker 호스트에서 Apache 서버를 실행하고 각 URL에 가상 호스트를 설정하고 ProxyPass 및 ProxyPassReverse를 docker 인스턴스 중 하나 인 localhost : 12345로 설정하십시오.

아파치 설정 파일은 다음과 같습니다 :

<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
감사! 이것은 많은 도움이되었습니다. 또한,가 ProxyPreserveHost On있으므로 웹 사이트의 local.hostname.ofDockerHost : 12345에 대한 링크가 많지 않습니다 . 다음은 나에게 도움이되었다 대한 추가 정보는 다음과 같습니다 digitalocean.com/community/tutorials/...
세바스티안 라미레스

도커는 데이터베이스 등에 변경 사항을 저장합니까?
EminezArtus

3

것이 가능하다. 각 컨테이너의 아파치 포트로 리다이렉션하기 위해 메인 서버에서 아파치 (또는 더 좋은 방법으로, haproxy, nginx 또는 varnish, 그 리디렉션 작업보다 아파치보다 효율적일 수 있음)를 사용할 수 있습니다.

그러나 실행하는 사이트 (및 해당 아파치 구성)에 따라, 특히 많은 RAM이 필요한 모듈 (예 : PHP)이있는 경우 가상 호스트에 단일 중앙 아파치를 사용하는 것보다 훨씬 더 많은 메모리가 필요할 수 있습니다.


답변 주셔서 감사합니다. 실제로, 내가 제공 할 "호스팅"서비스는 Prestashop, Wordpress 등과 같은 것들을 포함하여 PHP와 무거운 엔진에 기반을두고 있습니다 (여기서는 Prestashop에 대해 더 이야기하고 있습니다).
Cyril N.

1
PHP를 자체 Docker 컨테이너로 분리하고 Apache 컨테이너가 해당 컨테이너를 PHP 처리에 사용하도록하여 Dockerized 가상 호스팅 시스템을 더 잘 모듈화 할 수 있습니까? 데이터베이스에도 동일하게 적용됩니까? 예를 들어 사용자 컨테이너를 포함하는 Apache 컨테이너에 대한 호스트 프록시 트래픽이 있으며, 이는 모든 PHP 처리를 PHP 컨테이너로 보내고 데이터베이스 읽기 / 쓰기를 MySQL 컨테이너로 보냅니 까? 아니면 PHP가 이런 식으로 리소스를 덜 소비합니까? PHP-FPM, SuPHP 또는 이와 유사한 제품이 Docker 이외의 환경에서 동일한 종류의 설정을 제공합니까?
ojrask

컨테이너의 PHP-FPM은 최소한 파일 공간이 약간 중복됩니다. code.google.com/p/sna/wiki/NginxWithPHPFPM Apache / Nginx 설치는 PHP 파일을 PHP-FPM 컨테이너에 순서대로 복사해야합니다. 이 시스템이 작동합니다. 마운트 된 공유 데이터 컨테이너가이 문제를 해결합니까?
ojrask

컨테이너간에 데이터 (즉, PHP 파일)를 공유 해야하는 경우 볼륨을 사용하는 방법은 다른 컨테이너 (데이터 전용 컨테이너도 있음) 또는 실제 파일 시스템에서 마운트 할 수 있습니다. 아파치 모듈은 PHP 파일을 실행하는 가장 빠른 방법이었으며 정적 파일이 아닌 PHP 전용 코드를 사용했으며 정적 / 캐시 가능 콘텐츠 (예 : 니스)를 전달하는 상위 계층이 좋은 콤보가 될 수 있습니다.
gmuslera

3

나는 이것이 이미 대답되었다는 것을 알고 있지만 한 단계 더 나아가서 더 완전한 대답을 제공하기 위해 어떻게 할 수 있는지에 대한 예를 보여주고 싶었습니다.

사용 방법에 대한 지침과 함께 내 docker 이미지를 참조하십시오.이 사이트는 두 사이트를 구성하는 방법을 보여줍니다 https://hub.docker.com/r/vect0r/httpd-proxy/

jihun이 말했듯이 vhost 구성이 설정되어 있는지 확인해야합니다. 내 예제는 포트 80을 사용하여 테스트 사이트 example.com을 표시하고 81을 사용하여 테스트 사이트 example2.com을 표시합니다. 또한 Dockerfile에 컨텐츠를 지정하고 필요한 포트를 노출시켜야합니다.

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

이것이 프로세스를 조금 더 설명하는 데 도움이되기를 바랍니다. 이에 대해 더 궁금한 점이 있으면 언제든지 문의 해주세요.

문안 인사,

V


또한이 이미지를 github에 만드는 데 사용 된 파일도 업로드했습니다. github.com/V3ckt0r/docker-httpd-proxy
Vect0r

1

필자의 경우 도커 컨테이너에서 SSL을 활성화하려고했기 때문에 SSLProxyEngine On , ProxyPreserveHost OnRequestHeader를 프론트 엔드 HTTPs를 "on" 으로 설정해야했습니다. [정보 local.hostname.ofDockerHost , 내 경우에는 고정 표시기 컨테이너를 실행하는 호스트 서버의 이름이었다 루카스 , 그리고 고정 표시기 컨테이너의 포트 443에 매핑 포트이었다 1443 포트 443 호스트에서 아파치에서 이미 사용했기 때문에 ( 서버), 그래서 그 줄은 이런 식으로 끝났습니다 https : // lucas : 1443 /

이것은 최종 설정이며 제대로 작동합니다!

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

마지막으로 도커 컨테이너에서 프록시 SSL 헤더를 설정해야했습니다. 필자의 경우 컨테이너는 nginx와 루비 앱을 설정하기 위해 omnibus 라는 것을 실행 했습니다. 나는 이것이 nginx 설정 파일에서도 설정할 수 있다고 생각합니다. 누군가가 도움이되는 경우를 대비하여 적어 두십시오.

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'

아파치, ISP 구성, Ubuntu 서버 16.04에 대한 전체 안내서는 https://www.howtoforge.com/community/threads/subdomain-or-subfolder-route-requests-to-running-docker-image.73845/#post-347744

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.