Durante el pasado año y como parte de nuestra filosofía de mejora continua, hemos estado realizando diversas sesiones de formación compartida, en las que son los propios miembros de nuestro equipo los que ponen en común sus conocimientos, experiencias e ideas. Como sabemos, la capacitación constante y el aprendizaje continuo son fundamentales para mantenernos actualizados en un mundo tecnológico en constante evolución.

En esta serie de posts, comentaremos algunos aspectos clave de estas sesiones.

Píldora formativa 04:

Docker

Imparte:

Fran Moreno

Significado de opciones más comunes


docker run –name postgres -v ./pgdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=postgres –restart=always -p 5432:5432 -d postgres:9.6
–name → nombre del contenedor
-v → volumen que quieres asignar al contenedor
-e → variables del contenedor
-p → puertos a exponer
-d → correr en background
–restart → elegir cuando reiniciar el contenedor (always, on-failure, unless-stopped, no)


Ejecutar comandos en un contenedor
Para ejecutar comandos en un contenedor se usa “docker exec”, por ejemplo:

docker exec -it nombre-contenedor mkdir prueba
Si queremos ejecutar varios comandos podemos hacerlo con: docker exec -it nombre-contenedor bash -c “mkdir prueba; rmdir prueba”

También se puede conectar a una consola como si estuviéramos dentro del contenedor con:
docker exec -it nombre-contenedor bash


Como conectar a un puerto no expuesto de un contenedor
Para conectar a un puerto no expuesto de un contenedor como por ejemplo a un postgresql hay que conocer la IP del contenedor, la cual se puede obtener con el comando “docker inspect nombre- contenedor” que devuelve toda la información del contenedor y al final del todo pondrá algo como:

«NetworkID»: «086d8c1d41a96207054f480272b16e0a4c327df9565c0a19bef54c1b43337bb1», «EndpointID»: «fb07794d9ef7d2982dcc76065fe70758f0dc0289f1d24695f47a7fa3e25f39ce», «Gateway»: «192.168.208.1»,
«IPAddress»: «192.168.208.4»,
«IPPrefixLen»: 20,
«IPv6Gateway»: «», «GlobalIPv6Address»: «», «GlobalIPv6PrefixLen»: 0, «MacAddress»: «02:42:c0:a8:d0:04», «DriverOpts»: null
Donde IPAddress es la IP del contenedor.

Una vez sepamos la IP ya se podría establecer la conexión siempre y cuando el contenedor este en la misma máquina en la que establecemos la conexión, si no deberíamos abrir un túnel SSH a la maquina donde se encuentra el contenedor.

 

Copiar ficheros desde el host a un contenedor y viceversa
Con el comando “docker cp” se pueden copiar archivos entre contenedores y host, la sintaxis es la siguiente:

Para copiar ficheros del host a un contenedor:
docker cp /path/prueba.txt nombre-contenedor:/path

Para copiar ficheros de un contenedor al host:
docker cp nombre-contenedor:/path/prueba.txt /path


Imágenes de contenedores
Para crear una imagen de docker se usa el comando “docker build” al ejecutar ese comando lo que hace es ejecutar los comandos que se hayan definido en el fichero Dockerfile.

Para ver las imágenes que tenemos en nuestro ordenador se usa el comando “docker image ls”, para borrar una imagen que no usemos se usa “docker image rm nombre-imagen” y para borrar todas las imágenes que no estemos usando se usa el comando “docker image prune -a”


Networks
Las networks sirven para agrupar contenedores en distintas subnets y los contenedores dentro de una network solo podrán conectar con los contenedores que estén dentro de la misma network.


Docker compose
Con docker compose puedes levantar varios contenedores a la vez con sus respectivas configuraciones, por ejemplo:

version: «3.9» services:
db:
image: mysql:5.7
volumes:
– ./mysql-dump/init.sql:/docker-entrypoint-initdb.d/1-init.sql – ./db-data:/var/lib/mysql
restart: always ports:
– «33060:3306» environment:
MYSQL_ROOT_PASSWORD: calblanque MYSQL_DATABASE: calblanque MYSQL_USER: calblanque MYSQL_PASSWORD: calblanque
wordpress: depends_on:

– db
image: wordpress:latest
volumes:
– .:/var/www/html
ports:
– «8000:80»
restart: always environment:
WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: calblanque WORDPRESS_DB_PASSWORD: calblanque WORDPRESS_DB_NAME: calblanque


Pasar contenedor funcionando a otra maquina
Para pasar un contenedor funcionando de una maquina a otra se debe hacer lo siguiente: Guardar el contenedor como una imagen de docker:

docker commit nombre-contenedor nombre-imagen


Guardar la imagen en un comprimido:

docker save nombre-imagen | gzip > nombre-imagen.tar.gz


Cargar la imagen comprimida en la otra maquina:

gunzip -c nombre-imagen.tar.gz | docker load


Por último volver a ejecutar “docker run” para levantar el contenedor:
docker run -d –name nombre-contenedor nombre-imagen

Admin