Comunicar contenedores de Docker entre sí

Otro escenario super útil es comunicar contenedores entre sí. Ayer estuve jugando con un volumen y una base de datos postgres. Hoy quiero mostrarte cómo utilizar otro contenedor para conectarte a esa base de datos. Además, una vez finalice las operaciones con la misma, el contenedor que hace de cliente se eliminará automáticamente.

#Create a docker container with a volume assigned
docker run -d -p 5432:5432 -v postgres-data:/var/lib/postgresql/data --name mypostgres postgres

#Access to that container
docker exec -it mypostgres sh

#Create a postgress db
createdb -U postgres mydb

#Access to my postgress db
psql -U postgres mydb

#Create a table
CREATE TABLE products (id int, name varchar(100));

#Create a product into my table
INSERT INTO products (id, name) VALUES (1, 'Wheel');

#Exit postgress client
\q

#Exit container
exit

#Create a new container that it's linked 
docker run -it --rm --link mypostgres:postgresdb --name postgres_client postgres sh

#Connect to the database
psql -h postgresdb -U postgres mydb

#Launch a query
SELECT * FROM products;

#Docker ps form other terminal. You'll see you have two containers (mypostgress and mypostgress_client)
docker ps

#Exit postgress client
\q

#Exit container
exit

#Check your containers with docker ps again (mypostgress_client disappeared)
docker ps

#Delete mypostgres container
docker rm -f mypostgres

#Delete the volume
docker volume rm postgres-data

El inicio del script es exactamente igual que el de ayer. Sin embargo, el segundo contenedor que creo hoy tiene los siguiente parámetros:

  • -it: en los procesos que son interactivos se utiliza este parámetro para asociar el terminal en el que estamos ejecutando los comandos con el terminal que se ejecutará en el contenedor. De esta manera podemos interactuar con el contenedor desde el host.
  • –rm: Es una manera muy elegante de eliminar un contenedor que sólo estás usando puntualmente, en este caso para conectarte a una base de datos. Lo que estamos diciendo es que cuando la ejecución del terminal finalice en el contenedor este será eliminado.
  • –link: a través de este parámetro conseguimos comunicar de forma segura nuestros dos contenedores. mypostgres es el nombre del primer contenedor que has creado y postgresdb es cómo quiero llamarlo dentro de mi nuevo contenedor.
  • –name postgres client: el nombre que tendrá el contenedor que voy a generar con este comando.
  • postgres: la imagen que quiero usar para el contenedor.
  • sh: el comando que voy a ejecutar una vez se cree y ejecute el contendor. En este caso sh, que es para ejecutar una shell.

Una vez que el contenedor esté creado, y esté lanzado un terminal dentro del mismo, ejecuto las acciones que necesite, en este caso una SELECT. En el momento que lance el comando exit el contenedor se eliminará por completo, gracias a la opción –rm. Por último, elimino el contenedor que tiene asociada la base de datos y el volumen donde se está almacenando la misma, como ya te expliqué ayer. Aquí encontrarás más información sobre el comando docker run.

Imagen de portada por kyohei ito.

¡Saludos!