Aqui estão duas respostas possíveis: (1) configurar portas diretamente com Docker e usar Nginx / Apache para fazer proxy dos vhosts, ou (2) usar Dokku para gerenciar portas e vhosts para você (que é como aprendi a fazer o Método 1).
Método 1a (atribuir portas diretamente com docker)
Etapa 1: configure nginx.conf ou Apache no host, com as atribuições de número de porta desejadas. Este servidor web, rodando no host, fará o proxy vhost. Não há nada de especial nisso em relação ao Docker - é uma hospedagem vhost normal. A parte especial vem a seguir, na Etapa 2, para fazer o Docker usar o número de porta do host correto.
Etapa 2: force as atribuições de número de porta no Docker com "-p" para definir os mapeamentos de porta do Docker e "-e" para definir variáveis de ambiente personalizadas no Docker, da seguinte maneira:
port=12345
IMAGE=myapps/container-1
id=$(docker run -d -p :$port -e PORT=$port $IMAGE)
echo $id
echo $id > /app/files/CONTAINER
docker ps
docker logs $id
docker kill $id
Método 1b Porta de aplicativo codificada
... se seu aplicativo usa uma porta codificada, por exemplo a porta 5000 (ou seja, não pode ser configurada por meio da variável de ambiente PORT, como no Método 1a), então ela pode ser codificada por meio do Docker como este:
publicPort=12345
id=$(docker run -d -p $publicPort:5000 $IMAGE)
Método 2 (deixe Dokku descobrir as portas)
No momento, uma boa opção para gerenciar vhosts do Docker é o Dokku . Uma opção futura pode ser usar Flynn , mas no momento Flynn está apenas começando e ainda não está pronto. Portanto, vamos com o Dokku por enquanto: Após seguir as instruções de instalação do Dokku, para um único domínio, habilite o vhosts criando o arquivo "VHOST":
echo yourdomain.com > /home/git/VHOST
Agora, quando um aplicativo é enviado via SSH para Dokku (consulte os documentos do Dokku para saber como fazer isso), o Dokku vai olhar para o arquivo VHOST e para o aplicativo enviado (digamos que você tenha enviado "container-1"), ele irá gerar o seguinte arquivo:
/home/git/container-1/nginx.conf
E terá o seguinte conteúdo:
upstream container-1 { server 127.0.0.1:49162; }
server {
listen 80;
server_name container-1.yourdomain.com;
location / {
proxy_pass http://container-1;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
Quando o servidor for reinicializado, o Dokku garantirá que o Docker inicie o aplicativo com a porta mapeada para sua porta inicialmente implantada (49162 aqui), em vez de receber outra porta aleatoriamente. Para alcançar essa atribuição determinística, o Dokku salva a porta inicialmente atribuída /home/git/container-1/PORT
e na próxima inicialização, ele define o PORT
ambiente com esse valor e também mapeia as atribuições de porta do Docker para ser esta porta no lado do host e no lado do aplicativo. Isso se opõe ao primeiro lançamento, quando Dokku irá definir PORT=5000
e então descobrir qualquer porta aleatória que o Dokku mapeie no lado VPS para 5000 no lado do aplicativo. É redondo (e pode até mudar no futuro), mas funciona!
O modo como o VHOST funciona, por baixo do capô, é: ao fazer um push git do aplicativo via SSH, o Dokku executará ganchos que residem no /var/lib/dokku/plugins/nginx-vhosts
. Esses ganchos também estão localizados no código-fonte do Dokku aqui e são responsáveis por gravar os nginx.conf
arquivos com as configurações corretas de vhost. Se você não tiver esse diretório /var/lib/dokku
, tente executar dokku plugins-install
.