Docker
docker version
docker info
docker --help
Operaciones con Imágenes
docker images # Información de imágenes en el repositorio local
Explicación de resultados:
REPOSITORY(Nombre de imagen) TAG(Etiqueta|Versión) IMAGE ID(ID de imagen) CREATED(Fecha de creación) SIZE(Tamaño)
mi-app-web latest 472cfb286905 19 horas atrás 1.06GB
redis 6.0.9-alpine c678242f9116 2 años atrás 31.6MB
Parámetros:
-a Muestra todas las imágenes creadas (incluyendo algunas intermedias)
-q Solo muestra los ID de las imágenes
docker pull dirección|nombre_imagen # Descarga imágenes del repositorio remoto
docker search nombre_imagen # Búsqueda de imágenes (poco utilizado, recomendado buscar directamente en el sitio web del repositorio)
docker rmi id_imagen|nombre_imagen 【imagen2,3,4……】 # Elimina imágenes locales (si no están siendo referenciadas)
Parámetros:
-f # Eliminación forzada
docker rmi -f `docker images redis` # Eliminación masiva de imágenes redis
# Empaquetado y desempaquetado de imágenes (para transferencia local sin repositorio)
docker save nombre_imagen:tag -o ruta/nombre.tar # (Se recomienda incluir nombre y tag)
docker load -i archivo.tar
Operaciones con Contenedores
docker ps # Ver contenedores en ejecución
Explicación de resultados:
CONTAINER ID # (ID del contenedor)
IMAGE #(Imagen base)
COMMAND #(Comando ejecutado al iniciar el contenedor)
CREATED #(Fecha de creación)
STATUS #(Estado: tiempo de ejecución|cuándo salió|pausado|)
PORTS #(Mapeo de puertos)
NAMES #(Nombre del contenedor)
Parámetros:
-a Muestra todos los contenedores (incluidos los no en ejecución)
-q Muestra solo los ID
-f Filtra por condiciones, formato: -f name=clave
-l Último contenedor creado
-n int Últimos n contenedores creados
-s Muestra el tamaño
docker run 【-opciones】 nombre_imagen:tag|id_imagen # Ejecuta un contenedor desde una imagen
Parámetros:
-d Ejecución en segundo plano
--name Asigna un nombre al contenedor (debe ser único)
-v Montaje de directorio directorio_host:directorio_contenedor # Se pueden montar múltiples
-p Mapeo de puertos puerto_host:puerto_contenedor # Se pueden mapear múltiples
# Operaciones de inicio y parada
docker start id_contenedor|nombre_contenedor # Inicia un contenedor (se inicia automáticamente después de run)
docker stop id_contenedor|nombre_contenedor # Detiene un contenedor
docker rm id_contenedor|nombre_contenedor # Elimina un contenedor (-f elimina forzosamente, incluso en ejecución)
docker restart id_contenedor|nombre_contenedor # Reinicia un contenedor
docker pause id_contenedor|nombre_contenedor # Pausa un contenedor
docker unpause id_contenedor|nombre_contenedor # Reanuda un contenedor
docker kill id_contenedor|nombre_contenedor # Termina un contenedor (terminación interna directa, a diferencia de stop que es una parada normal)
# Logs del contenedor
docker logs 【-opciones】 id_contenedor|nombre_contenedor # Muestra los logs internos del contenedor
Parámetros:
-f Monitoreo en tiempo real de los logs
-t Incluye marcas de tiempo
# Ejecución de comandos dentro del contenedor
docker exec -it id_contenedor|nombre_contenedor /bin/bash # Ejecuta una terminal bash interactiva en el contenedor
docker attach id_contenedor|nombre_contenedor # Similar al comando anterior
exit # Sale del contenedor (sale de bash)
# Copia de archivos entre contenedor y host
Contenedor--》Host
docker cp nombre_contenedor|id_contenedor:ruta_contenedor/archivo ruta_host/archivo
Host--》Contenedor
docker cp ruta_host/archivo nombre_contenedor|id_contenedor:ruta_contenedor/archivo
# Ver procesos en ejecución dentro del contenedor
docker top id_contenedor|nombre_contenedor
# Ver información detallada del contenedor
docker inspect id_contenedor|nombre_contenedor # Información muy detallada
Elementos de interés:
- Workdir Directorio de trabajo
- Volumes Volumenes de datos
- Gateway Gateway
- ...(Las claves empiezan con mayúscula, ten cuidado al usar grep)
# Mecanismo de volúmenes de datos en contenedores
Función: Sincronización y actualización de datos entre host y contenedor, montaje. Para datos importantes, siempre es recomendable montar en el host para su gestión, ya que dejar que el contenedor los gestione es arriesgado.
Uso: Solo se puede establecer al crear el contenedor, es decir, en el comando run mediante -v (existen otros métodos como docker-compose)
Características:
- Al montar un volumen, si la ruta seleccionada en el contenedor existe, se vaciará y se sincronizará con los archivos del host. Si no existe la ruta, se creará.
- Se puede usar ro (solo lectura) para que el directorio montado en el contenedor no pueda modificarse, solo sincronizarse con el host.
- Si la ruta del host no existe, Docker la crea automáticamente. Las rutas absolutas se crean normalmente, mientras que las reltas sin separadores (alias) se crean y mantienen en .../docker/volumes/ y pueden ser gestionadas con comandos docker:
- docker volume ls
- docker inspect nombre_volumen
- docker volume rm nombre_volumen
- docker volume create nombre_volumen
# Empaquetado de contenedor a imagen
docker commit [-opciones] id_contenedor|nombre_contenedor nombre_imagen:tag
Parámetros:
-m "Información de descripción" # Opcional
-a "Información del autor" # Opcional, pero recomendado para versiones publicadas
Comunicación de Red en Contenedores
- Todos los contenedores se conectan por defecto al puente docker0 del host, y los contenedores conectados a docker0 pueden comunicarse entre sí mediante sus IPs.
- Las IPs de los contenedores pueden cambiar, por lo que generalmente se usa el nombre del contenedor como hostname para la comunicación.
Problema: En clústeres con múltiples servicios, pueden haber conflictos de nombres al conectar todos a docker0, y la capacidad de carga también es limitada.
- Tipos de red en Docker
- bridge
- host
- null
# Creación de puente de red personalizado
docker network create -d bridge nombre_red
-d # Especifica el tipo de driver de red, por defecto es bridge
# Ver redes
docker network ls # Lista todas las redes
docker network inspect id_red|nombre_red # Inspecciona detalles de una red específica
# Eliminar redes (solo se pueden eliminar redes no utilizadas)
docker network rm id_red|nombre_red # Eliminación específica
docker network prune # Elimina redes nunca utilizadas
# Ejecutar contenedores en una red específica
- Por defecto se ejecutan en docker0, para especificar otra red se usa --network nombre_red en run
- Los contenedores iniciados pueden unirse a una red existente
docker network connect nombre_red id_contenedor|nombre_contenedor
## docker inspect
Primero buscar id_contenedor|nombre_contenedor---》luego buscar id_red|nombre_contenedor----》finalmente buscar id_volumen|nombre_volumen
De hecho, existen instrucciones completas:
docker container inspect
docker network inspect
docker volume inspect
Dockerfile
# Archivo descriptor de imagen, usado para construir imágenes mediante build
docker build -t nombre_imagen:tag contexto/ruta_Dockerfile # Se puede especificar solo el contexto, usando por defecto Dockerfile en esa ruta
# Ejemplo: docker build -t mi-imagen:tag1 . El . indica el Dockerfile en el directorio actual
# Notas:
- Todos los archivos del contexto se empaquetan y envían al docker server
- Se puede usar un archivo .dockerignore para especificar qué archivos no enviar
- Es recomendable guardar los archivos relacionados con Dockerfile en una carpeta específica
Comandos de Dockerfile
FROM imagen:etiqueta # Imagen base para construir, por defecto del repositorio oficial, o una dirección completa
USER usuario # Creador
WORKDIR directorio_trabajo # Directorio de trabajo, si no existe se crea, los siguientes comandos RUN se ejecutan aquí
COPY ruta_host ruta_contenedor # Copia archivos del host al contenedor
ADD ruta_host ruta_contenedor # Similar a COPY, pero con descompresión automática y capacidad para copiar desde URL
RUN comando_shell # Comando ejecutado durante la construcción, crea capas intermedias (para optimizar tiempos de construcción)
CMD comando (puede ser["cat","1.txt"])# Comando ejecutado al iniciar el contenedor, puede ser sobrescrito por opciones en run
ENTRYPOINT comando # Mayor prioridad que CMD, si se escribe directamente ignora CMD, si se usa formato array, concatena con CMD
# Uso combinado: ENTRYPOINT para el comando, CMD para parámetros, run puede sobrescribir los parámetros
EXPOSE puerto # Expone un puerto (no es obligatorio, principalmente como recordatorio para mapeos al iniciar)
VOLUEME directorio_contenedor # Montaje de directorio (declaración, pero al iniciar el contenedor se debe montar)
ENV A=10 # Variable de entorno, persistente en el contenedor
ARG B=11 # Parámetro de construcción, solo usable durante el build, desaparece después de la construcción
LABEL k1="v1" # Etiqueta de identificación?
ONBUILD ENV C=100 # Si otra imagen se construye basada en esta, se ejecutará esta instrucción
STOPSIGNAL
HEALTHCHECK
SHELL
$nombre_variable # Referencia al valor de una variable (como la variable de entorno A, $A la referencia)
docker-compose.yml
Tres componentes principales:
version:
Versión del archivo docker-compose, disponible en https://docs.docker.com/compose/compose-file/compose-versioning/
services:
Componente más importante, define los servicios y su organización, con atributos como construcción de imágenes, montaje de directorios, mapeo de puertos, etc., correspondientes a opciones del comando docker run.
networks:
Define redes, determina en qué red se despliega el clúster de servicios
ejemplo-compose.yml
version: '3' # En yml, los valores de k:v necesitan espacio después de : o nueva línea, se puede comentar con #
services:
api_web: # Nombre del servicio, todas las siguientes configuraciones son para este servicio
build: # Construcción con Dockerfile
contexto: . # Contexto de Dockerfile
dockerfile: Dockerfile # Nombre completo del Dockerfile
args: # Parámetros de construcción
- NOMBRE: juan
volumes:
- .:/tmp # Ruta relativa del host basada en el directorio del yml
- /home/api_web/:tmp/ # Ruta relativa en el contenedor basada en el directorio de trabajo
depends_on:
- servicio_bd # Este servicio depende de servicio_bd, por lo que se inicia primero
restart: always # Reinicio con el servicio docker
environment:
# - ZONA_HORARIA=America/Mexico # Variables de entorno para el contenedor
HOST_MYSQL: ${HOST_MYSQL} # También se pueden escribir como pares clave-valor, pero no simultáneamente
workdir: /home/api_web # Directorio de trabajo
command: python3 app.py
bd_mysql:
hostname: ${HOST_MYSQL} # Host de la IP, como se usa varias veces, se configura en .env y se llama con ${}
image: mysql:5.7 # Imagen a usar
command: [ # El comando sobrescribe la instrucción por defecto del contenedor
'--character-set-server=utf8mb4', # Configuración del charset de las tablas
'--collation-server=utf8mb4_unicode_ci', # Configuración del collation de las tablas
'--default-time-zone=+8:00' # Configuración de zona horaria
]
privileged: true # Da permisos reales de root
restart: always
networks: ... # Se pueden configurar, pero por defecto compose crea una red automáticamente y monta todos los contenedores en ella
Comandos de compose
docker-compose up # Inicia el archivo docker-compose.yml del directorio actual
Parámetros:
-f /ruta/compose.yml # Especifica archivo yml
-d # Ejecución en segundo plano
docker-compose down # Detiene todos los componentes del entorno
docker-compose config # Muestra la configuración real del entorno (rellena .env en yml, muestra configuraciones por defecto no escritas)
docker swarm
Orquestación de clústeres Docker en múltiples máquinas
Swarm:
El clúster Docker necesita swarm para su gestión, se puede inicializar en la máquina actual o unirse a otro swarm
Nodo:
Un nodo es una instancia del motor Docker en el clúster. También se puede considerar como un nodo Docker.
Una máquina puede tener múltiples nodos, pero en general, en un clúster de producción, los nodos están distribuidos en muchas máquinas.
Nodo Manager: Ejecuta funciones de gestión del clúster, mantiene el estado del clúster. Se elige un líder para ejecutar las tareas de programación.
Nodo Worker: Recibe y ejecuta tareas, solo para soportar tareas.
Servicio:
Un servicio es la definición de una tarea, ejecutada en un nodo, al crear un servicio se especifica la imagen del contenedor a usar.
Tarea:
Una tarea es un comando ejecutado en un contenedor Docker, los nodos Managers asignan tareas a nodos Workers según el número de réplicas especificado.
# Gestión del clúster
docker swarm init|join|leave|update.. # Inicializa nodo inicial|une como nodo|abandona el clúster|actualiza
# Gestión de nodos
docker node accept|promote|demote|inspect|update|tasks|ls|rm
# Gestión de servicios
docker service create|inspect|update|remove|tasks|ls
La gestión de clústeres con docker swarm y comandos relacionados tiene la desventaja de requerir muchas operaciones manuales. Al usar compose para gestionar múltiples contenedores, queremos iniciar rápidamente múltiples servicios coordinados. Naturalmente, también queremso poder iniciar rápidamente clústeres de servicios en múltiples máquinas. Docker stack combina la capacidad de compose para construir servicios rápidamente con la orquestación multi-máquina de swarm, permitiendo desplegar servicios rápidamente en múltiples máquinas mediente archivos yaml. La diferencia clave es que docker stack no soporta la palabra clave build, por lo que no se pueden construir imágenes y contenedores desde Dockerfile, se deben usar imágenes ya construidas.
Aquí se complementa con la palabra clave deploy, al usar swarm, este tiene sus estrategias de programación, nosotros solo necesitamos especificar cuántos servicois queremos iniciar (replicas)
Comandos relacionados con docker stack:
docker stack deploy [OPCIONES] STACK
# Comando para desplegar y actualizar servicios de Stack (normalmente docker-compose.yml), opciones comunes:
-c: Especifica la ruta del archivo compose
–with-registry-auth: Al crear servicios, los nodos trabajadores sincronizan las credenciales de inicio de sesión del repositorio privado del nodo manager, permitiendo que los nodos extraigan imágenes de repositorios privados
# Una vez iniciado el stack, podemos gestionar la aplicación como unidad de servicio集群, y para los servicios que contiene, es recomendable usar un archivo yml para su orquestación统一.
docker stack ls [OPCIONES]
# Lista todos los Stacks en el clúster Swarm, incluyendo el número de servicios de cada Stack.
docker stack ps [OPCIONES] STACK
# Muestra detalles relacionados con un Stack ya desplegado. Este comando soporta el nombre del Stack como parámetro principal.
# Cuando un servicio falla al iniciar, docker stack ps es la primera opción para localizar el problema. Este comando muestra un resumen de cada servicio en el Stack, incluyendo el nodo donde está la réplica, estado actual, estado esperado e información de excepción, combinado con docker service logs para ver detalles específicos de un servicio o tarea.
docker stack services [OPCIONES] STACK
# Lista los servicios de un Stack ya desplegado, incluyendo modo de servicio, imagen usada, mapeo de puertos, etc.
docker stack rm [OPCIONES] STACK [STACK…]
# Elimina uno o más Stacks del clúster Swarm. No pide confirmación antes de eliminar.
Resumen de stack: usa archivos yaml como plantilla para orquestación multi-máquina, no se deben usar comandos para operar servicios específicos en el clúster. Una vez iniciado el stack, operamos con él como unidad, principalmente para iniciar el clúster, ver su estado o detener servicios del clúster.