Docker network + macvlan

Seguimos con los posts de docker y ahora toca uno sobre el tema de networking.

La necesidad básica es la de publicar a Internet un servidor web con nginx. En lugar de definir la IP pública al servidor docker nos interesa ponerla dentro del contenedor de nginx y luego que él sea el que tenga acceso al resto de máquinas.

El servidor de docker con el que estoy trabajando es una máquina física con debian con una IP de guifi (10.90.234.170) y en el datacenter donde está en la VLAN 138 está el rango de IP públicas (5.10.205.128/27).

Crear la network

Docker por defecto trae 3 networks, por defecto cuando creamos un contenedor nuevo asigna la red bridge (driver bridge) 172.17.0.0/16

root@wezen02:~# docker network ls
NETWORK ID          NAME                           DRIVER              SCOPE
f9e3dcfa1e06        bridge                         bridge              local
262f24ac9f10        host                           host                local
c4572142389a        none                           null                local

Para crear una nueva red y vincularla a la vlan correspondiente usaremos lo siguiente:

# docker network create -d macvlan -o parent=eno1.138 public

Cuando creamos una nueva red docker le asigna un rango por defecto correlativo al último rango creado, por ejemplo 172.18.0.0/16 pero nos interesa que cuando asignemos ésta network a un contenedor le asigne una IP de nuestro rango público.

# docker network rm public
# docker network create -d macvlan -o parent=eno1.138 public --subnet=5.10.205.128/27 --gateway=5.10.205.129 --ip-range 5.10.205.152/29

Con –subnet indicamos la red en la que trabaja la network, –gateway la puerta de enlace de nuestro router e –ip-range el rango que asignará automáticamente a los …

Caso real de despliegue con Docker Compose

Hago éste post con muchísima ilusión por tener la sensación de haber hecho un muy buen trabajo y haber asentado los conocimientos adquiridos en el curso de DevOPs que hice ya hace unas 3 semanas. Ya lo he hecho personalmente y ahora lo hago públicamente, pero le doy las infinitas gracias a Sens Solutions por confiar en mi y por la gran oportunidad de hacer un trabajo de éste tipo sabiendo que partía de unos conocimientos muy básicos! También a Alberto García por la formación ofrecida y el cuál no he tenido que contactar para resolver dudas (de momento).

Así que mi aportación de retorno es explicar como lo he hecho y que pueda servir a otras personas que como yo se están adentrando a éste mundo de Docker.

Para éste post recomiendo antes de todo revisar éstos dos posts que hice hace ya unas semanas: Comandos básicos de Docker y Introducción al trabajo con Dockerfile.

Con Dockerfile tenemos una receta para desplegar un contenedor (o container). Con docker-compose tenemos pues una receta para desplegar un conjunto de contenedores que interactuarán entre ellos. El caso (real) que voy a desarrollar en éste post considero que es muy didáctico porqué desplegaremos contenedores sin usar Dockerfile y otros los vamos a desplegar usando Dockerfile, una vez desplegados los vamos a vincular entre ellos. Prometo un post extenso y completo :)

El entorno que necesitamos desplegar consiste en:
– 1 contenedor con mariadb (dockerhub)
– 1 contenedor con una aplicación django, backend …

Introducción al trabajo con Dockerfile

Continuamos con los posts de Docker, en éste otro post hemos visto los comandos básicos para manejarnos con docker. Ahora vamos a entrar con Dockerfile para después centrarnos en docker-compose.

DOCKERFILE
El dockerfile consiste en un fichero con el nombre “Dockerfile” el cual contiene una “receta” para construir una imagen para después desplegarla como contenedor. Éste fichero lo encontraremos solo o acompañado de ficheros que se usarán para el despliegue del contenedor. Éste fichero tiene unas palabras reservadas que atienden a lo siguiente (se describen los mas usados):

FROM indica cuál es la imagen en la que se basa el contenedor que vamos a crear

MAINTAINER los datos del autor de la imagen
Sintaxis: MAINTAINER

RUN Esta instrucción ejecuta cualquier comando en una capa nueva encima de una imagen y hace un commit de los resultados. Esa nueva imagen intermedia es usada para el siguiente paso en el Dockerfile. Cuando creamos una imagen nos interesa hacerla con el mínimo de capas posible. RUN tiene 2 formatos
Sintaxis: RUN comando
Sintaxis: RUN [“ejecutable”, “parametro1”, “parametro2”]

ENV variables de entorno a pasar al crear el contenedor (-e)
Éstas variables pueden usarse dentro de cualquier fichero del entorno, por ejemplo un script ejecutable. Éstos son los valores por defecto a menos que se especifique otro en -e
Sintaxis: ENV key value
Sintaxis: ENV key=value

ADD/COPY copiar ficheros o directorios que se encuentran en el mismo sitio que el Dockerfile hacia dentro del contenedor. ADD permite descargar un fichero alojado por http.

Sintaxis: …

Comandos básicos de Docker

El otro día vimos como instalar un cluster de docker con swarm. Mas adelante veremos como se monta un cluster de Docker con Kubernettes. Tanto Swarm como Kubernettes son orquestadores de docker y para entender como funcionan antes debemos entender como usar Docker a pelo.

Docker puede funcionar perfectamente en una sola máquina y no es necesario montar un cluster, para tenerlo a mano, pego en modo resumen la parte de instalación de docker del anterior post (instalación en Debian):

root@docker-master:~# apt update && apt -y upgrade && apt -y dist-upgrade
root@docker-master:~# apt-get remove docker docker-engine docker.io containerd runc
root@docker-master:~# apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
root@docker-master:~# curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
root@docker-master:~# apt-key fingerprint 0EBFCD88
root@docker-master:~# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
root@docker-master:~# apt update
root@docker-master:~# apt-get install docker-ce docker-ce-cli containerd.io

Una vez instalado Docker, voy a explicar de que va ésto.

Docker es un software de virtualización. La virtualización nace en AIX, el sistema operativo de los mainframes de IBM. La virtualización nace de la necesidad de correr otros sistemas operativos dentro de un sistema operativo. A lo largo de los años y a medida que los servidores y ordenadores de sobremesa han sido mas potentes, han ido apareciendo muchos programas y métodos de virtualización.
Por un lado tenemos los sistemas de virtualización de un sistema operativo entero como podrían ser VirtualBox, VMWare, KVM, Xen, etc. y mas adelante salieron otros sistemas que compartían el núcleo del sistema operativo (kernel) con el host.…

Instalar cluster docker (swarm) + portainer.io

Ésta semana y la anterior estoy con un curso de DevOPs. En él estamos viendo principalmente docker y los orquestadores swarm y kubernetes.
En éste post nos vamos a centrar de momento con swarm.

Swarm viene “instalado” cuando instalamos docker y no tendremos que instalar nada addicional, simplemente configurarlo que lo veremos mas adelante.

Primero de todo pues tendremos que instalar docker, pero no usaremos los paquetes del repositorio, sino que vamos a seguir la instalación de la página web de docker para debian.

El entorno donde vamos a instalar docker van a ser 3 máquinas virtuales con KVM, docker-master (172.31.0.201), docker-worker1 (172.31.0.202) y docker-worker2 (172.31.0.203). La instalación la repetimos en las 3 máquinas.

Instalar docker

Comprobamos que docker no esté instalado y si lo está, lo desinstalamos

root@docker-master:~# apt update && apt -y upgrade && apt -y dist-upgrade
root@docker-master:~# apt-get remove docker docker-engine docker.io containerd runc

Instalamos las dependencias necesarias

root@docker-master:~# apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

Añadimos la clave GPG

root@docker-master:~# curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
root@docker-master:~# apt-key fingerprint 0EBFCD88

Configuramos el repositorio “stable”

root@docker-master:~#  add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

Instalamos docker

root@docker-master:~# apt update
root@docker-master:~# apt-get install docker-ce docker-ce-cli containerd.io

A partir de aquí ya tenemos docker instalado y procederemos a montar el cluster swarm.

Activar cluster swarm

A continuación, montaremos 1 master y 2 workers. La recomendación es tener mínimo 3 master y 3 workers. En swarm, un master puede actuar como worker. De momento en el entorno que estamos …