Comandos de Docker. Los necesitarás. Cada día. El problema no es aprender Docker. El problema es recordar qué comando hace qué cuando ya vas por tres despliegues y tu entorno de producción está ardiendo. Esta guía desglosa los comandos que realmente vas a usar, organizados por lo que hacen en lugar de alfabéticamente, porque así es como funciona tu cerebro cuando estás bajo presión.
Los comandos se dividen en varias categorías: crear y gestionar imágenes, limpiar el desastre, iniciar y detener contenedores y comprobar qué está en ejecución. También incluye configurar contenedore, enviar imágenes a registros, orquestar servicios y configurar redes. Vamos a ello.
Comandos de compilación de Docker
El comando docker build convierte tu Dockerfile en una imagen. Eso es todo. Todo lo demás son solo opciones.
Compila desde tu directorio actual con docker build. ¿Quieres etiquetarlo para poder encontrarlo más tarde? Añade -t imagename:tag. La etiqueta no es opcional si tienes pensado enviar la imagen a un registro.
También puedes compilar desde fuentes remotas. Apunta a un repositorio de Git con docker build https://github.com/user/repo.git#branch:folder. O descarga un archivo tar desde tu servidor con docker build https://yourserver/file.tar.gz.
¿Necesitas omitir la caché? Usa --no-cache. Pasa argumentos de compilación con --build-arg KEY=value. Estos aparecen en tu Dockerfile como variables ARG.
El proceso de compilación lee tu Dockerfile línea por línea. Cada instrucción crea una capa. Las capas se almacenan en caché. Por eso la primera compilación tarda una eternidad y las siguientes se completan en segundos. A menos que cambies algo cerca del inicio del Dockerfile. Entonces todo lo que está por debajo de esa línea se vuelve a reconstruir.
Comandos de limpieza y depuración de Docker
Docker te llena el disco. Rápido. Imágenes huérfanas, contenedores detenidos y volúmenes sin usar. Se acumulan.
Ejecuta docker system prune para borrar contenedores detenidos, redes sin usar, imágenes huérfanas y la caché de compilación. Añade -a para eliminar todas las imágenes sin usar, no solo las huérfanas. Esto libera gigabytes.
Para una limpieza más específica, usa docker image prune para eliminar imágenes sin etiqueta. Limpia los volúmenes con docker volume rm $(docker volume ls -f dangling=true -q). Elimina imágenes específicas con docker image rm imagename.
¿Quieres borrarlo todo? Detén todos los contenedores en ejecución con docker kill $(docker ps -q), y luego elimínalos con docker rm $(docker ps -a -q). No hagas esto en producción.
Programa los comandos prune de Docker en tu pipeline de despliegue. Tu equipo de DevOps te lo agradecerá cuando no tenga que estar buscando espacio en disco a las 2 de la madrugada.
Gestión de contenedores: iniciar, detener y reiniciar
Gestión del ciclo de vida de los contenedores. Iniciar, detener, pausar, reiniciar. Estos comandos controlan qué está en ejecución.
Usa docker start containername para arrancar un contenedor detenido. Deténlo con docker stop containername. Reinícialo con docker restart containername. Sencillo.
¿Necesitas pausar un contenedor temporalmente? docker pause containername suspende todos los procesos. Reanúdalo con docker unpause containername. El estado del contenedor se mantiene en memoria.
Detener todos los contenedores a la vez requiere encadenar comandos. docker stop $(docker ps -q) Detiene todo lo que esté en ejecución en ese momento. La opción -q muestra únicamente los IDs de los contenedores.
Define políticas de reinicio cuando lances contenedores. Usa --restart=always para servicios que deben sobrevivir a reinicios del sistema. O --restart=on-failure para reiniciar solo después de fallos.
Logs de Docker e inspección de contenedor
Algo se rompió. Necesitas los logs.
Ejecuta docker logs containername para volcar todo lo que el contenedor escribió en stdout y stderr. Añade -f para seguir los logs en tiempo real. Usa --tail 100 para ver solo las últimas 100 líneas.
Lista los contenedores en ejecución con docker ps. Mira todo, incluidos los contenedores detenidos, con docker ps -a. La salida muestra los IDs de los contenedores, las imágenes, los comandos, el estado y los puertos.
Profundiza con docker inspect containername. Esto muestra un bloque JSON con todos los detalles: configuración de red, montajes, variables de entorno y límites de recursos. Envíalo a grep o jq para encontrar lo que necesitas.
Comprueba el uso de recursos con docker stats. Muestra el porcentaje de CPU, el uso de memoria, la E/S de red y la E/S de bloques de cada contenedor en ejecución. Míralo en tiempo real o captura una instantánea.
¿Quieres ver qué ha cambiado en el sistema de archivos de un contenedor? docker diff containername enumera los archivos añadidos, eliminados y modificados. Útil para depurar contenedores que modifican su propio sistema de archivos.
Gestión de imágenes de Docker
Las imágenes son plantillas. Los contenedores son instancias en ejecución. Gestionar imágenes significa mantener tu repositorio local limpio y correctamente etiquetado.
Lista todas las imágenes con docker images o docker image ls. Verás los nombres de los repositorios, las etiquetas, los IDs de las imágenes, las fechas de creación y los tamaños. Filtra por nombre con docker images imagename.
Etiqueta las imágenes con docker tag source target. Esto crea una nueva referencia a la misma imagen. Patrón habitual: docker tag myapp:latest myapp:v1.2.3. Ahora tienes una etiqueta específica de versión y una etiqueta latest apuntando a la misma imagen.
Elimina imágenes con docker image rm imagename o docker rmi imagename. Elimina varias imágenes listándolas: docker rmi image1 image2 image3.
Consulta el historial de una imagen con docker history imagename. Cada línea muestra una capa: el comando que la creó, cuándo se creó y cuánto espacio en disco utiliza. ¿Imágenes demasiado pesadas? Esto te muestra dónde.
Limpia las imágenes sin usar con docker image prune. Añade -a para eliminar todas las imágenes que no estén referenciadas por ningún contenedor. Esto no es reversible, así que no te precipites en tu servidor de compilación.
Opciones del comando Docker Run
El comando docker run crea y arranca un contenedor a partir de una imagen. Un solo comando, docenas de opciones.
Sintaxis básica: docker run imagename. Esto ejecuta el contenedor en primer plano y bloquea tu terminal. Añade -d para desacoplarlo y ejecutarlo en segundo plano.
Nombra tu contenedor con --name containername. Si no, Docker genera nombres aleatorios como “quirky_tesla” que nunca vas a recordar. Mapea puertos con -p hostport:containerport. Ejemplo: -p 8080:80 asigna el puerto 80 del contenedor al puerto 8080 del host.
Define variables de entorno con -e KEY=value. Monta volúmenes usando -v /host/path:/container/path. Haz que el sistema de archivos del contenedor sea de solo lectura con --read-only por seguridad.
Elimina automáticamente los contenedores cuando se detienen con --rm. Perfecto para tareas puntuales. Conéctate a redes específicas usando --network networkname. Define límites de recursos con --memory y --cpus.
El modo interactivo requiere dos opciones: -i mantiene stdin abierto y -t asigna un pseudo-TTY. Combínalas como -it para acceder a una shell: docker run -it ubuntu bash.
Docker Hub y comandos para registros
Docker Hub aloja millones de imágenes. Tu registro privado puede alojar las tuyas. En cualquier caso, necesitas descargar (pull), subir (push) y autenticarte.
Inicia sesión con docker login. Te pedirá el nombre de usuario y la contraseña. Para sistemas automatizados, pasa las credenciales por stdin o usa tokens de acceso. Cierra sesión con docker logout.
Descarga imágenes desde Docker Hub con docker pull imagename. Especifica etiquetas como docker pull nginx:1.21. Si no indicas una etiqueta, por defecto se usa latest. Eso suele no ser lo que quieres en producción.
Sube imágenes con docker push username/imagename:tag. El nombre de la imagen debe incluir tu nombre de usuario de Docker Hub o la URL de tu registro. Etiquétala correctamente antes de subirla o fallará.
Busca en Docker Hub desde la línea de comandos usando docker search searchterm. Devuelve imágenes oficiales, compilaciones automatizada y el número de estrellas. La interfaz web te da más detalles, eso sí.
Para registros privados, antepone la URL del registro al nombre de la imagen: registry.example.com/imagename. Iniciar sesión, descargar (pull) y subir (push) funcionan de la misma manera. Solo apunta a un registro diferente.
Gestión de servicios con Docker Swarm
Docker Swarm orquesta contenedores a través de múltiples hosts. Los servicios definen cómo deben ejecutarse tus contenedores dentro del swarm.
Lista los servicios con docker service ls. Esto muestra los nombres de los servicios, los modos, las réplicas, las imágenes y los puertos. Para obtener información detallada sobre un servicio específico, ejecuta docker service ps servicename.
Crea un servicio con docker service create. Ejemplo: docker service create --name web --replicas 3 -p 80:80 nginx. Esto despliega tres réplicas de nginx en tu swarm.
Escala los servicios hacia arriba o hacia abajo con docker service scale servicename=5. Swarm se encarga de distribuir las réplicas. Actualiza los servicios en ejecución usando docker service update con opciones como --image para actualizaciones continuas (rolling updates).
Consulta los logs del servicio con docker service logs servicename. Esto agrega los logs de todas las réplicas. Despliega pilas completas usando docker stack deploy con un archivo compose.
Kubernetes ganó la guerra de la orquestación, pero Swarm sigue siendo más sencillo para despliegues pequeños. Sin curva de aprendizaje. Simplemente funciona.
Configuración de redes en Docker
Los contenedores necesitan comunicarse entre sí y con el mundo exterior. Las redes hacen que eso sea posible.
Lista las redes con docker network ls. Verás bridge, host y none por defecto. Crea redes personalizadas usando docker network create networkname. Especifica los drivers con --driver bridge o --driver overlay para Swarm.
Conecta contenedores en ejecución a redes con docker network connect networkname containername. Desconéctalo con docker network disconnect. Los contenedores pueden pertenecer a varias redes.
La red bridge es la predeterminada. Los contenedores en la misma red bridge pueden comunicarse entre sí por nombre. El modo de red host da a los contenedores acceso directo al pila de red del host. Usa --network host al lanzar contenedores que necesiten el máximo rendimiento de red.
Inspecciona los detalles de la red con docker network inspect networkname. Esto muestra los contenedores conectados, las direcciones IP, la configuración de subred y los ajustes de gateway. Elimina redes sin usar con docker network rm networkname.
Las redes personalizadas te ofrecen resolución DNS entre contenedores. Por eso las creas en lugar de usar la bridge predeterminada. La resolución por nombre es mejor que codificar direcciones IP.
Tutorial de Docker y buenas prácticas
Los comandos son una cosa. Usarlos correctamente es otra.
- Comienza con lo básico. Instala Docker. Ejecuta
docker run hello-world. Si eso funciona, estás listo. Crea un Dockerfile sencillo. Crea una imagen. Ejecuta un contenedor. Rompe cosas. Arréglalas. - Mantén las imágenes pequeñas. Cada capa añade tamaño. Combina comandos RUN. Limpia las cachés de paquetes en la misma capa donde las instalas. Usa compilaciones en varias etapas (multi-stage builds) para separar las dependencias de compilación de las dependencias en tiempo de ejecución.
- No ejecutes contenedores como root. Crea un usuario en tu Dockerfile con
RUN useradd. Cámbiate a él conUSER username. La seguridad importa incluso en contenedores. - Etiqueta tus imágenes correctamente. Usa versionado semántico. Nunca confíes en latest en producción. Fija versiones exactas en tus configuraciones de despliegue. Cuando una imagen se actualice y rompa tu aplicación, entenderás por qué.
- Monitorea el uso de recursos. Establece límites de memoria con
--memory. Limita la CPU con--cpus. Un contenedor que consume todos los recursos disponibles puede derribar todo el host. - Usa health checks. Añade instrucciones
HEALTHCHECKa tu Dockerfile. Docker puede reiniciar automáticamente los contenedores que no estén saludables. Mejor que esperar a que tu sistema de monitoreo te envíe una alerta. - Almacena los secretos correctamente. No los incluyas directamente en las imágenes. No los pases como variables de entorno que aparezcan en
docker inspect. Usa Docker secrets para Swarm o herramientas externas de gestión de secretos.
Los comandos de esta guía cubren el 90% del trabajo diario con Docker. ¿El otro 10%? Ahí es donde lees la documentación, buscas en los issues de GitHub y ensamblas soluciones desde Stack Overflow. ¡Bienvenido a la contenedorización!