Skip to main content

Controlando el Daemon Docker

Antes que nada, intentemos entender qué es un daemon. Sabemos que, en sistemas operativos multitask, es decir, en un sistema operativo capaz de ejecutar más de una tarea a la vez (not really), un daemon es un software que se ejecuta de forma independiente en background. Él ejecuta ciertas acciones predefinidas en respuesta a ciertos eventos. Pues bien, el daemon de Docker es exactamente eso: una especie de proceso padre que controla todo, containers, imágenes, etc., etc., etc.

Hasta Docker 1.7, las configuraciones referentes específicamente al daemon se confundían bastante con configuraciones globales -- esto porque cuando escribías "docker -help", un montón de cosas se mostraban y no sabías qué era qué. A partir de la versión 1.8 tuvimos el "docker daemon", y ahora, más recientemente, creemos que en la versión 18.03 de Docker, fue reemplazado por "dockerd", que resuelve definitivamente este problema y trata específicamente de configuraciones referentes, obviamente, al daemon de Docker.

11.1. ¿Docker siempre utiliza 172.16.X.X o puedo configurar otro rango de IP?

Sí, puedes configurar otro range para ser utilizados por el bridge "docker0" y también por las interfaces de los containers.

Para que puedas configurar un range diferente para la utilización de Docker es necesario iniciarlo con el parámetro "--bip".

# dockerd --bip 192.168.0.1/24

Así, estarás informando a Docker que deseas utilizar la IP "192.168.0.1" para su bridge "docker0" y, consecuentemente, para la subnet de los containers.

También podrás utilizar el parámetro "--fixed-cidr" para restringir el range que Docker utilizará para el bridge "docker0" y para la subnet de los containers.

# dockerd --fixed-cidr 192.168.0.0/24

11.2. Opciones de sockets

Los sockets son end-points con los cuales dos o más aplicaciones o procesos se comunican en un ambiente, generalmente un "IP:puerto" o un archivo, como en el caso de Unix Domain Sockets.

Actualmente Docker puede trabajar con tres tipos de sockets: Unix, TCP y FD, y por default usa unix sockets. Debes haber notado que, al iniciar tu Docker, fue creado un archivo en "/var/run/docker.sock". Para hacer alteraciones en él necesitarás permisos de root o que el usuario que esté ejecutando las acciones forme parte del grupo "docker", como dijimos al comienzo de este libro, ¿recuerdas?

Por más práctico que esto sea, existen algunas limitaciones, como, por ejemplo, que el daemon solo pueda ser accedido localmente. Para resolver esto usamos generalmente TCP. En este modelo definimos una IP, que puede ser tanto "cualquiera" (0.0.0.0 y un puerto) como una IP específica y un puerto.

En sistemas basados en systemd aún puedes beneficiarte del systemd socket activation, una tecnología que busca economía de recursos. Consiste básicamente en activar un socket solamente mientras una nueva conexión llega y desactivarlo cuando no está siendo más usado.

Además de todo esto, dependiendo de tu ambiente, también puedes hacer que Docker escuche en diferentes tipos de sockets, lo que se hace a través del parámetro "-H" del comando "dockerd".

Ejemplos:

11.2.1. Unix Domain Socket

root@linuxtips:~# dockerd -H unix:///var/run/docker.sock
INFO[0000] [graphdriver] using prior storage driver "aufs"
INFO[0000] Graph migration to content-addressability took 0.00 seconds
INFO[0000] Firewalld running: false
INFO[0000] Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP
address
WARN[0000] Your kernel does not support swap memory limit.
INFO[0000] Loading containers: start.
..........................
INFO[0000] Loading containers: done.
INFO[0000] Daemon has completed initialization
INFO[0000] Docker daemon commit=c3959b1 execdriver=native-0.2 graphdriver=aufs version=1.10.2
INFO[0000] API listen on /var/run/docker.sock

11.2.2. TCP

root@linuxtips:~# dockerd -H tcp://0.0.0.0:2375
WARN[0000] /! DON'T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON'T KNOW WHAT YOU'RE DOING /!
INFO[0000] [graphdriver] using prior storage driver "aufs"
INFO[0000] Graph migration to content-addressability took 0.01 seconds
INFO[0000] Firewalld running: false
INFO[0000] Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address
WARN[0000] Your kernel does not support swap memory limit.
INFO[0000] Loading containers: start.
..........................
INFO[0000] Loading containers: done.
INFO[0000] Daemon has completed initialization
INFO[0000] Docker daemon commit=c3959b1 execdriver=native-0.2 graphdriver=aufs version=1.10.2
INFO[0000] API listen on [::]:2375

11.3. Opciones de storage

Siendo quien controla todo, naturalmente es posible pasar opciones que cambian la forma en que Docker se comporta al trabajar con storages. Como mencionamos anteriormente, Docker soporta algunos storage drivers, todos basados en el esquema de layers.

Estas opciones se pasan al daemon por el parámetro "--storage-opt", con el cual los ítems relacionados al Device Mapper reciben el prefijo "dm" y "zfs" para (¿adivinas?) ZFS. A continuación vamos a demostrar algunas opciones más comunes:

  • dm.thinpooldev -- Con esta opción puedes especificar el device que será usado por Device Mapper para desarrollar el thin-pool que usa para crear los snapshots usados por containers e imágenes.

Ejemplo:

root@linuxtips:~# dockerd --storage-opt dm.thinpooldev=/dev/mapper/thin-pool
INFO[0000] [graphdriver] using prior storage driver "aufs"
INFO[0000] Graph migration to content-addressability took 0.00 seconds
INFO[0000] Firewalld running: false
INFO[0000] Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address
WARN[0000] Your kernel does not support swap memory limit.
INFO[0000] Loading containers: start.
................................
INFO[0000] Loading containers: done.
INFO[0000] Daemon has completed initialization
INFO[0000] Docker daemon commit=c3959b1 execdriver=native-0.2 graphdriver=aufs version=1.10.2
INFO[0000] API listen on /var/run/docker.sock
  • dm.basesize -- Este parámetro define el tamaño máximo del container. Lo molesto de esto es que necesitas eliminar todo dentro de "/var/lib/docker" (lo que implica matar todos los containers e imágenes) y reiniciar el servicio de Docker.
root@linuxtips:~# dockerd --storage-opt dm.basesize=10G
INFO[0000] [graphdriver] using prior storage driver "aufs"
INFO[0000] Graph migration to content-addressability took 0.00 seconds
INFO[0000] Firewalld running: false
INFO[0000] Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address
WARN[0000] Your kernel does not support swap memory limit.
INFO[0000] Loading containers: start.
..........................
INFO[0000] Loading containers: done.
INFO[0000] Daemon has completed initialization
INFO[0000] Docker daemon commit=c3959b1 execdriver=native-0.2 graphdriver=aufs version=1.10.2
INFO[0000] API listen on /var/run/docker.sock
  • dm.fs -- Especifica el filesystem del container. Las opciones soportadas son: EXT4 y XFS.

11.4. Opciones de red

También es posible controlar cómo se comportará el daemon en relación a la red:

  • --default-gateway -- Auto-explicativo, ¿no? Todos los containers recibirán esta IP como gateway.

  • --dns -- También sin secretos: es el DNS que será usado para consultas.

  • --dns-search -- Especifica el dominio a ser buscado, así puedes buscar máquinas sin usar el fqdn.

  • --ip-forward -- Esta opción habilita el enrutamiento entre containers. Por defecto, ya viene configurada como true.

11.5. Opciones diversas

  • --default-ulimit -- Pasando esto al daemon, todos los containers serán iniciados con este valor para el "ulimit". Esta opción es sobrescrita por el parámetro "--ulimit" del comando "docker container run", que generalmente dará una visión más específica.

  • --icc -- "icc" viene de inter container comunication. Por defecto, viene marcado como true; en caso de que no quieras este tipo de comunicación, puedes marcarlo en el daemon como false.

  • --log-level -- Es posible alterar también la forma en que Docker trabaja con log; en algunas situaciones (generalmente troubleshoot) puedes necesitar un log más "verboso", por ejemplo.