Apuntes Docker - Sergio Clavijo
Apuntes Docker - Sergio Clavijo
Apuntes Docker - Sergio Clavijo
La idea detrás de Docker es crear contenedores ligeros y portables para las aplicaciones software
que puedan ejecutarse en cualquier máquina con Docker instalado, independientemente del
sistema operativo que la máquina tenga por debajo, facilitando así también los despliegues.
Docker, me permite meter en un contenedor (“una caja”, algo auto contenido, cerrado) todas
aquellas cosas que mi aplicación necesita para ser ejecutada (java, Maven, tomcat…) y la propia
aplicación. Así yo me puedo llevar ese contenedor a cualquier máquina que tenga instalado
Docker y ejecutar la aplicación sin tener que hacer nada más, ni preocuparme de qué versiones de
software tiene instalada esa máquina, de si tiene los elementos necesarios para que funcione mi
aplicación , de si son compatibles…
Yo ejecutaré mi aplicación software desde el contenedor de Docker, y dentro de él estarán todas
las librerías y cosas que necesita dicha aplicación para funcionar correctamente.
Guía de comandos:
docker search : Buscar imágenes en docker hub
docker run <image> : Crear un contenedor de la imagen
o -it: interactivo
o --name: darle nombre
o --detach: no mantener en el cmd, luego se puede acceder con attach
o --publish: definir puertos, ej --publish puerto_local:puerto_contenedor --publish
8080:80,
o -e definir variable de entorno,
o --link nombrecontenedor:alias,
o --network <nombre red> poner el contenedor en una red específica,
o --rm eliminar el contenedor cuando este termine su ejecución
o --net <nombre red> : poner el contenedor en una red específica (igual a --
network)
o --net-alias <alias> : poner un alias del contenedor en la red
o -v : Definir el volumen para la imagen, ej -v mysql-data:/var/lib/mysql (esto es un
named volume)
docker pull <image> : Descargar una imagen de docker hub
docker ps : Mostrar contenedores en ejecución, -a: mostrar todos los contenedores
(incluye terminados)
docker rm <id contenedor> : Eliminar un contenedor
docker rmi <imagen> : Eliminar una imagen (no deben existir contenedores de la misma)
docker start <id contenedor> : Iniciar un contenedor detenido
docker stop <id contenedor> : Detener un contenedor que está en ejecución
docker attach <id contenedor> : Acceder al bash de un contenedor en ejecución
docker commit <id contenedor> <nombre imagen> : Crea una imagen personalizada a
partir de un contenedor (con sus modificaciones, ej programas instalados, etc)
docker build -t <nombre_imagen> <path a dockerfile> : Crea una imagen a partir de un
Dockerfile
docker logs <id contenedor> : Muestra los logs de un contenedor
docker top <id contenedor> : Muestra los procesos que se están ejecutando en un
contenedor en ejecución
docker system prune : Borrar todos los contenedores, caché, entre otros
docker history <id imagen> : Mostrar las diferentes "capas" de que se compone una
imagen determinada
docker tag <id imagen> <tag imagen> : "Taggear" una imagen (no reemplaza tags
existentes)
docker exec -it <id contenedor> bash : Acceder al bash de un contenedor en ejecución
(ejecutar un comando)
docker inspect <id conenedor> : Mostrar información detallada de contenedor
docker cp <id contenedor> <path in container> <path in host> : Copiar archivos del
interior de un contenedor al equipo host
docker inspect <id contenedor> : Detalles de la configuración del contenedor
o --format : Ayuda a buscar entre la configuración, ej (--format '{{
.NetworkSettings.IPAddress }}')
docker stats : Estadísticas de rendimiento para todos los contenedores
docker port <id contenedor> : Revisión rápida de puertos de un contenedor
docker network ls : Mostrar todas las redes
docker network inspect <id network> : Detalles de la configuración de la red
docker network create <nombre de la red> --driver : Crear una red, si no se pone --driver,
por defecto lo toma como "bridge"
docker network connect <id red> <id contenedor> : Poner un contenedor en la red
docker network disconnect <id red> <id contenedor> : Retirar un contenedor de la red
docker history <id imagen:tag> : muestra los cambios en las capas de la imagen, image
layers
docker image inspect <id imagen:tag> : Detalles de la configuración de la imagen
docker image tag <from image> <to image> : "Taggea" una imagen
docker image push <image:tag> : Carga una imagen (personalizada) a DockerHub
docker login : Para autenticarse ante DockerHub
docker logout : Para cerrar la sesión ante DockerHub
docker volume inspect <id volumen> : inspeccionar configuración de un volumen
docker volume create <nombre> : Crear un nuevo volumen
docker volume prune : Elimina todos los volúmenes (No usados actualmente por
contenedor?)
docker deploy --orchestrator kubernetes --compose-file /ruta/al/docker-compose.yml
docker-compose up : Setup volumes, network and start all containers (services)
docker-compose down : Stop all containers (services) and remove all, INCLUDING
VOLUMES AND NETWORKS (Creados en él, es decir los external no)
docker-compose config : Muestra el contenido validado de docker-compose.yml, se le
puede agregar > name.yml para escribir la salida a un archivo (puede ser útil para
kubernetes, komposer up)
Notas:
Para los ids, se puede poner solo el inicio, no es necesario todo el ID
Para especificar las imágenes si no se le pone tag (:), por defecto toma "latest", por ej
"ubuntu:14.04", "ubuntu:latest"
Para salir de un contenedor interactivo sin detenerlo se presiona Control + P + Q
Para imagen ubuntu para ejecutar comandos y sale el error "command not found",
primero se debe ejecutar un apt-get update
Docker build (Dockerfiles) es mejor que docker commit
Al hacer cambios en un Dockerfile, no es necesario eliminar la imagen previa, Docker
detecta los cambios y realiza los ajustes automáticamente, los pasos que no cambiaron los
obtiene de caché
Cuando en un DockerFile se extiende de una imagen que ya tiene definido su CMD, y este
no debe variar, no es necesario ponerlo en nuestro Dockerfile
En Dockerfile, "comando" WORKDIR establece el directorio desde donde se van a ejecutar
todos los comandos que le sigan y hasta que se cambie el WORKDIR
En Dockerfile, "comando" VOLUME establece un path en el contenedor que será el
volumen
En Dockerfile, COPY . . copea todo lo de la carpeta actual a la carpeta especificada
previamente en el WORKDIR
Bind Mounts : Es vincular una carpeta host a carpeta en el contenedor.
Volumes? : Ubicación especial por fuera de los contenedores, es "más" administrada por
docker, persistent data
Los volúmenes solo pueden ser eliminados manualmente
Si a un contenedor que maneje volúmenes no se le define explícitamente un volumen (-v
name:path), crea un volumen cada vez que se instancie un contenedor
Bind mounting, si es en linux sería ej /var/etc/somepath:/var/lib/mysql/data, y en
windows //c/mysql/data:/var/lib/mysql/data (Note los slash)
$(pwd) : pone el working directory en la consola
En los volumenes se puede definir el permiso de acceso ej.
//x/xampp/mysql/config.ini:/var/mysql/config.ini:ro (ro: readonly)
Docker Compose:
docker-compose up : Cargar el archivo docker-compose.yml
o -d : dettached, no mostrar logs de los servicios (containers)
docker-compose down : Detiene y elimina los contenedores del docker-compose.yml
o -v : eliminar volumenes
o --rmi all|local : eliminar imágenes, all todo hasta dependencias, local solo las
definidas directamente en el compose
docker-compose ps : Muestra los contenedores (del archivo) que se están ejecutando
actualmente
docker-compose top : Muestra los procesos en ejecución de los contenedores (en
ejecución) del docker-compose.yml
docker-compose build : Construye las images que se deban construir que se definan en el
archivo (build)
o --build : Reconstruye las imágenes
services:
product-service:
#build: ./product
build:
context: .
- ./product:/usr/src/app
ports:
- 5001:80
website:
image: php:apache
volumes:
- ./website:/var/www/html
ports:
- 5000:80
depends_on: