É possível usar o Docker para separar sites para usuários?

Eu gerencio servidores onde os usuários têm seus próprios sites que podem ser acessados por FTP (como uma empresa de hospedagem) e, em vez de trabalhar no isolamento de processos de pilha de lâmpadas, gostaria de saber se era possível implementar o Docker e usar imagens por site.

Pelo que entendi, você pode expor a instância do Docker por meio de suas portas, portanto, se você executar duas instâncias do docker no mesmo servidor, terá que expor duas portas diferentes.

Mas é possível exportar Não portas, mas o nome do servidor, como :

  • www.somewebsite.com : Docker instância 1
  • www.otherwebsite.com : Docker instância 2
  • www.etc.com : instância do Docker ...

E isso, no mesmo servidor.

Eu pensei em instalar apenas o Apache no servidor, que redirecionaria a solicitação para a instância dedicada do Docker com base no nome do servidor, mas então eu teria que instalar o Apache (novamente !) andMySQL em todas as instâncias do Docker.

Isso é possível e, além disso, isso é interessante em termos de desempenho (ou não)?

Obrigado pela sua ajuda.

Sim, é possível. O que você precisa fazer é fornecer várias portas 80. um para cada URL. Você pode fazer isso usando, por exemplo, Host Virtual do Apache em execução no servidor host Docker.

  1. Definir DNS CNAME.
  2. Execute instâncias do docker e mapeie sua porta 80 para a porta, digamos, 12345~12347 do host do docker.
  3. Execute o Apache server no Docker host e defina um Host Virtual para cada URL e defina ProxyPass e ProxyPassReverse como localhost: 12345, que é uma das instâncias do docker.

O arquivo de configuração do Apache será parecido com este:

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

Eu sei que isso já foi respondido, no entanto, eu queria dar um passo adiante e mostrar-lhe um exemplo de como isso poderia ser feito, para fornecer uma resposta mais completa.

Veja minha imagem do docker aqui com instruções sobre como usá-la, isso mostrará como configurar dois siteshttps://hub.docker.com/r/vect0r/httpd-proxy/

Como jihun disse, você terá que ter certeza de ter seu conjunto de configuração vhost. Meu exemplo usa a porta 80 para exibir um site de teste example.com e 81 para exibir o site de teste example2.com. também importante notar que você precisará especificar seu conteúdo e expor as portas necessárias em seu Dockerfile, como tal;

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

Espero que isso ajude a explicar o processo um pouco mais. Sinta-se à vontade para me fazer mais perguntas sobre isso, feliz em ajudar.

Cumprimento,

V

É possível. Você pode usar o apache (ou melhor ainda, haproxy, nginx ou varnish, que pode ser mais eficiente do que o apache para apenas essa tarefa de redirecionamento) no servidor principal, para redirecionar para as portas apache de cada contêiner.

Mas, dependendo dos sites que você executa lá (e suas configurações do apache), pode exigir muito mais memória do que usar um único apache central com virtualhosts, especialmente se você tiver módulos (ou seja, php) que exigem muita RAM.

No meu caso, eu precisava adicionar SSLProxyEngine Em, ProxyPreserveHost Em e RequestHeader definir Front-End-Https"On" para o meu arquivo vhost apache 2.4, porque eu queria habilitar SSL no contêiner docker. Sobre o local.anfitriao.ofDockerHost, no meu caso, o nome do servidor host que executa o contêiner docker foi Lucas, e a porta mapeada para a porta 443 do contêiner docker foi 1443 (porque a porta 443 já estava em uso pelo apache no servidor host), então essa linha acabou dessa maneira https://lucas:1443/

Esta é a configuração final, e está funcionando muito bem!

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

Finalmente, no contêiner docker, tive que configurar cabeçalhos SSL proxy. No meu caso, o contêiner estava executando o nginx e algo chamado todo para configurar aplicativos ruby. Acho que isso também pode ser configurado em um arquivo de configuração do nginx. Irá anotá-lo como é apenas no caso de alguém achar isso útil

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'

Guia completo para apache, ISP Config, Ubuntu server 16.04 aqui https://www.howtoforge.com/community/threads/subdomain-or-subfolder-route-requests-to-running-docker-image.73845/#post-347744

Teoricamente, é possível, o Apache faria um ProxyPass para a porta que cada instância do Docker está ouvindo.