Imágenes Docker


En este artículo vamos a tener el control absoluto de todas las imágenes Docker, de todo cuanto ocurre dentro de una imagen ytrabajaremos profundamente concomandos Docker.

Índice

Por lo que va a ser un artículo todavía más técnico en comparación a los anteriores de “Docker Desktop” , “Docker Compose” y «Docker Compose en un Proyecto», los cuales te recomiendo echar un vistazo por lo menos, pues en ellos te cuento la teoría básica de manera escalonada (en este artículo, aunque se puede hacer sin haber leído los anteriores, vamos a extender a los anteriores como si fuera un curso continuado, así te servirá para entender mucho más si vienes de ellos). Si vienes de los anteriores artículos, aquí vamos a usar Docker con comandos, no utilizaremos ni “Docker Desktop” y ni “Docker Compose” (aunque te recomiendo que te apoyes en ellos, pues algunas cosas son más sencillas, por ejemplo, es más fácil hacer un “compose.yml” que usar ciertos comandos, para otras cosas no, por ejemplo, para visualizar contenedores funcionando será mejor con “Docker Desktop”, etc.).

Dependiendo de tus necesidades será interesante (iremos viéndolas en orden):

  • Usar imágenes de terceros.
  • Construir nuestra propia imagen enriqueciendo las existentes.
  • Crear nuestro proyecto Dockerizado (como el anterior, pero con nuestro código).

Nota sobre los requisitos para este artículo: en este artículo asumimos que tienes instalado Docker y que tienes en ejecución en ejecución “Docker Engine” (esto lo vimos en el artículo de Docker Compose).

Trabajar con imágenes Docker mediante comandos

Para este ejemplo, vamos a querer trabajar con la base de datos MySQL (te sonará si vienes de los artículos anteriores previamente citados, por lo que en este artículo voy a ir muy rápido y sin repetirme en lo que ya he contado en los artículos anteriores, para centrarnos exclusivamente en los comandos) y para ello descargaremos la imagen Docker, cuya documentación e información podemos encontrar en: https://hub.docker.com/_/mysql

Tras lo que abrimos una terminal para ejecutar nuestros comandos.

Descargaremos la imagen con “pull” (Docker Hub es un repositorio, como Git, por lo que usa las palabras estandarizadas, en este caso para descargar será “pull”), seguido del nombre de la imagen “mysql”, dos puntos “:” y el “tag” que indica la versión “8.3” (si sigues este artículo, te recomiendo que descargues las versiones que ves aquí para que no tengas incompatibilidades ni problemas):

docker pull mysql:8.3

Nota para descargar rápido la última versión: Si no ponemos los dos puntos y la versión (es decir, poner solo “mysql”, sin el “:8.3”), es como poner la palabra “:latest” (el comando sería: “docker pull mysql:latest” ), que indica la versión más moderna disponible (lo recomendable es siempre fijar la versión, salvo para pruebas nuestras, pues no queremos tener incompatibilidades no controladas). Hay que saber que la palabra “latest” es una convención de nombres que debe apuntar a la última, esto es importante porque no es automático, por lo que si el desarrollador que ha subido una imagen no ha creado a mano el “latest”, no podremos usar esta convención (te vas a encontrar imágenes sin “latest” en “Docker Hub”); es decir, si somos creadores de una imagen Docker, entonces tendremos que crear a mano la versión numérica última de nuestra imagen (por ejemplo, “1.2”) y luego la “latest” que sea la misma. Además, no siempre tiene sentido el “latest”, por ejemplo, podríamos crearnos varias imágenes con la misma versión de nuestro código, pero sobre diferentes sistemas operativos ¿Cuál es la última versión si todos sistemas operativos comparten la misma última versión? No siempre es útil.

Si queremos ver todas las “imágenes Docker” que tenemos descargadas utilizaremos el comando “images” (podrás observar que aparece la palabra “REPOSITORY”, puesto que será nuestro repositorio local; además de otra información, como el TAG que es la versión, el IMAGE_ID que es el identificador, etc.):

docker images

Nota: también se puede usar: docker image ls

Si queremos eliminar una imagen lo haremos con “rmi” seguido del nombre la imagen (el que le pusimos antes, por ejemplo “mysql:8.3”) o el “IMAGE_ID”:

docker rmi mysql:8.3

Para iniciar un contenedor desde una imagen, usaremos “run” con la imagen Docker que hemos descargado antes, por lo que será la manera de crear un “Contenedor Docker” en ejecución. Para ello tendremos varios parámetros interesantes

  • -d (“detached mode”): Indica a Docker que ejecute el Contenedor que va a crear en segundo plano, para que nos libere la consola y podamos introducir más comandos. Si no ponemos este “-d”, se considera que quieres el “attached mode”, por lo veremos los logs del contenedor después de ejecutar el comando y no podremos usar la consola (hasta que pulsemos “ctrl+C” que terminará con el contenedor).
  • -p (mapeo de puertos): el puerto, aunque no es obligatorio, es una buena práctica ponerlo para tenerlo controlado y poder usar el contenedor (sino, se nos asignará un puerto local al azar cada vez y eso es una locura). Para mapear los puertos, se pone primero el puerto al que quieres que se mapee de tú ordenador (el que usarás tras el “localhost:<mi_puerto_local>”), dos puntos “:” y el puerto interno del Contenedor (al cual escucha en este caso MySQL). Para este ejemplo pondré 3306:3306, para que coincidan (y porque este puerto 3306 es un estándar para MySQL), aunque no tiene porqué, sobre todo si tenemos muchos contenedores con MySQL corriendo a la vez (todos estos contenedores internamente escucharán al 3306, pero en mi localhost no puedo tener más que un 3306, así que los iré nombrando como quiera 3307, 3308, etc.).
  • –name (nombre de mi contenedor): de primeras para que sea fácil de distinguir de las imágenes (y de segundas, pues cuando llevas programando horas ayuda a distinguir rápidamente), recomiendo poner el nombre que quieras (normalmente el mismo de la imagen), pero que incluya la palabra “Contenedor”. Yo por ejemplo, pondré aquí: “miContenedorMysql” (pongo este para que coincida parcialmente con el del anterior artículo, aunque profesionalmente suelo poner algo así “mysql-container”).
  • -e (Establecer variables de entorno): aquí dependerá de la documentación del contenedor (que, para mi ejemplo, la documentación está en https://hub.docker.com/_/mysql ). Aquí para hacerlo lo más sencillo posible crearé un contenedor MySQL sin contraseña (cosa no recomendada, solo para jugar con ello y aprender), estableciendo la variable de entorno: MYSQL_ALLOW_EMPTY_PASSWORD=yes

El comando resultante que ejecutaré me quedará así:

docker run -d -p 3306:3306 --name=miContenedorMysql -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql:8.3

Podremos ver un listado con todos los “Contenedores Docker” en ejecución con “ps” (no confundir con las “Imágenes Docker” que se veían con el anterior comando “docker images”; con el comando ps para ver los Contenedores nos dará información como el CONTAINER_ID, el NAMES que es el nombre que le pusimos al Contenedor, el mapeo de puertos en PORTS, en STATUS nos pondrá “Up” si está en ejecución, la imagen que está usando en IMAGE, etc.):

docker ps

Nota para ver todos los contenedores (con -a), tanto en ejecución y detenidos: docker ps -a

Si queremos eliminar una imagen de nuestro repositorio local con “rmi” seguido del nombre la imagen (el que le pusimos antes, por ejemplo “mysql:8.3”) o el “IMAGE_ID”

docker rmi mysql:8.3

Un Contenedor puede estar en ejecución, por lo que podremos detener un contenedor con “stop” seguido del nombre del contenedor (el que le pusimos antes, por ejemplo “miContenedorMysql”) o el “CONTAINER_ID”:

docker stop miContenedorMysql

Si queremos eliminar un contenedor (para eliminar un Contenedor en ejecución primero hay que detenerlo)de nuestro repositorio local con “rm” seguido del nombre del contenedor (el que le pusimos antes, por ejemplo “miContenedorMysql”) o el “CONTAINER_ID”:

docker rm miContenedorMysql

Nota para detener el Contenedor y después eliminarlo en un solo comando (con -f): docker rm -f miContenedorMysql

Lista de comandos Docker

Ya hemos visto la idea general de cómo funcionan los comandos Docker. A continuación, te muestro un diagrama de los comandos para los diferentes estados:

Y te listo unos cuantos de los comandos Docker que considero más útiles, pero hay muchos más. Tienes todos los comandos en la documentación oficial: https://docs.docker.com/engine/reference/commandline/docker/

Comandos de gestión de Dockerfile y Docker Compose:

  • docker compose up: Crea e inicia contenedores desde un fichero “compose.yml” (o “docker-compose.yml”). Al ejecutarse, si los contenedores aún no se han creado, creará los contenedores por ti; si los contenedores están en ejecución y el archivo “compose.yml” ha cambiado, recreará e iniciará los contenedores.
  • docker compose down: Detiene y elimina los contenedores y sus redes definidos en el “compose.yml”. Se puede usar “–volumes” para eliminar los volúmenes (y cualquier dato almacenado en ellos) declarados en el fichero “compose.yml” (ej: docker-compose down –volumes)
  • docker build -t [tag] [directorio_con_el_dockerfile]: Construye una imagen a partir de un Dockerfile y le añade un tag (el nombre y la versión, por ejemplo: miimagen:1.0 ).

Comandos de gestión generales de objetos Docker:

  • docker inspect [nombre_del_objeto]: Devuelve información detallada sobre el objeto Docker (imagen, contenedor, red, volumen, nodo, servicio).

Comandos de gestión de imágenes existentes:

  • docker history [id_o_tag_de_la_imagen]: Historial de cambios en una imagen.
  • docker images: Lista las imágenes disponibles localmente.
  • docker load -i [ruta_al_fichero]: Carga una imagen desde un archivo “.tar”.
  • docker pull [tag_de_la_imagen]: Descarga una imagen desde un repositorio logeado.
  • docker push [tag_de_la_imagen]: Sube una imagen etiquetada a un repositorio logeado (como “Docker Hub” o Harbor).
  • docker rmi [id_o_tag _de_la_imagen]: Elimina una imagen local.
  • docker run -p [puerto_host:puerto_contenedor] –name [nombre_del_contenedor] [tag_de_la_imagen]: Ejecuta un contenedor con cierto puerto desde una imagen (añade “-d” si quieres que sea en “detached mode”, es decir, un proceso daemon en primer plano, útil para pruebas rápidas).
  • docker run -it -p [p_host:p_cont] –name [n_cont] [tag_ imagen] /bin/bash: Ejecuta un contenedor con cierto puerto desde una imagen en modo interactivo (“-i” de “intercative” y “-t” de “tty”) y abre una consola en bash (desde la ruta “/bin/bash”) para que puedas interactuar con el contenedor.
  • docker run -p [p_host:p_cont] –name [n_cont] –mount source=[nombre_del_volumen],target=[ruta_a_montar_dentro_del_contenedor] [tag_ imagen]: Ejecuta un contenedor con cierto puerto desde una imagen con un volumen previamente creado (ver más adelante cómo se crean los volúmenes) apuntando a una ruta (que se monta) dentro del contenedor.
  • docker save [tag_de_la_imagen] -o [ruta_al_fichero]: Guarda una imagen en un archivo “.tar”.
  • docker search [término_de_búsqueda]: Busca en el repositorio imágenes que contienen el término.
  • docker tag [id_de_la_imagen] [nuevo_tag]: Etiqueta una imagen con un nuevo nombre y versión.

Comandos de gestión de contenedores existentes:

  • docker exec [id_o_nombre_del_contenedor]: Ejecuta un comando en un contenedor en ejecución.
  • docker kill [id_o_nombre_del_contenedor]: Detiene de inmediato (se recomienda “stop” para que evitar estados inconsistentes) un contenedor en ejecución.
  • docker ps: Lista los contenedores en ejecución.
  • docker rm [id_o_nombre_del_contenedor]: Elimina un contenedor detenido (si le pones “-f” fuerzas la eliminación, aunque no esté detenido).
  • docker start [id_o_nombre_del_contenedor]: Reanuda un contenedor detenido.
  • docker stop [id_o_nombre_del_contenedor]: Detiene controladamente un contenedor en ejecución.
  • docker port [id_o_nombre_del_contenedor]: Muestra los mapeos de puertos para un contenedor.

Comandos de gestión de volúmenes Docker:

  • docker volume create [nombre_del_volumen]: Crea un volumen de Docker.
  • docker volume ls: listar los volúmenes.
  • docker volume prune: elimina todos los volúmenes no utilizados por ningún contendor.
  • docker volume rm [nombre_del_volumen]: elimina un volumen que no esté en uso por ningún contenedor.

Comandos de gestión de redes Docker:

  • docker network create –driver [conductor] [nombre_de_red]: Crea una red de Docker con un conductor de la red disponible (bridge, overlay, macvlan, etc.).
  • docker network connect [nombre_de_red] [id_o_nombre_del_contenedor]: Conecta una red creada a un contenedor existente.
  • docker network disconnect [nombre_de_red] [id_o_nombre_del_contenedor]: Desconecta una red de un contenedor.
  • docker network ls: lista todas las redes de Docker.
  • docker network rm [nombre_de_red]: Elimina una red sin contenedores conectados.

Comandos de gestión de conexión al repositorio:

  • docker login [url_al_repositorio] -u [usuario] -p [contrasenia]: Iniciar sesión en un registro de Docker (público como “Docker Hub” o privado como “Harbor”).
  • docker logout [url_al_repositorio]: Cerrar sesión de un registro de Docker.

Continúa el curso de Docker

Puedes continuar con la siguiente parte de este curso en:

Comparte esta entrada en:
Safe Creative #1401310112503
Imágenes Docker por "www.jarroba.com" esta bajo una licencia Creative Commons
Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.
Creado a partir de la obra en www.jarroba.com

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies

ACEPTAR
Aviso de cookies