epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
Hola a todos...necesito montar algunos servicios en diferentes Docker, pero varios servicio utilizan los mismos puertos y y un Docker no levanta si uno de sus puertos esta siendo utilizado por otro Docker, la cosa es que estaba buscando algunas soluciones y se podría lograr configurando un proxy reverso con nginx... utilizando proxy reverso , ¿alguien recomienda hacerlo de alguna forma?? ... configurar el proxy en el host o crear otro docker y que haga de proxy?, usar nginx o se puede usar apache2?

Gracias.
 

Miguelwill

I am online
Miembro del Equipo
MOD
Se incorporó
23 Febrero 2004
Mensajes
12.402
para los contenedores que que usen el mismo puerto, puedes usar puertos diferentes en la red del host y así te ahorras el problema del puerto repetido
como cuando usan el 80, y los defines como "-p 8081:80" y en otro contenedor "-p 8082:80"

si cada contenedor va a servir una página puntual, vas a necesitar un proxy reverso que te ayude a derivar las peticiones entrantes por cada nombre de sitio a un puerto diferente, y asi que responda la página correspondiente

para el proxy reverso evita usar apache2, ya que sus módulos lo hacen muy pesado para la función de bypass que le quieres dar

puedes usar un contenedor con nginx, o si no te quieres complicar mucho al principio, instala nginx en el equipo base y ahí le configuras los virtualhost para que en cada proxy_pass vaya algo como "localhost:8081"
y en otro "localhost:8082" y así, apuntando a los puertos que mapeaste en docker

cuando tengas más experiencia, podrías usar Traefik, que funciona sobre docker y se autoconfigura usando tags en los contenedores, pero igual requiere su tiempo de prueba y error antes de lanzarse a utilizarlo eficientemente.

si vas a manejar los contenedores en un host único, recomiendo usar docker-compose para gestionar los servicios usando archivos yaml, y así facilitarte la gestión , reinicio, recuperación, reconfiguración, etc

saludos
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
gracias por tu post @miguelwill ,entonces chao apache2 y lo seguiré viendo con nginx... claro, tenia la idea de verlo como docker o instalándolo directamente en el host y desde ahí distribuir las peticiones... osea de ambas maneras podría hacer que https://web01,empresa.cl se vaya al docker web01 y si el usuario ingresan a https://web02.empresa.cl esa petición se vaya al docker web02 ... ambas paginas con 443... y así luego con una web03, web04 y web05 ??
 
Upvote 0

AlCapone

IBMer
Se incorporó
15 Octubre 2005
Mensajes
3.160
Lo mas práctico es montar esas docker images en una plataforma de Kubernetes y dejar q la plataforma maneje los endpoints y balancee y escale la carga.

https://codeburst.io/getting-starte...ner-with-kubernetes-in-5-minutes-eb4be0e96370

Puedes instalar K8s vanilla, usar uno de los servicios de k8s en cualquier cloud o usar alguno empresarial como RedHat Openshift (q la lleva!), pero en todos vas a lograr q tu deployment sea gestionado por la plataforma, enfocándote tu en que hace tu app más que como corre.

Suerte y si necesitas mas tutoriales, pregunta!
 
Upvote 0

Dr.Jet

Miembro Activo
Se incorporó
2 Julio 2006
Mensajes
16
Lo mas práctico es montar esas docker images en una plataforma de Kubernetes y dejar q la plataforma maneje los endpoints y balancee y escale la carga.

https://codeburst.io/getting-starte...ner-with-kubernetes-in-5-minutes-eb4be0e96370

Puedes instalar K8s vanilla, usar uno de los servicios de k8s en cualquier cloud o usar alguno empresarial como RedHat Openshift (q la lleva!), pero en todos vas a lograr q tu deployment sea gestionado por la plataforma, enfocándote tu en que hace tu app más que como corre.

Suerte y si necesitas mas tutoriales, pregunta!
Buena solucion, con publicidad incluida a IBM.

off topic: ¿como les respondes a los haters de IBM por matar CentOS ?
 
Upvote 0

dwyer

Sonidista-Computin
Se incorporó
10 Mayo 2005
Mensajes
2.830
Lo mas práctico es montar esas docker images en una plataforma de Kubernetes y dejar q la plataforma maneje los endpoints y balancee y escale la carga.

https://codeburst.io/getting-starte...ner-with-kubernetes-in-5-minutes-eb4be0e96370

Puedes instalar K8s vanilla, usar uno de los servicios de k8s en cualquier cloud o usar alguno empresarial como RedHat Openshift (q la lleva!), pero en todos vas a lograr q tu deployment sea gestionado por la plataforma, enfocándote tu en que hace tu app más que como corre.

Suerte y si necesitas mas tutoriales, pregunta!
A propósito, cuando otra charla de Kubernetes?
Podrías hacer un webinar con la gente del foro
Así no pedimos que te baneen por matar CentOS

Saludos

Enviado desde mi SM-G955F mediante Tapatalk
 
Upvote 0

Miguelwill

I am online
Miembro del Equipo
MOD
Se incorporó
23 Febrero 2004
Mensajes
12.402
gracias por tu post @miguelwill ,entonces chao apache2 y lo seguiré viendo con nginx... claro, tenia la idea de verlo como docker o instalándolo directamente en el host y desde ahí distribuir las peticiones... osea de ambas maneras podría hacer que https://web01,empresa.cl se vaya al docker web01 y si el usuario ingresan a https://web02.empresa.cl esa petición se vaya al docker web02 ... ambas paginas con 443... y así luego con una web03, web04 y web05 ??
asi es, rapido y directo
para un par de contenedores kubernetes seria como matar una mosca con un tanke :risas
pero si que permite escalar y manejar todo de forma mas ordenada cuando se necesitan mas contenedores, endpoints, etc (en mi caso uso Rancher, nada de andar sobandole el lomo a redhat :xd )
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
en realidad creo que tendré aprox. 5 contenedores

antes de comenzar, ¿no hay problema si el contenedor nginx-proxy o el host es con nginx y las web dentro de los contenedores estan en apache2?
 
Última modificación:
Upvote 0

Miguelwill

I am online
Miembro del Equipo
MOD
Se incorporó
23 Febrero 2004
Mensajes
12.402
en realidad creo que tendré aprox. 5 contenedores

antes de comenzar, ¿no hay problema si el contenedor nginx-proxy o el host es con nginx y las web dentro de los contenedores estan en apache2?
ninguno
solo que los recursos finales los va a consumir apache, nginx solo hara el bypass de peticiones
 
Upvote 0

Miguelwill

I am online
Miembro del Equipo
MOD
Se incorporó
23 Febrero 2004
Mensajes
12.402
Me gusta manejar este tipo de detalles de mis containers con Portainer.
si, en entornos pequeños es muy practico, incluso en un pequeño cluster de 3 maquinas con un par de servicios (cluster swarm) permite seguir el estado de los contenedores rapidamente
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
tengo una duda.... en los lados donde leo indican que se generen un contenedor con letsencrypt, pero yo ya tengo mis certificados, no necesito generar otro o por lo menos por ahora, si ya tengo mis certificados no tengo que levantar ese otro contenedor y solamente levantaria el nginx-proxy y mis 3 contenedores web, donde en el Dockerfile le envio mi careta completa donde estan mis archivos y subcaprtas de mi web al contenedor web y tambien le envio los certificados y el archivo site de apache.

son unas paginas que actualmente están en maquinas sin contenedores y las quiero pasar a docker, por lo tanto en el dockerfile transfiero todo el directorio de la web, instalo las dependencias que necesita para correr, traspaso el site mas los certificados y activo los modulos... eso con las 3 web en distintos contenedores, pero al querer levantar el nginx-proxy como indico el tema del certificado sin generar este otro contenedor adicional de letsencrypt que en este momento no lo necesito??

tendre que configurar el site del nginx-proxy e metetr los certificados ahi ??y borrarlos de los contenedores web o se podran dejar ahi sin problema?
?
 
Última modificación:
Upvote 0

Miguelwill

I am online
Miembro del Equipo
MOD
Se incorporó
23 Febrero 2004
Mensajes
12.402
nginx (contenedor o directo en el host) es el que debe manejar los SSL publicos
despues estan los webservers, que pueden funcionar sobre http sin problema, pero en el caso de que necesites activar https internamente, solo tienes que usar un ssl autofirmado en el web interno, y nginx que se conecte al host por el puerto https (443)
nginx no validara el ssl interno
pero los navegadores validaran el ssl contra el nginx que se conecten primero, asi que solo ahi tienes que preocuparte de tener los ssl validos

no necesitas un contenedor para los certificados si lo estas gestionando en el host directamente

primero preocupate de tener los servicios funcionando y que las paginas tengan lo que necesitan en sus contenedores, ya que el balanceador es solo un intermediario, que puedes preparar ahora o mas adelante (nginx, traefik, etc)
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
gracias y sorry por tantas preguntas, pero aun no lo tengo todo claro....

cree una maquina en aws ec2 con ubuntu 20.04, levante un contenedor ahí y le metí la estructura de web de otro lado completa, con sus archivos, carpetas, virtualhost, site y cert, al entrar a la ip publica por el navegador "https" conecta al contenedor porque le indique los puertos el memento de correr el docker run, osea hasta ahí esta todo OK

Luego arme para levantar una segunda web que trabaja en el mismo puerto y que también es https e hice lo mismo, en el dockerfile indique todo para mover toda su estructura actual (archivos, carpetas, site, cert, etc), una vez creada la imagen y querer levantar el contenedor tuve el problema porque no podía levantar 2 contenedores con los mismos puertos y surgió la búsqueda el proxy-reverso con nginx.

como ya tengo los certificados, descarte las opciones de instalación del nginx con letsencrypt y pensaba manejar los certificados internamente en los contenedores (sitios web apache2) en sus archivos de virtualhost (no se si sera la mejor opción), teniendo eso pensado solo tendría que levantar un contenedor y seria el de nginx como proxy-reverso mas los "x" contenedores con sus web... para eso ya utilice "docker-compose" y arma el archivo .yml:

***Para empezar solo estoy probando con 1 web y ver si pasa al https, utilizo el Dockerfile que tengo en esa carpeta

web01:
build: web01
expose:
- "80"
environment:
VIRTUAL_HOST: web01.dominio.cl
restart: always

nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
# - /var/www/html/web01/SSL:/etc/nginx/certs:rw (esta linea se la deje comentada ya que usaría el cert dentro del contenedor de los web)

restart: always
privileged: true

Despues hago un:
# docker-compose build
# docker-compose up -d


# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

ed5c5030f89c html_web01 "docker-php-entrypoi…" 19 seconds ago Up 17 seconds 80/tcp html_web01_1

e87a6f735592 jwilder/nginx-proxy "/app/docker-entrypo…" 19 seconds ago Up 17 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp html_nginx-proxy_1

***Nose porque le pone el nombre de "html_web01_1" al contenedor... no sera ese el problema que quizas no lo encuentra para pasarle la peticion?


Cuando entro al contenedor de nginx y entro al archivo de configuración (/etc/nginx/conf.d/default.conf) veo que armo la estructura de virtualhost con el nombres de web01 al final del archivo:
# web01.dominio.cl
upstream web01.dominio.cl {
## Can be connected with "bridge" network
# html_web01_1
server 172.17.0.2:80;
}
server {
server_name web01.dominio.cl;
listen 80 ;
access_log /var/log/nginx/access.log vhost;
location / {
proxy_pass http://web01.dominio.cl;
}
}


Pero al ingresar a https://web01.dominio.cl no carga... tengo mi archivo local "/etc/hosts" tal cual como me cargaba cuando estaba sin el contenedor nginx.

Estará bien mi archivo docker-compose.yml ?? en el web01 indicarle solo el "80" ? no es necesario crear una docker network??

Lo otro es que si trato ver los log de /var/log/nginx/access.log no me muestra nada y si entro me dice ""/var/log/nginx/access.log" is not a normal file" ... y no puedo ver lo que esta haciendo o no haciendo por detrás el proxy.. si el fallo esta en que no la envía la petición al contenedor o si la envía quizás el contenedor no levanta la web?


EDIT:
Deberia haber un problema con los certificados....

Si desde mi notebook hago un:

# curl http://web01.dominio.cl

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://web01.dominio.cl/">here</a>.</p>
<hr>
<address>Apache/2.4.38 (Debian) Server at web01.dominio.cl Port 80</address>
</body></html>


# curl https://web01.dominio.cl
curl: (35) OpenSSL SSL_connect: Conexión reinicializada por la máquina remota in connection to web01.dominio.cl:443



Si hago lo mismo en la maquina host donde están los contenedores:

# curl http://web01.dominio.cl

<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.19.3</center>
</body>
</html>

# curl https://web01.dominio.cl

curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
 
Última modificación:
Upvote 0

Miguelwill

I am online
Miembro del Equipo
MOD
Se incorporó
23 Febrero 2004
Mensajes
12.402
primero:
no puedes usar 2 contenedores a la vez que intenten utilizar el mismo puerto en todas las ip locales (o en la misma ip si la indicas explicitamente), esto es una regla basica de servicios, ya que el socket IP : puerto/protocolo es unico para 1 proceso que lo este escuchando

segundo:
si pones un proxy reverso como nginx para recibir las conexiones de uno o varios sitios via https, si o si necesitas cargar el certificado valido en la configuracion del virtualhost en nginx, ya que este, invariablemente, sera quien reciba las conexiones y negocie el cifrado de los datos entre el (nginx) y el navegador del usuario
en este punto, que el webserver interno (apache2) funcione con certificado o no, va a depender mas que nada de la aplicacion y sus refrescos automaticos y deteccion de si esta funcionando sobre https o no (como los .htaccess de joomla o wordpress para refrescar la pagina si esta llega por http, o la declaracion de nombre del sitio de wordpress), por lo que ahi puedes probar primero dejar el "proxy_pass" como http y despues usar https para llegar al contenedor a travez del puerto que funcione para llegar al 443 interno

tercero:
un servicio web puede funcionar sobre docker con un puerto publico "diferente" del predeterminado, de esta forma puedes usar varios servicios similares sin que se trabe uno por otro, por ejemplo:
en la declaracion de puertos en el archivo docker-compose.yml, puedes usar el puerto estandar:
ports:
- 80:80
- 443:443

y tambien usar unos diferentes para dejar estos libres para el balanceador:

ports:
- 81:80
- 444:443

y el siguiente contenedor/servicio web :

ports:
- 82:80
- 445:443

y asi consecutivamente

y en nginx solo tendrias que hacer algo asi :

proxy_pass https://localhost:444

y para otro sitio:

proxy_pass https://localhost:445

y asi puedes agregar tantos como quieras

saludos
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
si, al final le saque los certificados y le desactive los site a los web internos y deje a nginx con los certificados y que me administrara las peticiones a los sitios.... así entro a ambas pagina como https://web01.dominio.cl y https://web02.dominio.cl . Por el momento la visualización ya esta ok, no se con que me vaya a topar mas adelante con el resto de cosas que hay que hacer xD ... pero muchas gracias!
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
Si uno monta los docker en un EC2 y tener en esa instancia 4 contenedores sera lo mismo que usar el servicio de ECS??... valdrá la pena montarlos en ECS?, seria ilógico tener un EC2 con docker dentro si existe el servicio de ECS??, costo v/s performance que convendra?? o para pocos contenedores da lo mismo??
 
Upvote 0

AlCapone

IBMer
Se incorporó
15 Octubre 2005
Mensajes
3.160
Normalmente, la capa de gestión de contenedores basta.
El usar una instancia de EC2 para montar docker lo único que te da es control sobre el layer de containers a ti. Para bien o para mal.
En términos de uso de recursos y consumo, apps en containers bien hechas consumen como 30% menos q si comparas a las apps en distintas VMs o instancias de EC2 corriendo. Esto puede variar hasta un 5% en cosas no tan tuneadas, pero casi siempre es mas liviano.
Para pocos containers, es mejor usar un servicio de containers. Para muchos, más.
Si necesitas gobernar por tu lado la manera de exponer servicios, la seguridad, manejar el devops entre ambientes, etc... quizás puedas pensar en un Kubernetes como servicio (OpenShift en Amazon por ejemplo o EKS en este caso de esta nube... todas las nubes tienen u Openshift o un servicio de Kubernetes nativo que vale la pena explorar).

Éxito!
 
Upvote 0
Subir