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

Usando Docker para desarrollar aplicaciones

19/32
Recursos

Aportes 36

Preguntas 9

Ordenar por:

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

Comandos:

$ git clone https://github.com/platzi/docker
$ docker build platziapp . (creo la imagen local)
$ docker image ls (listo las imagenes locales)
$ docker run --rm -p 3000:3000 platziapp (creo el contenedor y cuando se detenga se borra, lo publica el puerto 3000)
$ docker ps (veo los contenedores activos)

Explicación del Dockerfile

Práctica desarrollada:

Clonación de un repositorio:

git clone https://github.com/platzi/docker

Comando para construir una imágen basado en el Dockerfile

docker build -t platziapp

Comando para listar las imágenes existentes en mi máquina con Docker

docker image ls

Crear el contenedor con la instrucción de borrarse una vez que sea detenido, además expone el puerto 3000 del contenedor en el puerto 3000 de la máquina anfitrión

docker run --rm -p 3000:3000 platziapp

Explicación del archivo Dockerfile

# especifica la imágen base, para este caso se trata de node con especificación de versión 12
FROM node:12

# copiar todo lo que existe en el directorio actual (durante el build, es decir se refiere al directorio de nuestra máquina host/anfitrión), 
# en el directorio /usr/src/ del contenedor, es así como al final podemos ejecutar el archivo index.js, dado que se encuentra en el 
# conjunto de archivos que copiamos desde nuestra máquina al contenedor.
COPY [".", "/usr/src/"]

# establecer el directorio de trabajo, similar a utilizar el comando cd /usr/src
WORKDIR /usr/src

# descargar las dependencias del proyecto al ejecutar el comando de npm (node package manager)
RUN npm install

# Expone este puerto del contenedor, es decir, lo pone a la escucha
EXPOSE 3000

# ejecuta el comando node index.js en el contenedor ya creado
CMD ["node", "index.js"]

Docker está demasiado genial 😄

19. Usando Docker para desarrollar
Ejemplo como utilizar docker para el desarrollo

  1. Creamos una carpeta y nos posicionamos dentro de esa carpeta.
  2. Luego Clonamos un proyecto de github y nos posicionamos dentro del proyecto clonado
  3. Verificamos que los archivos estén allí
  4. Realizamos la construcción de la imagen,

Parámetro -t o tag : Indica el tag de la imagen a construir.
Parámetro . : indica el directorio de trabajo

  1. Verificar que la imagen ha sido creada.
  2. Crear el contenedor basado en la imagen anteriormente creada y:

Parámetro --rm para que, al detenerse. el contenedor se borre
Parámetro -p indicar que el puerto del host:contenedor están asociados.

  1. Comprobar que el contenedor recién creado este activo
  2. Comprobar que el contenedor puede recibir petición desde el navegador, mostrará un error porque la nuestro contenedor no está asociado a ninguna bases de mong.

Ejecución de los pasos

  1. mkdir docker-pj && cd docker-pj
  2. $ git clone https://github.com/platzi/docker && cd docker
  3. ll
  4. code .
  5. $ sudo docker build -t platziapp .
  6. $ sudo docker image ls
  7. $ sudo docker run --rm -p 3000:3000 platziapp
  8. $ sudo docker ps
  9. localhost:3000

Explicación de docker file

Comandos de la clase

Para los que estan siguiendo esta practica desde window dentro de WSL. les comparto los paso que utilice para detener/ eliminar el contenedor;
Abrir una nueva terminar :

docker ps -a
docker stop ( pero me dejo indicando un proceso zombi) ?
top ( busque el ID del proceso zombi = docker ) en la misma consola
kill el N°ID del proceso.

saludos

Para los que están en Windows, la manera optima de clonar el repositorio es con este comando

git clone https://github.com/platzi/docker --config core.autocrlf=input

de está forma los line-endings de Unix no son alterados, lo cual podría hacer que los scripts no funcionen como deberían
https://willi.am/blog/2016/08/11/docker-for-windows-dealing-with-windows-line-endings/

Mi Dockerfile para desarrollo de aplicaciones python

FROM python:3.8.4-buster
RUN apt-get -y update
RUN apt-get install -y git vim emacs zsh git-core
RUN wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | zsh

COPY [".", "/app"]

WORKDIR /app
RUN /usr/local/bin/python3 -m pip install --upgrade pip
RUN python3 -m pip install -r requirements.txt

CMD ["python3", "--version"]

La finalidad de esta clase:

  • Descargar el proyecto.
  • Crear la imagen que viene definida en el Dockerfile
  • Correr un Container de la imagen y conectarlo al puerto 3000 local

DockerFile Python (de esta forma fue sumamente sencillo instalar lo que necesitaba)

FROM continuumio/anaconda3
#Cambiando de directorio
WORKDIR /app
#Copia de archivos desde local
ADD [".", "/app"]
#Actualizando pip para instalar packages necesarios
RUN pip install --upgrade pip
RUN pip install -r requirement.txt
#Expone puerto de contenedor
EXPOSE 5000
CMD [ "python3", "app.py"]

Los requirements se ven así para python al menos (debes ponerlos en un .txt):

numpy==1.21.0
backports.entry-points-selectable==1.1.0
click==8.0.1
colorama==0.4.4 

Otra cosa cool es que si quieres hacer un request http (POST, PUT, UPDATE, etc) y necesitas enviar informacion puedes usar postman (https://www.postman.com/).

¡Genial!, ahora todo empieza a tener más sentido, aunque me gustaría saber cómo instalar paquetes dentro de una imagen de Ubuntu en Docker, es decir, probé a usar sudo apt install php8.0, pero no me dejó 🤔 (y sí, ya sé que existen imágenes para PHP, pero estaría genial saber cómo instalar paquetes 😄)

Por fin entendi que era WORDIR

WORKDIR = cd

Y CMD <Con que correrlo> <que correr>

me da la impresion… o esto es muchisimo mas poderoso que GIT… o en otros terminos git es a bind mount como Doker es a volume 😛 !

se les hace útil armar una imagen con un stack de programas preinstalados con un requirements txt?? (por ejemplo para empresas)… o estoy mal en la filosofía que tiene esto?
Sería genial si alguien me puede responder si lo estoy enfocando bien o no he entendido nada jejeje

podria decirse que creamos una imagen de NODEjs.? ademas al asignar un nombre de repositorio arbitrario no habra problema o confusion a la hora de hacer run a un contenedor de dockerHub?? por ejemplo si hubiera llamado node en lugar de de platziapp??

Una vez aprenda docker, lo siguiente sera node!

buena explicacion sobre el Dockerfile, mas ejemplo con otros entornos o stacks de desarrollo por favor

en el siguiente enlace encontrarán información relacionada al respecto
https://ualmtorres.github.io/usoBasicoDeDocker/

Para aquellos a quienes se les queda en NPM INSTALL, el siguiente comando lo arreglo para mi:

docker build -t . --network host

Creo que es porque la red de docker no puede salir a descargar algunos paquetes y por eso hay que especificar que la red que se usara es la del host

DESARROLLO DE APLICACIONES CON DOCKER

#Clonar repositorio de ejemplo
  git clone https://github.com/platzi/docker

#Crear una imagen local
  docker build <nombre> . 

#Listar imagenes
 docker image ls

#Crear contenedor con opción de borrar si se detiene
 docker run --rm -p 3000:3000 <image-name> 

#Ver contenedores activos
  docker ps
  • COPY [".","/usr/src"], par copiar archivos de un origen, en este caso del contexto de build “.”, hacia un destino “/usr/src”
  • WORKDIR /usr/src, es como un cd de la línea de comandos hacia el directorio base.
  • EXPOSE 3000, para abrir o exponer el puerto, en caso 3000.
  • CMD ["node","index.js"], Es el comando que se ejecutará cuando se inicie el contenedor.

Si bien la descarga de las capas de la imágenes de docker es en simultaneo, la extracción de las mismas se ejecuta de manera secuencial.

  • docker run -rm -p 3000:3000 imagename, para eliminar el contenedor, cuando termine el ciclo del o contenedor o se apague.
#clonar el repositorio
$ git clone [https://github.com/platzi/docker] 
#crear la imagen (buildiar)
$ docker build platziapp .
#listar las imagenes en el host
$ docker image ls o docker images
#correr el contenedor con la opcoion --rm para que se borre al detenerlo y expongo los puertos 3000
$ docker run -d --rm -p 3000:3000 platziapp
#se listan los contenedores activos 
$ docker ps 

Hice una imagen que corre una web app en Kotlin

Pueden ejecutarla

docker run --name kotlin_app -d -p 8080:8080 windoctor7/kotlin-app:latest

Y abrir localhost:8080 en el navegador.

Este es el Dockerfile

  FROM openjdk:8-jdk
  EXPOSE 8080:8080
  RUN mkdir /app
  COPY ./build/install/docker/ /app/
  WORKDIR /app/bin
  CMD ["./docker"]

Un dato interesante es que el expose no es necesario, porque varias images que construí no lo indique en el Dockerfile, pero al darle run, si le di el parámetro publish, funcionando de igual forma

Veamos el Dockerfile…


_

  1. Clonar repositorio de github
git clone https://github.com/platzi/docker
  1. Entendiendo dockerfile
FROM node:12

# copiar todos los archivos desde build a esa ruta
COPY [".", "/usr/src/"]

# como hacer cd 
WORKDIR /usr/src

RUN npm install

# permitir que el puerto sea vinculable, se pueda acceder al contenedor mediante ese puerto
EXPOSE 3000

# comando a ejecutarse
CMD ["node", "index.js"]
  1. Build del proyecto
docker build -t platziapp .
  1. Correr el contenedor
    • –rm cuando este contenedor se detenga, borralo
docker run --rm -p 3000:3000 platziapp

Si les sale algo como:

❯ docker run --rm -p 3000:3000 platziapp
docker: Error response from daemon: driver failed programming external connectivity on endpoint nifty_neumann (2120de8754d7ab48d99eb05f072b7ee032bfce8ae7d54d86f1d3fb20f6217683): Error starting userland proxy: listen tcp4 0.0.0.0:3000: bind: address already in use.

Puden hacer uso de:

❯ sudo netstat -pna | grep 3000

Y después hacer un sudo kill -9 ID con el ID que les haya salido

Usando Docker para desarrollar aplicaciones
Comandos:

$ git clone https://github.com/platzi/docker
$ docker build -t platziapp . (creo la imagen local)
$ docker image ls (listo las imagenes locales)
$ docker run --rm -p 3000:3000 platziapp (creo el contenedor y cuando se detenga se borra, lo publica el puerto 3000)
$ docker ps (veo los contenedores activos)

Mi comando para la construccion del contenedor fue

docker run --rm -d --name App -p 3000:3000 platziapp

la agregue el comando -d y le puse nombre.

Build

Ahora genero el nuevo contenedor en base al archivo dockerfile:
docker build -t platziapp . [ENTER]
docker image ls "muestra las imagenes"
para ejecutar o correr la imagen usar:
docker run --rm -p 3000:3000 platziapp
Luego ejecutar un navegador y coloca localhost:3000

¿Es obligatorio correr el comando de inicialización de Node de esa manera, o podemos ejecutar el script que viene dentro del package json?

generar imágenes de aplicaciones con código que tiene Guido y ya esta aplicado y se puede acceder

😎

Interesante