Renombrar volumen Docker

El cliente docker tiene un conjunto de opciones destinadas a administrar volúmenes (docker volume), pero ninguna de ellas permite renombrar un volumen existente.

Me puse a investigar cómo hacerlo y me fui a ver el filesystem y a buscar la carpeta que representa el volumen y hacer el cambio allí, pero cuando investigaba para no dañar la configuración me encontré con esta solución que me pareció muy filosofía docker, inclusive es lo que se hace para copiar un disco en una nueva unidad:

docker volume create --name <nuevo_volumen>
docker run --rm -it -v <viejo_volumen>:/from -v <nuevo_volumen>:/to alpine ash -c "cd /from ; cp -av . /to"
docker volume rm <viejo_volumen>

En definitiva se trata de crear un nuevo volumen, lanzar un contenedor que monta el volumen viejo y el volumen nuevo y copia los datos de uno a otro, y finalizar borrando el viejo volumen. Simple, seguro, y elegante.

La idea no es mía, la obtuve de este issue de Github, donde incluso alguien propone un script:

$ docker-rename-vol viejo-volumen nuevo-volumen

#/bin/bash
docker volume create --name $2
docker run --rm -it -v $1:/from -v $2:/to alpine ash -c "cd /from ; cp -av . /to"
[ $? -eq 0 ] && docker volume rm $1

Y ahora, está aquí mi blog para tenerlo presente.

Monitoreo de Docker

Podemos poner a correr uno, dos o más dockers sin problema, podemos armarnos un docker-compose.yml que se encargue de levantar redes, definir volúmenes, correr dockers en órden de dependencia, en fin, podemos tener dockers corriendo… pero después, ¿cómo sabemos por qué nuestro sistema está lento? ¿por qué el host se queda sin memoria?

Claro que tenemos las herramientas de siempre: top, vmstat, htop … por nombrar algunas. Pero desde el host vemos el 100% de los procesos, pero no los contenedores responsables.

Asi que esta es una lista de las herramientas que utilizo para monitoreo de docker:

CTOP

Un top, pero por contenedor, como si cada contenedor fuera un proceso

ctop

https://github.com/bcicen/ctop

y en mis servidores lo incluyo (mediante una task de ansible) en este alias:

alias ctop='docker run --rm -ti \
   -v /var/run/docker.sock:/var/run/docker.sock:ro \
   quay.io/vektorlab/ctop:latest'

LazyDocker

Un panel en la consola para todo tu docker (imágenes, docker corriendo, volúmenes) que te permite ver logs, stats, etc. y algunas acciones basicas como stop/start, delete, etc…. y todo todo sensible al mouse (click!) y por SSH

lazydocker

https://github.com/jesseduffield/lazydocker

y en mis servidores ansible lo deja configurado asi:

alias lazydocker='docker run --rm -it \
  -v /var/run/docker.sock:/var/run/docker.sock \
  lazyteam/lazydocker'

Si conoces alguna otra herramienta, compártela en los comentarios.

Docker tags

Buscar una imágen en docker es fácil con el comando docker search, pero luego que encuentras la imágen localizar las etiquetas disponibles ya no está al alcance del comando rápido… se requiere un consultar la respuesta json de una URL del registry.

Agregando este bloque de función al .bashrc

es posible tener un comando docker_tags que recibe por parámetro la imágen que se va a buscar y devuelve la lista de etiquetas disponibles:

$ docker_tags alpine
"20190707"
"20190809"
"20190925"
"3"
"3.10"
"3.10.1"
"3.10.2"
"3.8.4"
"edge"
"latest"

Si encuentras una mejora a esto, agradezco lo compartas en los comentarios.

El primer contenedor Docker

La primera vez que se presentó un contenedor Docker en forma pública lo hizo Solomon Hykes en la conferencia PyCon Santa Clara de 2013.

Es increíble y emocionante cómo Solomon describe rápidamente lo que hace un contenedor (minuto 2:30) que ejecuta un simple echo hello world.

  1. se genera la configuración de un contenedor
  2. se aloja el filesystem (se copia la imagen a una carpeta)
  3. se monta la capa de escritura del contenedor
  4. se configura la interfaz de red
  5. se gestiona una dirección IP y se configura
  6. se configura un NAT para comunicar el contenedor
  7. se ejecuta el comando y se despliega la salida
  8. se apaga el contenedor (o se destruye)

e inmediatamente recibe un aplauso del público, que asiste emocionado a lo que nosotros hoy día hacemos normalmente, sin emoción.

246 días y renace

Si, fueron 246 días off-line. Más concretamente 5907 horas, 51 minutos y 5 segundos en que este blog ha estado off-line, según mi sistema de monitoreo.

La baja del blog se debió al cierre de la capa gratuita del servicio RedHat OpenShift en octubre, cuando procesaron un cambio de versión (tengo entendido que la capa gratuita se ha restaurado, pero no estoy seguro).

Aprovechando este «apagón» decidí migrar toda la plataforma a una infraestructura de docker y entre los tiempos que puede dedicar, las pruebas, los armados, que ahora dedico tiempo al podcast deployando.me y si …. pasó mucho tiempo.

Primero levanté el wiki pi.lastr.us, luego el sistema de certificados Let’s Encrypt y por último este blog. Pero lo que más pruebas me llevó fue armar un sistema de respaldos coherente para todo lo que voy levantando.

La estructura armada es de la siguiente forma:

En el host se levantan un conjunto de contenedores docker:

Las dos aplicaciones

que están detrás de un proxy reverso que atiende las conexiones de los navegantes

que recibe los certificados y configuración SSL gestionada por

el blog que guarda datos en un volumen definido en una carpeta del host y en una base de datos

que se respalda a un espacio de disco diariamente mediante un contenedor

que es invocado desde una tarea diaria en el crontab.

Estoy muy conforme con el resultado, pues es un sistema coherente para mantener y respaldar y escalable para agregar eventualmente más aplicaciones.

Volver a ver mi blog online fue la culminación de un proyecto personal bastante lindo para mi.

Linux Containers, un enfoque práctico

Linux Containers es un tipo de virtualización a nivel de sistema operativo, que no tiene sobrecarga de emulación de hardware, resultando óptima para tener distintos Linux corriendo sobre Linux, logrando la máxima performance en las aplicaciones y mayor densidad en la cantidad de sistemas corriendo en el hardware real.

En esta presentación se aborda una explicación de los Linux Containers (LXC) con referencia práctica mediante ejempos de ejecución de contenedores, desde su creación hasta su destrucción. Asimismo, se repasa la arquitectura de los LXC para tener una idea de sus posibilidades de configuración y uso.

Público Objetivo: Usuarios de Linux. Administradores de centros de datos.

Requisitos: Se sugieren conocimientos de sistemas Linux, virtualización o sistemas operativos en general.

Conferencia dictada en:

(filmación de LinuxPay)

docker-machine para embarcar tus contenedores donde quieras

Captura del Puzzle Docker para Android de dockerapps
Imágen del Puzzle Docker para Android de dockerapps

Hacía tiempo, como dos meses, que no me soprendía con «magia informática» ya que acabo de ver docker-machine (sí, dos meses es bastante tiempo en informática, como para empezar a notar óxido intelectual).

Venía utilizando boot2docker para levantar una máquina virtual porta-contenedores que me permitía embarcar en ella mis docker; pero en la última actualización me avisa que es un comando ‘deprecated‘ y me refiere a docker-machine.

Luego de instalarlo (brew install docker-machine) me doy cuenta la notoria evolución que representa docker-machine: permite levantar una instancia/máquina-virtual porta-contenedores en mi notebook (virtualizando con virtualbox o vmware), en una nube (amazon, azure, digitalocean, google, rackspace, openstack, softlayer, etc) o en mi datacenter (openstack, vmwarevsphere), y, a partir de ahí, puedo empezar a embarcar mis contenedores.

El proceso es bien simple:

1. Crear porta-contenedores

Comando para VirtualBox local de nombre ‘vbdev

$ docker-machine create -d virtualbox \
        --virtualbox-memory "5120" \
        vbdev

Comando para DigitalOcean para un ‘droplet‘ en Amsterdam de 1GB ram de nombre ‘dodev

$ docker-machine create --driver digitalocean \
	--digitalocean-access-token "6d0c7..a0bfa" \ 
	--digitalocean-image "ubuntu-14-04-x64" \
	--digitalocean-region "ams1" \
	--digitalocean-size "1gb" \
	dodev

Para hacer esto, docker-machine crea certificados OpenSSH, se valida contra el sistema de cloud o virtualización, provisiona la instancia de acuerdo a la configuración solicitada y registra los accesos.

2. Activar el entorno del porta-contenedores que se va a utilizar

Por ejemplo, el entorno del porta-contenedor en DigitalOcean

$ eval "$(docker-machine env dodev)"

que permitirá a docker hacer las conexiones para administrar los contenedores.

3. Comenzar a embarcar los contenedores de forma acostumbrada

$ docker run hello-world

Como es de esperarse, docker-machine permite toda la administración de nuestro porta-contenedores donde quiera que esté, es decir, iniciarlo, detenerlo, borrarlo, reiniciarlo, obtener su configuración, actualizarlo, etc.

También acceder al porta-contenedor

$ docker-machine ssh dodev

y obtener la lista de todos nuestros porta-contenedores y su estado actual:

$ docker-machine ls
NAME    ACTIVE   DRIVER         STATE     URL                         SWARM
dev              virtualbox     Stopped                               
dodev            digitalocean   Timeout                               
vbdev            virtualbox     Running   tcp://192.168.99.100:2376   

Paso siguiente: docker-compose para instalaciones multi-contenedor.

Nadie entiende la nube, es un misterio

El software libre que actualmente tiene mayor desarrollo, que involucra a miles de desarrolladores y decentas de empresas alrededor del Mundo e incorpora funcionalidades a un ritmo de vértigo es precisamente un software para computación en la nube llamado OpenStack. Trataremos de entender qué es la nube y cómo mediante este software libre (y otros) podemos apropiarnos de la tecnología de punta y crear nuestra nube privada.

Público objetivo: Estudiantes de carreras de informática, profesionales de informática administradores de sistemas, empresarios y emprendedores en general.

Requisitos: Nivel básico

Conferencia dictada en:

Linux Containers ¿cuántos Linux quieres tener?

Linux Containers (LXC) es un sistema de virtualización con Software Libre nativo en GNU/Linux, que habilita aislar procesos y recursos sin la necesidad de correr software de interpretación y emulación, ni las complejidades de otros sistemas de virtualización. LXC permite además la virtualización en entornos ya virtualizados como Cloud Computing y está siendo una herramienta muy apreciada por los DevOps para crear entornos efímeros donde correr aplicaciones en entornos controlados y deshechables. Se presentarán los principales  aspectos técnicos de los  LXC desde un punto de vista práctico; pues si necesitas otro Linux alcanza con pedírselo al tu kernel. También se presenta Docker como herramienta de automatización de PaaS.

Público Objetivo: Usuarios de GNU/Linux, administradores de redes, SysAdmins y DevOps.  Público en general.

Requisitos: Nociones de virtualización; de preferencia conocer comandos de shell.

Conferencia dictada en: