lunes, 8 de julio de 2019

Comandos útiles en Docker


# docker run hello-world
Ejecuta un contenedor de imagen hello-world, si no exite la descarga y muestra un mensaje y finaliza.

# docker ps
Muestra contenedores en ejecucion.

# docker ps -a
Muestra todos los contrnedores, en ejecucion ó finalizados. Todos los ejecutados quedan en la maquina. Borrarlos con docker rm - f....

# docker images
Muestra imagenes de contenedores que tenemos descargadas.

# docker search centos
Busca en docker hub todas las imagenes que existen de centos.

# docker pull [nombre de imagen]
Descarga la imagen que elegimos en el docker search.

# docker run -ti debian /bin/bash
Ejecuta un contenedor de imagen debian, queda interactivo y abre un bash. Queda ejecutando un terminal.

Ctrl+d
Finaliza el contenedor interactivo que deje ejecutando y devuelve el prompt a la maquina host.
Ctrl+p+q
Deja el contenedor ejecutando en segundo plano y devuelve el prompt a la maquina host.

# docker run -it -d debian /bin/bash
Ejecuta el contenedor en background.

# docker attach [container-id]
Para conectarme a un container que esta ejecutando en background.

# docker create centos
Crea el contenedor pero no lo ejecuta.

# docker stats [container-id]
Permite ver recursos que consume el contenedor, cpu, mem, io de red, io de bloques, etc. En %

# docker top [container-id]
Muestra los procesos, pid, tty, etc, que esta ejecutando ese contenedor.

# docker logs -f [container-id]
Veo logs del contenedor.

# docker rm [container-id]
Elimina un contenedor que no esta en ejecucion.

# docker rm -f [container-id]
Elimina un contenedor aunque esté ejecutando.

# docker container ls -a -q
Lista todos los ID de los contenedores.

# docker rm $(docker container ls -a -q)
Elimina todos los containers.

# docker stop [container-id]
Para un contenedor.
# docker start [container-id]
Inicia un contenedor parado. Veo el id con docker ps -a

# docker pause [container-id]
Pausa el contenedor.

# docker unpause [container-id] 
Quita de la pausa al contenedor.

# docker run -it --name debiacito debian /bin/bash
Ejecuta un contenedor debian con nombre.

# docker inspect [container-id]
Ver detalles especificos del contenedor: memoria, ip, gateway, etc.

# docker inspect [container-id] | grep Memory
Vemos la memoria que tiene ese contenedor. El 0 indica que no tiene limite.

# docker run -d -it -m 128M debian /bin/bash
Ejecuta un debian con limite de memoria 128 Mb.

# docker update -m 256 [container-id] 
Modifica el limite de memoria de un contenedor en ejecución a 256 Mb

# docker run -it -d --cpu-shares 1024 debian /bin/bash
# docker run -it -d --cpu-shares 512 debian /bin/bash 
docker run -it -d --cpu-shares 512 debian /bin/bash
Ejecuta 3 contenedores debian con limite de CPU, uno usa el 50% y los otros dos 25% c/u.
# docker ps | awk '{ print $1 }' | grep -v CONTAINER | xargs docker inspect | grep CpuShares
Con esto veo los cpu compartidos de todas los contenedores en ejecución.

# docker update --cpu-shares 1024 [container-id]
Modifica el limite de cpu compartido de un contenedor en ejecución.

# docker run -it -p 8181:80 debian /bin/bash
Expone el puerto host 8181 al puerto 80 del contenedor. Es una especie de port forwarding.

# docker run -it -e VARIABLE=valor debian /bin/bash
Asi definimos una variable de entorno dentro.

# docker run -it -v /nombreVolumen debian /bin/bash
Crea un volumen en /nombreVolumen de la maquina host para compartir con el contenedor. Es una especie de NFS.

# docker run -it -v /volumenEnElHost:/VolumenEnElContainer debian /bin/bash
Especifica la ruta en host y no queda aleatoria como comando anterior.

# docker inspect -f {{.Mounts}} [container-id]
Ver donde mapea el volumen en el host y en el container.

# docker create -v /Users/hernantirado/Desktop/VolumenEnElHost:/volenelcontainer --name debiancompartido debian 
# docker run -ti --volumes-from debiancompartido --name debian01 debian 
# docker run -ti --volumes-from debiancompartido --name debian02 debian
Creamos 2 contenedores llamados debian01 y debian02 que usan el mismo volumen de /volCompartidoParaVarios



# docker run -it --restart=always --name debiancito debian:01
Si reinicio el host iniciara el contenedor tambien.



Limites de Memoria y CPU en Docker

Límites de memoria y CPU:

Un container tiene acceso ilimitado a los recursos del sistema, asi que si uno ocupa toda la memoria los demás contenedores serán afectados.

Puedo aplicar un límite de memoria ó cpu a un contenedor específico.


Para esto crearemos 1 contenedor de debian, si no existe localmente lo descargará de docker-hub:     

# docker run -ti debian:1.0 /bin/bash
Para salir del terminal y no finalizar su ejecución presionamos Ctrl+p+q. 

Con el comando docker ps vemos que fue creada y está ejecutando:





Con el comando docker inspect y el id de contenedor verificamos el valor MemoryReservation:


# docker inspect 8592711fc458 | grep Memory

Vemos que el valor 0 marcado indica que ese contenedor no tiene valor limitado de memoria, es decir que utilizará todo lo que tenga disponible el host, posiblemente afectando a otros contenedores que estén dentro del mismo host.




Podemos limitar el uso de la memoria ejecutando el siguiente comando en caliente:

Le pasamos la cantidad que queremos como límite y el ID del contenedor al cuál aplicarlo:

# docker update -m 100MB bcd232430352


Si le da ese error posiblemente su kernel no lo soporte ó el cgroup no está montado, modificiamos el siguiente archivo agregando los siguientes valores:

# vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1"
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

Actualizamos el grub y reiniciamos el server:

# update-grub
# reboot

Volvemos a iniciar el contenedor que finalizaron por el reinicio, pero ahora en vez de ejecutar el comando docker update lo hacemos directamente como parametro --memory en el docker run:

# docker run --memory 256M -it nginx:1.0 /bin/bash

Vemos como aparece cambiado el memory de 0 anterior por los 268435456:

# docker inspect 7dce57e73352 | grep Mem            "Memory": 268435456,            "CpusetMems": "",            "KernelMemory": 0,            "MemoryReservation": 0,            "MemorySwap": 536870912,            "MemorySwappiness": null,