lunes, 12 de marzo de 2018

Docker (12) : Permitir que un contenedor (adminer) pueda ver la BD Postgres del Host

1. Introducción


En el post de instalación de Postgres, hemos instalado también adminer. A parte de tener un contenedor de Postgres, también tenemos instalado Postgres en el host. Queremos que adminer sea capaz de ver también al host.

La cosa no parece tan sencilla pues parece ser que docker crea una especie de red interna, a la cual pertenece el host, y se le asigna una IP propia de dicha red.

2. Permitir que Postgres también acepte peticiones que no procedan de  localhost


Para ello hay 2 ficheros de configuración que tenemos que tocar:

  • postgresql.conf
  • pg_hba.conf
Vamos a buscarlos, para ello nos vamos a directorio raiz con:

cd /

Y hacemos una busqueda 

sudo find . -name postgresql.conf -print

Y obtenemos en mi caso:

/opt/PostgreSQL/9.6/data/postgresql.conf


Lo edito, y veo que permite la conexión desde cualquier IP (parámetro '*' de listen_addresses):


listen_addresses = '*'  # what IP address(es) to listen on;
     # comma-separated list of addresses;
     # defaults to 'localhost'; use '*' for all
     # (change requires restart)
port = 5432    # (change requires restart)
max_connections = 100   # (change requires restart)

Por tanto en mi caso no hace falta tocar este fichero.

Buscamos de la misma maenera el pg_hba.conf, que se encuentra en /opt/PostgreSQL/9.6/data/pg_hba.conf  y lo editamos:

Y necesitamos tener una línea de este tipo que no esté comentada:

host all all 192.168.0.0/24 trust

!!!!!Pero no sabemos que red crea docker, ni las IPs!!!!!!

Dejamos el fichero abierto para averiguar que rango de IPs nos movemos. Y luego volveremos sobre él y le daremos el rango de IPs correcto.


3. Obtención del rango de IPs de la red interna docker


En stackoverflow nos ofrecen una magnífica explicación de como funciona la red interna de Docker.

Por onisión Dcoker corre con tipo de red "Bridge"

Sigamos sus pasos. En nuestro host abrimos una ventana de comandos y ejecutamos:

sudo ip addr show docker0

y nos muestra:


5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:43:b8:7d:dc brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever


Podemos ver que nos movemos en 172.17.0.1/16.

Si queremos corroborarlo, podemos hacerlo de 2 maneras:

3.1 La primera es descargar y ejecutar un contenedor Ubuntu (si tenenos al menos 1 GB libre de disco y tenenos ganas de esperar):


docker run --rm -it ubuntu:trusty bash -il

y despues de esta orden ya estamos dentro del contenedor ya que nos muestra en la pantalla:  root@c915fe020d5d:/#

ejecutamos:

ip addr show eth0

y nos sale:


15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

Con lo que ya tenemos confirmada nuestra red interna docker.

Si hacemos CONTROL +D, salimos del contenedor y se borra (debido a la opción --rm), pero no la imagen, que si vamos cortos de disco la podemos borrar

Ahora volvemos al editor y terminamos de modificar el fichero pg_hba.conf y la línea correcta es


host all all 172.17.0.1/16 trust


3.2 La segunda es arrancar adminer así:



docker run --name adminer -p 8080:8080 adminer

y desde una nueva pantalla de comandos teclear 

docker container inspect adminer

y nos muestra su ip

 "Gateway": "172.17.0.1",

    "IPAddress": "172.17.0.2",

Con lo que por 2 maneras distintas hemos visto la subred interna.

Entramos en un explorador con localhost:8080 y probamos:




Y no nos deja, ya que todavía no ha leido el parámetro de configuración. 

Si entramos en el administrador "oficial" de Postgres (pfAdmin 4) y le pinchamos a server con el raton y con el botón derecho le damos a "Reload Configuration"



También se puede recargar de esta manera, primero vemos los servicios en marcha:

service --status-all

y nos muestra entre otros los siguiente servicios que mostramos solo uno pocos:


 [ - ]  postgresql-9.6
 [ - ]  pppd-dns
 [ + ]  procps
 [ + ]  qemu-kvm

y ahora ejecutamos:

sudo service postgresql-9.6 reload

ya podemos ver a nuestro postgres en marcha con admirer.








No hay comentarios :

Publicar un comentario