Guia de Docker

Conceptos de Docker

Imagen

Es la que contiene las dependencias, bibliotecas, etc. Básicamente es una plantilla o (modelo) que solo tiene lo necesario para ejecutar la aplicación.

Contenedor

Son instancias o (objetos como en POO), el cual crea la instancia de una imagen.

Dockerfile

Es la configuración para la creación de la imagen, acá se define que va a llevar, las instrucciones, dependencias, y configuración del entorno.

Red

La red virtual es la que permite la comunicación entre contenedores, esto es usado en aplicaciones grandes que van a tener varios servicios, es decir se crear varios contenedores de los cuales lleva el micro-servició que va a realizar (backend o la lógica del negocio).

Volumen

Es donde se guarda los datos generados y usados por los contenedores.

Notas:

  • Cree una cuenta de

    docker hub

  • Algunos comandos como por ejemplo build, compose requieren que estes en el directorio donde creaste los archivos, para que funcionen.

Comandos de Docker

Contenedores

Crear Contenedor

docker run nombre_contenedor

Alias (nuevo nombre)

Se utiliza para cambiar el nombre en NAMES y no usar el CONTAINER ID.

docker run –name nombre_alias nombre_contenedor

Listar contenedores

Con este comando ves todos los contenedores.

docker ps -a

Y con este ves los contenedores que están corriendo.

docker ps

Borrar contenedor

Con este comando borras el contenedor con el respectivo nombre.

docker rm nombre_contenedor

Con este comando borras todos los contenedores.

docker container prune

Correr contenedor

En este caso, se está corriendo un contenedor que tiene Ubuntu.

docker run –d --name Linux Ubuntu

El "-d" evita entrar en modo interactivo (entrar al contenedor o línea de comandos). Para entrar al modo interactivo, usa "-it".

docker exec –it nombre_contenedor bash

Detener contenedor

Para detener un contenedor en windows es con.

docker kill nombre_contenedor

Y en Linux puedes obtener el ID del proceso con

docker inspect nombre_contenedor –format ‘{{.State.Pid}}

Exponer contenedor

Ahora vamos a exponer un puerto de un contenedor usando la imagen nginx. Los números son los puertos: el de la izquierda es el puerto de la máquina anfitriona y el de la derecha es el puerto del contenedor.

docker run –d –name proxy –p 8001:80 nginx

Datos

Persistir datos (Bind mount)

Esta forma de persistir datos es la menos recomendable ya que tiene acceso directo a la carpeta.

docker run –d –name db –v C:/ruta/directorio/carpeta_persistir_datos/mongo mongo

Crear volumen

La creación de volúmenes es la más común y segura. Para crear un volumen, se utiliza el siguiente comando.

docker volumen créate nombre_volumen

Ejemplo práctico: en "dst", se especifica el directorio interno del contenedor donde se guardarán los datos.

docker run -d --name db --mount src=nombre_volumen,dst=/data/db mongo

Insertar archivos

Para insertar archivos, es importante que el contenedor esté corriendo. Puedes crear un archivo y luego pegarlo dentro del contenedor.

docker cp ruta_del_archivo_en_host nombre_container:/ruta/dentro/del/contenedor

Extraer archivos

Ahora para extraer archivos haces lo mismo de forma opuesta con.

docker cp nombre_container:/ruta/dentro/del/contenedor ruta/a/guardar/computador/anfrition”

Imágenes

Listar imagenes

docker image ls

Descargar imagen

La imagen se descarga de Docker Hub

docker pull nombre_imagen_docker_hub

Crear imagen

Para crear imagen se crea un dockerfile


#descargar imagen de docker hub
FROM ubuntu:latest
#ejecutar un comando (este se ejecuta en tiempo de construcción)
RUN touch /usr/src/holamrxd.txt

Construir imagen

Ahora ya que tienes el dokerfile, vas a construir la imagen con.

docker build –t ubuntu:tutag .

El "." se refiere al directorio actual

Borrar imagen

Para borrar la imagen es importante que lleve el tag.

docker image rm nombre_imagen:tag

Cambiar nombre del tag

Cambia el nombre a uno personal y poder publicarlo en docker hub.

docker tag ubuntu:mrxd name:tag

Publicar imagen

Primero haces.

docker login

Y despues publicas la imagen con.

docker push usernamedelhub/name:tag

Historial de una imagen

docker history name: tag

Ejemplo Practico

Clona repositorio

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

Modifica el dockerfile a


# Usa una imagen base de Node.js
FROM node:14

# Copia package.json y package-lock.json al directorio /usr/src/ en el contenedor
COPY ["package.json", "package-lock.json", "/usr/src/"]

# Establece /usr/src/ como el directorio de trabajo dentro del contenedor
WORKDIR /usr/src

# Ejecuta npm install para instalar las dependencias definidas en package.json
RUN npm install

# Copia todo el contenido del directorio actual al directorio de trabajo en el contenedor
COPY [".", "/usr/src/"]

# Expone el puerto 3000 para que la aplicación sea accesible
EXPOSE 3000

# Define el comando por defecto para ejecutar la aplicación
CMD ["node", "index.js"]

Consturye la imagen

docker build -t mrnode .

Y luego corre la imagen

docker run -–rm –p 3000:3000 –v C:/Users/…/docker/index.js:/usr/src/index.js mrnode

El "--rm" elimina el contenedor cuando se detenga

Redes

Listar redes

docker network ls

Crear una red

docker network créate –-attachable nombre_red

Este parametro "--attachable" permite que cualquier contenedor se conecte a esta red

Conectarse a una red

Crea dos contenedores uno con mongo y otro con node; el de mongo lo conectas.

docker network connect nombre_red nombre_contenedor

Y el contenedor de node lo conectas de esta manera.

docker run -d --rm --name appweb --network cable -p 3000:3000 --env MONGO_URL=mongodb://db:27017/test -v C:/…/index.js:/usr/src/index.js mrnode

"env" es una variable de entorno.

Docker compose

Esta herramienta nos ayuda a hacer todo de forma más sencilla de forma declarativa, es importante la indentacion como en Python. Ahora crea un archivo "docker-compose.yml".


version: "3.8"

services:
  app:
    image: mrnode
    environment:
      MONGO_URL: "mongodb://db:27017/test"
    depends_on:
      - db
    ports:
      - "3000:3000"

  db:
    image: mongo

Ahora ejecutas esto. Aclaracion mrnode es la "imagen" que yo cree previamente.

docker-compose up -d

Para entrar en modo interactivo ejecutas.

docker-compose exec app bash

"app" es el nombre del servicio de la seccion de "services" en el archivo docker compose. Ahora para destruir todo lo haces con.

docker-compose down

Construir imagen con docker-compose

Ejemplo con mongoDB.


version: "3.8"

services:
  app:
    build: .
    environment:
      MONGO_URL: "mongodb://db:27017/test"
    depends_on:
      - db
    ports:
      - "3000:3000"

  db:
    image: mongo

Y para construir lo hace con.

docker-compose build

Entorno personal con docker-compose

Cuando necesites un entorno personal, usted puede crear el archivo "docker-compose.override.yml", el archivo “docker-compose.yml” lo deja como viene y en “docker-compose.override.yml” modifica lo que necesita.


version: "3.8"

services:
  app:
    build: .
    environment:
      MONGO_URL: "mongodb://db:27017/test"
    depends_on:
      - db
    volumes:
      - .:/usr/src
      - /usr/src/node_modules
    command: npx nodemon index.js

  db:
    image: mongo
Build with reflex
Creado por DNV