Docker ‘EXPOSE’: a que no sabías

Si han trabajado con Docker es de esperarse que se hayan encontrado con el comando EXPOSE dentro de un Dockerfile, ¿no es así? De igual manera, cuando construyes un Dockerfile lo sueles utilizar para «exponer» un puerto del contenedor… ¿ o no?

Hoy me acabo de enterar que ese comando realmente NO expone los puertos del contenedor. Si no que más bien existe solo por un motivo de documentación entre la persona que construye la imagen y la persona que ejecuta el contenedor: de esta manera, éste último sabe que puertos están disponibles dentro de la imagen para ser utilizados.

Cito la documentación:

The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container, about which ports are intended to be published. To actually publish the port when running the container, use the -p flag on docker run to publish and map one or more ports, or the -P flag to publish all exposed ports and map them to high-order ports

Dockerfile reference – https://docs.docker.com/engine/reference/builder/#expose

Interesante.

Fedora 32 y problemas con Docker

Hace unos días actualicé de Fedora 31 a Fedora 32. Hoy me puse a trabajar con Docker y encontré que algo muy raro estaba pasando: mis contenedores no se podían comunicar entre ellos y tampoco podían consumir ningún servicio externo (API, DB, etc).

Mi primera sospecha era que habían problemas con la resolución DNS ya que estaba probando una migración con Liquibase y el contenedor era incapaz de conectarse a la DB, pero sí lo podía hacer mi máquina host con DBeaver. Entonces ejecuté la prueba:

$ docker run --rm --entrypoint "/bin/ping" liquibase/liquibase www.google.com
$ ping: bad address 'www.google.com'

Efectivamente el contenedor no podía resolver el dominio. Así que me puse a investigar y encontré la solución en Reddit:

sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0

Una vez ejecutado el comando, deben reiniciar el computador para que tome efecto.

Al parecer firewalld no se lleva bien con Docker en esta versión y está mucho más estricto. Tal cual como dice el usuario de Reddit, desconozco las implicancias de seguridad respecto al comando anterior, pero como por lo general Docker es un «ambiente controlado» por nosotros no veo mucho riesgo.

[JavaScript] Obtener parámetros GET desde la URL

Muchas veces me ha tocado trabajar con los parámetros que vienen en la URL (a.k.a query strings) y siempre terminaba utilizando una función que mediante expresiones regulares y magia negra me retornaba los valores que necesitaba.

Ayer encontré una maravillosa API web nativa llamada URLSearchParams. Todas esas expresiones regulares y magia negra que siempre he utilizado, ahora se encuentra encapsulada. De hecho, los valores que vienen URL Encoded los decodifica automágicamente.

let params = new URLSearchParams('?phone=%2B56123123&names[]=Name1&names[]=Name2&complex=%C2%BFesto%20es%20un%20texto%20complejo%3F%2C%C2%A1s%C3%AD%21%20%3AD');
params.get('phone') // +56123123
params.getAll('names[]'); // ["Name1", "Name2"]
params.get('complex') // ¿esto es un texto complejo?,¡sí! :D

Inclusive la API te permite manipular el query string, pudiendo agregar o remover elementos.

let params = new URLSearchParams('?name=MyName');
params.append('phone', '+569989887');
params.toString(); // name=MyName&phone=%2B569989887

Respecto al soporte en navegadores es bastante aceptable, todos los navegadores modernos lo soportan.

Referencias: https://codepunk.io/getting-query-string-parameters-in-javascript-the-new-way/

Clean Code: estructuras de control

Es muy común encontrarse con código que contiene mucha lógica anidada o código que sin estar anidado es un poco redundante y puede ser simplificado.

Veamos a continuación algunos ejemplos de lo que estoy hablando y así poder obtener un código más limpio. Si bien los ejemplos están en PHP, esto es aplicable para cualquier lenguaje.

EJEMPLO 1

function esManzanaRoja($manza)
{
  if ($manza->getColor() === 'roja') {
    return true;
  } else {
    return false;
  }
}

Mejor:

function esManzanaRoja($manza)
{
  if ($manza->getColor() === 'roja') {
    return true;
  }

  return false;
}

Aún mejor:

function esManzanaRoja($manza)
{
  return $manza->getColor() === 'roja';
}

Sigue leyendo «Clean Code: estructuras de control»

Docker: run vs exec

El tiempo apremia, así que en palabras simples…

docker run

Ejecuta el comando en un nuevo contenedor. Este comando va a levantar el contenedor y ejecutar el comando. Por ejemplo:

docker run --name test -it debian

docker exec

Ejecuta el comando en un contenedor existente. Por ejemplo, si quisiéramos acceder mediante SSH a un contenedor que se está ejecutando:

docker exec -it ubuntu_bash bash

En el caso de docker-compose el comportamiento es el mismo.

Fuente: Docker run vs exec: deep-dive into their differences

Docker y los permisos en directorios compartidos

He estado jugando bastante con Docker últimamente. He aprendido un montón y he tenido que solucionar varios problemas intentando armar un ambiente real de producción de una aplicación X.

El último problema que tuve fue con los permisos de los famosos volumes o directorios. El asunto es que Docker por defecto al montar el directorio, mantiene los permisos que tiene definido ese directorio en tu máquina host.

Sigue leyendo «Docker y los permisos en directorios compartidos»

Torrent box con Raspberry Pi

deluge_raspberry

Hace ya bastante tiempo que tengo en mi casa una Raspberry Pi como centro de descargas torrent. Anoche, quien sabe por qué, algo salió mal y me veo en la obligación de re-instalar todo nuevamente. Así que bien, voy a aprovechar de documentar y explicar un poco el proceso por si alguien más se anima.

La ventaja de tener una Raspberry Pi en vez de tener tu computador encendido todo el día es enorme: consume ~3W, es silenciosa, no genera calor y se ve bonita. Todo funcionando bajo Raspbian como OS y Deluge como cliente torrent.

QUÉ VAMOS A LOGRAR

  • Tener un cliente torrent siempre on-line listo para descargar
  • Acceso remoto vía web para controlar el cliente torrent con DNS dinámico
  • Realizar las descargas en un disco duro externo para su posterior extracción

REQUISITOS

  • Raspberry Pi
  • Un case bonito. No queremos que se llene de polvo o le caiga algún líquido, cierto?
  • Una fuente de poder de al menos 3A para evitar futuros problemas. Algunos HDD consumen más que otros y si van a conectar otros periféricos a la Raspberry Pi es mejor estar preparados
  • Una tarjeta microSD de al menos 2GB (recomendado >= 4GB)
  • Un HDD externo a elección
  • Una conexión a internet… no me digas

Sigue leyendo «Torrent box con Raspberry Pi»

Chrome DevTools tips newsletter

Como dicen en mi país «no vengo a vender, vengo a regalar»def., ya que les quiero compartir uno de los pocos newsletter el cual estoy suscrito de hace ya casi 2 años y en ninguna edición me ha defraudado.

Este newsletter llamado Dev Tips entrega de forma semanal tips del DevTools de Chrome. La mayoría del tiempo son cosas que están un poco ocultas y que difícilmente uno las iba a descubrir. Los tips son bien variados y cubren todas las áreas del DevTools: performance, networking, debugging, etc, y van desde asuntos básicos a más experimentados.

Lo que realmente me gusta del newsletter, es que cada edición viene con un GIF en vez de un largo texto explicativo, haciéndolo fácil de digerir.

Chrome DevTools - Dev Tips Newsletter

Los invito a suscribirse y espero les sea de utilidad. Aprovecho también de agradecer al autor, Umar Hansa, por darse el tiempo semana a semana de crear este contenido.

def.: Frase típica de vendedores ambulantes o callejeros al subir a vender sus productos a buses del transporte público en Chile.

Docker: Conectarse al servidor MySQL de tu máquina host

Hace unos días empecé a trabajar con Docker para un proyecto personal. Actualmente estoy acostumbrado a trabajar con Vagrant, así que le di la oportunidad a Docker para probar algo nuevo, ya que había leído muy buenos comentarios de esta herramienta.

Lo que voy a detallar a continuación es una nota mental para dejar registro de como finalmente logré conectarme desde un contenedor de Docker a mi servidor MySQL que tengo corriendo en mi máquina local (o host como llaman en el mundo Docker). Perdí muchas horas en esto y no quiero volver a pasar por lo mismo.

Sigue leyendo «Docker: Conectarse al servidor MySQL de tu máquina host»