Aquí hay dos posibles respuestas: (1) configure los puertos directamente con Docker y use Nginx / Apache para proxy los vhosts, o (2) use Dokku para administrar puertos y vhosts por usted (que es como aprendí a hacer el Método 1).
Método 1a (asignar puertos directamente con la ventana acoplable)
Paso 1: Configure nginx.conf o Apache en el host, con las asignaciones de número de puerto deseadas. Este servidor web, que se ejecuta en el host, hará el proxy vhost. No hay nada especial en esto con respecto a Docker: es un alojamiento de vhost normal. La parte especial viene a continuación, en el Paso 2, para que Docker use el número de puerto de host correcto.
Paso 2: fuerce las asignaciones de números de puerto en Docker con "-p" para configurar las asignaciones de puertos de Docker y "-e" para configurar las variables de entorno personalizadas dentro de Docker, de la siguiente manera:
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 Puerto de aplicación codificado de forma rígida
... si su aplicación utiliza un puerto codificado, por ejemplo, el puerto 5000 (es decir, no se puede configurar a través de la variable de entorno PORT, como en el Método 1a), entonces se puede codificar a través de Docker de esta manera:
publicPort=12345
id=$(docker run -d -p $publicPort:5000 $IMAGE)
Método 2 (deja que Dokku descubra los puertos)
Por el momento, una opción bastante buena para administrar los vhosts de Docker es Dokku . Una próxima opción puede ser usar Flynn , pero a partir de ahora Flynn recién está comenzando y no está del todo listo. Por lo tanto, vamos con Dokku por ahora: después de seguir las instrucciones de instalación de Dokku, para un solo dominio, habilite vhosts creando el archivo "VHOST":
echo yourdomain.com > /home/git/VHOST
Ahora, cuando una aplicación se envía a través de SSH a Dokku (consulte los documentos de Dokku para saber cómo hacer esto), Dokku verá el archivo VHOST y para la aplicación en particular presionada (digamos que presionó "contenedor-1"), generará el siguiente archivo:
/home/git/container-1/nginx.conf
Y tendrá los siguientes contenidos:
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;
}
}
Cuando se reinicia el servidor, Dokku se asegurará de que Docker inicie la aplicación con el puerto asignado a su puerto implementado inicialmente (49162 aquí), en lugar de que se le asigne al azar otro puerto. Para lograr esta asignación determinista, Dokku guarda el puerto asignado inicialmente /home/git/container-1/PORT
y en el próximo lanzamiento establece el PORT
entorno en este valor, y también asigna las asignaciones de puertos de Docker para que sean este puerto tanto en el lado del host como en el lado de la aplicación. Esto se opone al primer lanzamiento, cuando Dokku configurará PORT=5000
y luego determinará cualquier puerto aleatorio que Dokku asigne en el lado VPS a 5000 en el lado de la aplicación. Es redondo (e incluso podría cambiar en el futuro), ¡pero funciona!
La forma en que funciona VHOST, bajo el capó, es: al hacer un git push de la aplicación a través de SSH, Dokku ejecutará los ganchos que viven en /var/lib/dokku/plugins/nginx-vhosts
. Estos ganchos también se encuentran en el código fuente Dokku aquí y son responsables de escribir los nginx.conf
archivos con los ajustes correctos de hosts virtuales. Si no tiene este directorio /var/lib/dokku
, intente ejecutarlo dokku plugins-install
.