miércoles, 16 de noviembre de 2022


Instalamos screen (si no esta en redhat hay que instalar epel antes):

yum install screen 

Listamos sesiones (no aparece ninguna activa):

screen -list

No Sockets found in /var/run/screen/S-root.

Activamos una nueva sesion con el comando screen:

screen

Ejecutamos el comando interactivo deseado: (un top, un ping o algo similar)

top

Para desatachar:

Cierro la ventana de la cruz del moba ó ctrl+a+d

Vuelvo a conetar por ssh al moba

Listamos sesiones (ahora vemos la sesion que dejamos activa, pero desatachada):

screen -list

There is a screen on:

        4716.pts-8.viya-service (Detached)

1 Socket in /var/run/screen/S-root.

Recupero la sesión que estaba desatachada (la que perdí por desconexión o por desatacharla con ctrl+a+d) con el comando -r y el id de sesión obtenido en el comando anterior:

screen -r 4716.pts-8.viya-service

Y si quiero salir le doy exit estando logueado en la sesion recuperada con el -r 

exit

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,

miércoles, 29 de mayo de 2019

Docker en Debian 9 Stretch



Docker:

Docker es un proyecto de código abierto con el cuál podemos crear contenedores.

Un contenedor es un prisma rectangular de gran tamaño que suelen utilizar los barcos para transportar mercaderías y suele tener dentro distintos tipos de productos. Docker vendría a ser como el transportador de esos containers, es decir el barco.

Llevado a la informática se utiliza para que aplicaciones de software puedan ejecutarse en cualquier máquina, independizandose del sistema operativo.

Es una especie de empaquetado de sofware que se puede llevar de un lado a otro.

Docker permite meter todo lo que se necesite para que una aplicación funcione y se ejecute correctamente.
Por ejemplo debe contener algo como: java, tomcat, nginx, la aplicación en si misma, librerias, binarios y todo lo que necesite para funcionar.

Si llevo ese contenedor a otro servidor donde esté docker instalado debería funcionar correctamente.


Docker Hub:

Es un repositorio donde los usuarios de docker y los partners crean, testean, guardan y distribuyen imagenes de contenedores.

Es un lugar de donde me puedo bajar contenedores ya armados y listos para usar. Por ejemplo un debian oficial, un linux customizado, un ubuntu con paquetes ya instalados, un webserver ya listo para usarse, etc.


Docker Files:

Se pueden crear imágenes a partir de un archivo llamado Dockerfile.


Instalando docker:
apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian stretch stable"
apt-get update
apt-get install docker-ce 


Verificamos que Docker se este ejecutando:
/etc/init.d/docker status




Vemos todas las imágenes de debian en dockerhub:
docker search debian



Si quiero descargar una imagen utilizo el docker pull:
docker pull debian



Para ver las imagenes que tengo ya descargadas:
docker images



Ver contenedores ejecutando:

No tenemos contenedores corriendo, por ahora solo lo descargamos.

docker ps



Ejecutar un contenedor:

Utilizaremos la imagen de debian oficial que bajamos anteriormente con el comando pull:

Utilizaremos losbparámetros -t de tty y el -i de interactivo y le decimos que ejecute un bash. Vemos como nos cambió el prompt:

docker run -t -i debian /bin/bash



Instalamos paquetes en el container:

Hacemos un update de los repositorios e instalamos nginx, wget y vim.

root@1363037a2fad:/# apt-get update && apt-get -y install wget vim nginx



Tener en cuenta que puedo salir del contenedor con exit ó Ctrl+d pero dejará de ejecutarse el contenedor.

Si quisiera volver a tener el mismo container corriendo tendría que volver a instalar todo lo que instalé antes ya que no guarde los cambios en una imagen.

Para guardar esos cambios en una imagen primero debo salir sin matar el contenedor, para eso ejecutamos Ctrl+p+q y veremos que vuelve el prompt.



Si ahora ejecutamos el comando docker ps veremos que sigue corriendo ese container:

docker ps



Crear una imagen:

Ahora voy a guardar la imagen modificada, pero con otro nombre.

Primero obtenemos el ID del contenedor en ejecución (f5b9be35915d) con el comando "docker ps".

Guardaremos los cambios en una nueva imagen llamada nginx-debian:1.0. Esto lo hacemos con "docker commit [id-del-contenedor] [nombre-nueva-imagen] por ejemplo:

docker commit f5b9be35915d nginx-debian:1.0



Verificamos la creacion de la imagen:

root@debian:~# docker images



Salimos de un contenedor sin que quede en ejecución:

Primero verificamos que no hay contenedor corriendo:

docker ps

Verificamos que imagenes podemos usar para crear un contenedor:

docker images 

Iniciar un contenedor interactivo con la imagen que guardamos previamente llamada nginx-debian versión 1.0:

docker run -it nginx-debian:1.0

Salimos del contenedor con exit ó con Ctrl+d:

root@8c80b4f2c09e:/# exit

Verificamos que el contenedor no está corriendo:

docker ps



Si quiero borrar una imagen hacemos lo siguiente:

Vemos las imágenes disponibles:

docker images

Eliminamos la imagen nginx-debian v1.0:

docker rmi -f nginx-debian:1.0

Volvemos a ver que fue eliminada:

docker images




Creando una imagen con Dockerfile:

Creamos la carpeta y archivo Cockerfile y lo editamos:
mkdir -p /var/Dockerfile/nginx
vi /var/Dockerfile/nginx/Dockerfile

Dentro ponemos lo siguiente, este archivo debería utilizar un contenedor debian, indica que Hernan es el que la mantiene, actualiza los repo, instala en nginx lo expone en el puerto 8888 e inicia el demonio del nginx:
FROM debian
MAINTAINER HERNAN
RUN apt-get update && apt-get install -y nginx && apt clean
EXPOSE 8888
RUN /etc/init.d/nginx start

Ejecutamos el build posicionandonos donde está el docker file:
cd /var/Dockerfile/nginx/
docker build . 



Verificamos las imagenes:

root@debian:~# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
debian-apache                        latest              af0593cb85eb        59 seconds ago      225MB
debian                               latest              8d31923452f8        3 weeks ago         101MB

Vemos que no hay nada corriendo, ejecutamos la imagen debian-apache y verificamos que ahora corre:

root@debian:~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

root@debian:~#
root@debian:~# docker run -p 8181:80 debian-apache-bis /usr/sbin/apache2ctl -D FOREGROUND
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message



Si ingresamos a la ip del docker, no la del contenedor, deberíamos ingresar al puerto 8181 y nos reenviaría al apache 80 del contenedor:

http://debian:8181/


Matamos el contenedor que habia quedado corriendo:

root@debian:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED                                                          STATUS              PORTS                          NAMES
68c121179ab3        debian-apache-bis   "/usr/sbin/apache2ct…"   12 minutes ago                                                   Up 12 minutes       81/tcp, 0.0.0.0:8181->80/tcp   vigorous_benz
root@debian:~# docker kill 68c121179ab3