¿Cómo configurar la asignación del puerto de Docker para usar Nginx como un proxy ascendente?


2 Answers

Usando los enlaces de acoplador , puede vincular el contenedor de aguas arriba al contenedor de nginx. Una característica adicional es que Docker administra el archivo de host, lo que significa que podrá referirse al contenedor vinculado usando un nombre en lugar de la IP potencialmente aleatoria.

Question

Actualización II

Ahora es 16 de julio de 2015 y las cosas han cambiado nuevamente. Descubrí este contenedor automágico de Jason Wilder : https://github.com/jwilder/nginx-proxy y resuelve este problema casi tanto como demora docker run el contenedor. Esta es ahora la solución que estoy usando para resolver este problema.

Actualizar

Ahora es julio de 2015 y las cosas han cambiado drásticamente con respecto a los contenedores Docker de redes. Ahora hay muchas ofertas diferentes que resuelven este problema (en una variedad de formas).

Deberías usar esta publicación para obtener una comprensión básica de la aplicación docker --link para descubrir servicios, que es lo más básico posible, funciona muy bien y, en realidad, requiere menos baile elegante que la mayoría de las otras soluciones. Es limitado, ya que es bastante difícil redireccionar contenedores en hosts separados en un clúster dado, y los contenedores no pueden reiniciarse una vez que se conectan a la red, pero ofrece una forma rápida y relativamente fácil de redizar contenedores en el mismo host. Es una buena manera de tener una idea de lo que el software que probablemente utilizará para resolver este problema lo está haciendo bajo el capó.

Además, es probable que también quiera consultar la network naciente de Docker, el consul de Hashicorp, Weaveworks progrium/consul , progrium/consul y gliderlabs/registrator Jeff Lindsay, y Google Kubernetes .

También están las ofertas de CoreOS que utilizan etcd , fleet y flannel .

Y si realmente quieres tener una fiesta, puedes girar un clúster para ejecutar Mesosphere , Deis o Flynn .

Si eres nuevo en la creación de redes (como yo), entonces deberías sacar tus lentes de lectura, pop "Paint The Sky With Stars - Lo mejor de Enya" en el Wi-Hi-Fi, y romper una cerveza - va a ser un tiempo antes de que realmente entiendas exactamente qué es lo que estás tratando de hacer. Sugerencia: está intentando implementar una Service Discovery Layer en su Cluster Control Plane . Es una forma muy agradable de pasar un sábado por la noche.

Es muy divertido, pero ojalá me hubiera tomado el tiempo para educarme mejor sobre la creación de redes en general antes de sumergirme en él. Finalmente encontré un par de publicaciones de los benevolentes dioses del Tutorial Ocean Digital: Introduction to Networking Terminology y Understanding ... Networking Introduction to Networking Terminology Understanding ... Networking . Sugiero leer esas algunas veces primero antes de bucear.

¡Que te diviertas!



Publicación original

Parece que no puedo entender el mapeo de puertos para los contenedores Docker . Específicamente, cómo pasar solicitudes de Nginx a otro contenedor, escuchando en otro puerto, en el mismo servidor.

Tengo un Dockerfile para un contenedor Nginx así:

FROM ubuntu:14.04
MAINTAINER Me <me@myapp.com>

RUN apt-get update && apt-get install -y htop git nginx

ADD sites-enabled/api.myapp.com /etc/nginx/sites-enabled/api.myapp.com
ADD sites-enabled/app.myapp.com /etc/nginx/sites-enabled/app.myapp.com
ADD nginx.conf /etc/nginx/nginx.conf

RUN echo "daemon off;" >> /etc/nginx/nginx.conf

EXPOSE 80 443

CMD ["service", "nginx", "start"]



Y luego el archivo de configuración api.myapp.com ve así:

upstream api_upstream{

    server 0.0.0.0:3333;

}


server {

    listen 80;
    server_name api.myapp.com;
    return 301 https://api.myapp.com/$request_uri;

}


server {

    listen 443;
    server_name api.mypp.com;

    location / {

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
        proxy_pass http://api_upstream;

    }

}

Y luego otro para app.myapp.com también.

Y luego corro:

sudo docker run -p 80:80 -p 443:443 -d --name Nginx myusername/nginx


Y todo se levanta bien, pero las solicitudes no se transfieren a los otros contenedores / puertos. Y cuando entro al contenedor de Nginx e inspecciono los registros, no veo errores.

¿Alguna ayuda?




Se puede hacer que share funcione mediante el uso de la imagen base de Ubuntu y la configuración de nginx por su cuenta. (No funcionó cuando usé la imagen Nginx de Docker Hub).

Aquí está el archivo Docker que utilicé:

FROM ubuntu
RUN apt-get update && apt-get install -y nginx
RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log
RUN rm -rf /etc/nginx/sites-enabled/default
EXPOSE 80 443
COPY conf/mysite.com /etc/nginx/sites-enabled/mysite.com
CMD ["nginx", "-g", "daemon off;"]

Mi configuración nginx (también conocida como: conf / mysite.com):

server {
    listen 80 default;
    server_name mysite.com;

    location / {
        proxy_pass http://website;
    }
}

upstream website {
    server website:3000;
}

Y finalmente, cómo empiezo mis contenedores:

$ docker run -dP --name website website
$ docker run -dP --name nginx --link website:website nginx

Esto me puso en marcha y mi nginx apuntó la parte anterior al segundo contenedor acoplable que expuso el puerto 3000.




Acabo de encontrar un article de Anand Mani Sankar que muestra una forma simple de usar el proxy ascendente nginx con el compositor Docker.

Básicamente, uno debe configurar la vinculación y los puertos de la instancia en el archivo docker-compose y actualizar en sentido ascendente en nginx.conf en consecuencia.




Related



Tags

nginx   docker docker