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

12

Eu gerencio servidores onde os usuários têm seus próprios sites que podem ser acessados pelo FTP (como uma empresa de hospedagem) e, em vez de trabalhar no isolamento de processos de pilha LAMP, fiquei imaginando 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, precisará expor duas portas diferentes.

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

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

E isso, no mesmo servidor.

Pensei em instalar somente o Apache no servidor, que redirecionaria a solicitação para a instância do Docker dedicada com base no nome do servidor, mas eu teria que instalar o Apache (novamente!) e o MySQL em quaisquer instâncias do Docker.

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

Obrigado pela sua ajuda.

    
por Cyril N. 29.09.2014 / 10:49

4 respostas

11

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

  1. Definir o CNAME do DNS.
  2. Execute as instâncias do docker e mapeie sua porta 80 para a porta, digamos, 12345 ~ 12347 do host do docker.
  3. Execute o servidor Apache no host do docker e configure 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 ficará assim:

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

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

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

    
por 08.10.2014 / 13:37
3

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

Por favor, veja a minha imagem docker aqui com instruções sobre como usá-lo, isso irá mostrar-lhe como configurar dois sites link

Como jihun disse que você terá que ter certeza de ter seu conjunto de configurações 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: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"]

Espero que isso ajude a explicar o processo um pouco mais. Por favor, sinta-se livre para me perguntar mais sobre isso, feliz em ajudar.

Atenciosamente,

V

    
por 10.11.2015 / 17:49
0

No meu caso, eu precisava adicionar SSLProxyEngine em , ProxyPreserveHost em e RequestHeader definir front-end-Https "em" para o meu apache 2.4 arquivo vhost, porque eu queria ativar o SSL no contêiner docker. Sobre o local.hostname.ofDockerHost , no meu caso, o nome do servidor host que está executando o contêiner docker era lucas e a porta mapeada para a porta 443 do contêiner docker era 1443 (porque a porta 443 já estava em uso pelo apache no servidor host), então a linha acabou assim link

Esta é a configuração final e está funcionando 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>

Por fim, no contêiner docker, eu tive que configurar cabeçalhos SSL de proxy. No meu caso, o contêiner estava executando o nginx e algo chamado omnibus para configurar aplicativos ruby. Eu acho que isso pode ser configurado em um arquivo de configuração nginx também. Escrevê-lo como é apenas no caso de alguém achar isso útil

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'

Guia completo do apache, Configuração do ISP, servidor Ubuntu 16.04 aqui link

    
por 07.09.2016 / 14:24