Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso de Docker

Curso de Docker

Guido Vilariño

Guido Vilariño

Exponiendo contenedores

12/32
Recursos

Aportes 62

Preguntas 14

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Comandos:

$ docker run -d --name proxy nginx (corro un nginx)
$ docker stop proxy (apaga el contenedor)
$ docker rm proxy (borro el contenedor)
$ docker rm -f <contenedor> (lo para y lo borra)
$ docker run -d --name proxy -p 8080:80 nginx (corro un nginx y expongo el puerto 80 del contenedor en el puerto 8080 de mi máquina)
localhost:8080 (desde mi navegador compruebo que funcione)
$ docker logs proxy (veo los logs)
$ docker logs -f proxy (hago un follow del log)
$ docker logs --tail 10 -f proxy (veo y sigo solo las 10 últimas entradas del log)

Hasta el momento mucho mejor que el curso anterior, mas “mascadito”

![](

En Windows 10 al hacer Ctrl+C vuelve a la línea de comando pero proxy sigue corriendo. Al menos en mi pc.

Les comparto cheatsheet de comandos de Docker, además de esta pagina con mas detalles sobre los comandos: https://dockerlabs.collabnix.com/docker/cheatsheet/

Para eliminar todos los contenedores se puede usar

$ docker rm -f $(docker ps -aq)

Super las explicaciones del profe Guido!

Wow, que fácil, puedes conectar un puerto con otro jaja, empiezo a comprender, básicamente la bandera -d es la que se encarga de mantener el contenedor vivo, pensé que era el comando tail el que lo mantenía vivo 🤔

Los contenedores están aislados del sistema y a nivel de red, cada contenedor tiene su propia stack de net y sus propios puertos.
Debemos redirigir los puertos del contenedor a los de la computadora y lo podemos hacer al utilizar la bandera -p (publish):

docker run -d --name [name] -p [HostPort/8080]:[ContainerPort/80] [imagen/nginx]

solo por mera curiosidad, es indifferente donde se coloque la -d ?, en mi caso coloque docker run -d --name proxy -p 5280:80 nginx (tambien cambie el puerto por probar) y me funciono todo ok.

sudo docker run -d --name proxy nginx
sudo docker run --name proxy -p 8080:80 nginx
sudo docker run --name proxy -d -p 8080:80 nginx
sudo docker logs proxy
sudo docker logs -f proxy
sudo docker logs --tail -f proxy
sudo docker logs --tail 10 -f proxy

Observacion:
si se quiere visualizar los logs de un contenedor se ejecuta el comando

docker logs <contenedor>

argumentos adicionales
-f : folow. muestra los logs en tiempo real
–tail <<numero de logs >>: Muestra los ultimos logs

Nota: terminar el proceso docker logs no cierra el docker que está consultando

Cada contenedor tiene su propio stack en el networking, su propia interfaz de red virtual. Necesitamos exponer el contenedor: docker run -d --name proxy -p 8080:80 nginx(8080 de mi máquina fisica y 80 del contenedor que quiero exponer)

Para agregar un poco a la exposición de puertos, también lo podemos hacer de manera aleatoria utilizando -P
.
Podemos exponer un contenedor por un puerto aleatorio que esté libre en nuestro Docker Server
.
Exponer contenedor por puerto random

$ docker run -dP nginx

.
Ver los puertos expuestos del contenedor

$ docker port proxy

10. Exponiendo contenedores

  1. Para exponer un contenedor se debe habilitar un puerto para que escuche las solicitudes que se le hacen al contenedor, nginx para este caso práctico trae un puerto habilitado que es el 80 y tiene un proceso encendido por defecto

  2. Luego a ese puerto del contenedor se le debe asociar a un puerto de la máquina hosts

  3. Adicionalmente visualizar los logs de peticiones

Crear un contenedor partiendo de una imagen de nginx Asociar un puerto de un contenedor a una máquina hosts
Ejecución del paso 1 y 2

$ sudo docker run -d --name <nombre contenedor> -p <puerto hosts>:<puerto contenedor>    <imagen> 

	-d or --detach : 
		Inicia un contenedor sin asociar el input/output del contenedor al terminal.
	-name: 
		asigna un nombre a nuestra contenedor, localmente

	-p: 
		publish,  asocia el puerto hosts con el puerto del contenedo

Ejemplo

$ sudo docker run -d --name proxy -p 8080:80 nginx 

Se puedo abrir el navegador y visualizar que funciona localhost:8080 (desde mi navegador compruebo que funcione)

Visualizar los logs
Ejecución del paso 3

$ sudo  docker logs <nombre contenedor>
$ sudo  docker logs -f  <nombre contenedor>
$ sudo  docker logs --tail 10 -f <nombre contenedor

	-f:
		Follow, conecta input/output de nuestra termianl
	--tail n:
		Muestra las n lineas en la terminal

Ejemplo:

$ sudo docker logs proxy
$ sudo docker logs -f proxy
$ sudo docker logs --tail 10 -f proxys

Este curso esta genial, el profe explica super bien

Published ports (official documentation).

esta bueno y fácil de entender!

Si les sale este error

Error response from daemon: pull access denied for proxy, repository does not exist or may require 'docker login': denied: requested access to the resource is denied. See 'docker run --help'.

Asegúrense de estar escribiendo el comando bien

docker run -d --name proxy -p 3000:80 nginx

EXPONER CONTENEDORES

Asociar un Puerto de la máquina anfitriona con un puerto del contenedor para utilizar los servicios del contenedor desde afuera.

-p, --publish list Publish a container’s port(s) to the host

docker run --name <container_name> --detach --publish <local_port>:<container_port> <image>

docker run --name proxy --detach --publish 8080:80 nginx . Creamos un contenedor llamado proxy en background asociando el Puerto 80 de la computadora anfitriona al Puerto 80 del contenedor con la imagen official de nginx.

Ver los logs de un contenedor

docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

-f, --follow Follow log output

docker logs –follow <container_name>
docker logs -f proxy . muestra en la consola en tiempo real los logs generados por el proceso principal del contenedor, en este caso, las peticiones http al nginx. Saliedo con control+c corta la visualización de logs en consola y no afecta el proceso principal.

** Expose container port to the machine
$ docker run --name proxy -d -p 8080:80

<h1>To expose container port to the machine ex.: docker run --name proxy -d (detach mode: to run in the background) -p(p: publish) 8080(machine’s port) :80(container’s port) nginx</h1>

$ docker logs proxy

<h1>To see all the logs</h1>

$ docker logs -f proxy

<h1>To conect to the container output</h1>

¿Cuando yo descargo una imagen de nginx por ejemplo, esta descarga un linux que tiene instalado nginx o solo se descarga el programa nginx?

Es decir, yo puedo tener solo una aplicación en un contenedor o siempre existirá un Sistema Operativo + La aplicación que yo desee usar 🤔

Tengo una duda. Con docker puedo usar una imagen de Ubuntu y correrlo como un contenedor sin problemas, dentro de Ubuntu puedo instalar y correr apache y webmin, estos corren en localhost o un servidor local, sin embargo, como ubuntu esta corriendo en un contenedor, cómo expongo este servicio contenido en Ubuntu, de modo que pueda consultarlo sin problemas desde mi máquina nativa?. Gracias

-d, --detach Ejecutar contenedor en segundo plano e imprimir ID de contenedor

¿A alguien más le sucede que al corre docker run --name proxy -p 8080:8080 nginx y al abrir en el navegador el https://localhost:8080 se le queda cargando infinitamente y no sale nginx?

En mi caso funcionó la creación de proxi con el puerto 8888:80 no sé si sea mi localhost por defecto pero es el mismo que sale cuando ejecuto Jupyter Notebook 😊

El promt del BASH del contenedor [email protected]:/#
el numero es igual que el ID del proceso Container ID :6a85cccf6165

No me quedo claro lo de -d ? Tengo una idea vaga pero si me puede dar claridad lo agradecería

Clave para dar salida por los distintos puertos a los contenedores que se crean.

Comunidad les dejo la lista de comandos Docker
Escribe el comando que mas usas!

Como podría solucionar este issue
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default .sh: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default .sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up

Genial explicación.

Genial!

crack!

docker run -d --name server ngnix -p 8080:80, para crear un nuevo container de imagen ngnix, de nombre server, que no muestre el output del comando que ejecuta, y que el puerto 80 del container sea redirigido al puerto 8080 del hosts.

Como funcionan los contenedores por fuera

Proxy o balanceador de carga nginx

docker run -d --name proxy nginx

Verificar si funciona en localhost, no funcionara debido a que el contenedor escucha el puerto 80 del contenedor pero no de la pc. No puede haber mas de un servicio en un puerto.

Como hacemos visible el nginx?

  1. detenemos el proceso
docker stop proxy
  1. levantar en un puerto real de la maquina
    • -p port 8080(maquina anfitriona):80(contenedor)
docker run --name proxy -p 8080:80 nginx

Se debe de correr con -d para que quede corriendo por detras y no se detenga.

docker run --name proxy -d -p 8080:80 nginx

Pero como hago para ver los logs del contenedor?

docker logs proxy

Para verlos en tiempo real se agrega el -f

docker logs -f proxy

Q buenas clases la del profesor Guido, he estado muy entretenido aprendiendo.

gracias por tu aporte Gastón, como mi maquina es mas lenta me da oportunidad de ejecutar los comandos sin perder el curso del profesor Guido.

Excelente clase, cada vez entiendo mejor Docker.

Que importante es Linux para usar docker 😄

¿Que ocurre si en la terminal escribes docker run -p 8080:80 nginx? Se crea y ejecuta un contenedor que corre nginx, vinculando el puerto 8080 de la maquina anfitriona al puerto 80 del contenedor.

docker logs --tail 10 -f proxy la opcion --tail nos deja solo ver las ultimas 10 lineas del log el parametro se puede modificar para ver mas o menos lineas

docker logs -f proxy. para ver la informacion que arroja el contenedor

En el navegador poner localhost:8080 para saber que esta corriendo el contenedor.

docker run -d –name proxy -p 8080:80 nginx # expone un puerto de la maquina anfitriona al contenedor. la opcion -d es para que el proceso corra en segundo plano y la -p es para indicarle conq ue puertos estaremos trabajando.

docker run -d –name proxy -p 8080:80 nginx # expone un puerto de la maquina anfitriona al contenedor. la opcion -d es para que el proceso corra en segundo plano y la -p es para indicarle conq ue puertos estaremos trabajando.

me sale el siguiente error docker: Error response from daemon: Conflict. The container name “/prox” is already in use by container “2c4cb82ddc6f3192c3c68fefbd22af1191fbe1b5ccb6ded207ed6c00a5fa5062”. You have to remove (or rename) that container to be able to reuse that name.
See ‘docker run --help’. pero cambie el puerto y funciono, no se que proceso estara utilizando el puerto 8080

¿No me anda y no se por que? jajajaja

Cuantas veces nos a pasado eso mientras desarrollamos 😂

Si no es el puerto es un type mal puesto en un reductor 😆

Gracias Guido!!! no solo aprendo un monton, si no que, me divierto muchisimo con tus clases ✌

EXPONIENDO CONTENEDORES #Conetenedor con nginix $ docker run -d --name <nombre> nginx #Exponer contenedores por port forwading $ docker run -d --name <nombre> -p <puerto-maquina>:<puerto-contenedor> <imagen> #Ver logs $ docker logs <nombre> $ docker logs -f <nombre> $ docker logs --tail 10 -f <nombre>

Comandos de la clases implementadas a un script de bash: Link.

docker run --name proxy -p 8080:80 nginx

p indica (publish, port)

8080: es el puerto de la máquina anfitriona, es decir el puerto de nuestra máquina.

80: es el puerto de nuestro contenedor.

interesante

Los contenedores están aislados del sistema y a nivel de red, cada contenedor tiene su propia stack de net y sus propios puertos.

Debemos redirigir los puertos del contenedor a los de la computadora y lo podemos hacer al utilizar este comando:

# -d detach si tiene un proceso que tiene output me devuelva la terminal - se coloca el nombre
# cuando termine un numero o el SHA y con esto identifica el contenedor
docker run -d --name server -p 8080:00  nombreDelContenedor
# Aperecio PORTS 80/tcp -- No se peude acceder poq estan aislados los contenedores, tenemos que asociar el puerto con nuestro host
docker run -d --name server nginx
# Asocio o publico el puerto de mi host al contenedor
docker run -d --name server -p 8080:80 nginx
# Con este comando no se puede tener el mismo nombre ni el mismo puerto
docker run -d --name server -p 8080:80 nginx
# Borrar contenedor y frenar de una 
docker rm -f contenedor
# ver logs
docker logs proxy 
docker logs -f proxy 
docker logs --tail 10 -f proxy

Otra manera de comprobar desde la consola en caso de estar en un ambiente linux y no contar con un ambiente gràfico es usando CURL

$ docker run --name proxy -p 8080:80 -d nginx 
a501cba910de7c4399d2123d2ff811871c991b2f23cd530f706d7fd7ef327b27
[node1] (local) [email protected] ~
$ curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Excelente clase

Brutal esta clase!

Interesante

docker logs: Sirve para ver el estado de tu servidor.
docker logs -f: Sirve para verlo en tiempo real, usando esto si nos podemos salir del contenedor sin matarlo.

estoy flipando en colores, que capo es el profesor, rápidamente he aprendido muchisimo.

  1. Ejecutar un comando o un proceso en un contenedor corriendo
    docker exec -it alwaysup bash //container: alwaysup, comando: bash
  • Lo dejaremos corriendo.
  1. Detener un docker container
  • docker inspect --format ‘{{.State.Pid}}’ alwaysup
    kill 10264
  • docker strop proxy

USAR PUERTO DEL CONTENEDOR

  1. Vincular el nuestro puerto y el del contenedor
    docker run --name proxy -p 8080:80 nginx // local: 8080, contenedor: 80
    docker run --name proxy -d -p 8080:80 nginx // modo: daemon

  2. Ver logs del contenedor
    docker logs --tail 10 -f proxy

Cada contenedor tiene su propio stack de networking, tiene su propia interfaz de red virtual. Muchos contenedores por defecto exponen un puerto, pero el puerto de un contenedor no es el puerto de la máquina anfitriona.

Para entender un poco mejor, podríamos tener muchos contenedores que exponen un mismo puerto y no tendríamos ningún problema, pero la máquina anfitriona sólo puede tener un servicio por puerto.

Si queremos exponer en la máquina anfitriona un puerto expuesto por un contenedor, lo podemos hacer en el momento en que iniciamos un contenedor a través del flag -p. Al usar este flag, especificamos primero el puerto que queremos exponer en la máquina anfitriona, y seguido de dos puntos, el puerto expuesto por el contenedor. Por ejemplo:

$ docker run -d --name proxy -p 8080:80 nginx

-d detach (modo background)

Exponiendo el contenedor