사용자가 FTP로 액세스 할 수있는 자체 웹 사이트가있는 서버 (예 : 호스팅 회사와 같은)를 관리하고 LAMP 스택 프로세스를 분리하는 대신 Docker를 구현하고 웹 사이트 당 이미지를 사용할 수 있는지 궁금합니다.
내가 이해 한 바에 따르면 포트를 통해 Docker 인스턴스를 노출 할 수 있으므로 동일한 서버에서 두 개의 docker 인스턴스를 실행하면 두 개의 다른 포트를 노출해야합니다.
그러나 포트가 아닌 서버 이름을 내보낼 수 있습니다.
- www.somewebsite.com : Docker 인스턴스 1
- www.otherwebsite.com : Docker 인스턴스 2
- www.etc.com : 도커 인스턴스 …
그리고 그것은 같은 서버에 있습니다.
서버에 Apache 만 설치하는 것에 대해 생각했습니다. 서버 이름을 기반으로 요청을 전용 Docker 인스턴스로 리디렉션하지만 모든 Docker 인스턴스에 Apache (다시!)와 MySQL을 설치해야합니다.
이것이 가능하고 또한 성능 측면에서 흥미 롭습니까?
도와 주셔서 감사합니다.
답변
네 가능합니다. 당신이해야 할 일은 몇 개의 80 포트를 제공하는 것입니다. 각 URL마다 하나씩입니다. 예를 들어 Docker 호스트 서버에서 실행되는 Apache의 Virtual Host를 사용 하여이 작업을 수행 할 수 있습니다.
- DNS CNAME을 설정하십시오.
- 도커 인스턴스를 실행하고 포트 80을 도커 호스트의 12345 ~ 12347 포트에 매핑합니다.
- 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>
답변
것이 가능하다. 각 컨테이너의 아파치 포트로 리다이렉션하기 위해 메인 서버에서 아파치 (또는 더 좋은 방법으로, haproxy, nginx 또는 varnish, 그 리디렉션 작업보다 아파치보다 효율적일 수 있음)를 사용할 수 있습니다.
그러나 실행하는 사이트 (및 해당 아파치 구성)에 따라, 특히 많은 RAM이 필요한 모듈 (예 : PHP)이있는 경우 가상 호스트에 단일 중앙 아파치를 사용하는 것보다 훨씬 더 많은 메모리가 필요할 수 있습니다.
답변
나는 이것이 이미 대답되었다는 것을 알고 있지만 한 단계 더 나아가서 더 완전한 대답을 제공하기 위해 어떻게 할 수 있는지에 대한 예를 보여주고 싶었습니다.
사용 방법에 대한 지침과 함께 내 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
답변
필자의 경우 도커 컨테이너에서 SSL을 활성화하려고했기 때문에 SSLProxyEngine On , ProxyPreserveHost On 및 RequestHeader를 프론트 엔드 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