Saltar al contenido

Permitir que el contenedor de Docker se conecte a una base de datos de Postgres local / host

Solución:

TL; DR

  1. Usar 172.17.0.0/16 como rango de direcciones IP, no 172.17.0.0/32.
  2. No use localhost para conectarse a la base de datos PostgreSQL en su host, pero la IP del host en su lugar. Para mantener el contenedor portátil, inicie el contenedor con el --add-host=database:<host-ip> bandera y uso database como nombre de host para conectarse a PostgreSQL.
  3. Asegúrese de que PostgreSQL esté configurado para escuchar conexiones en todas las direcciones IP, no solo en localhost. Busque el escenario listen_addresses en el archivo de configuración de PostgreSQL, que normalmente se encuentra en /etc/postgresql/9.3/main/postgresql.conf (créditos a @DazmoNorton).

Versión larga

172.17.0.0/32 no es un distancia de direcciones IP, pero una sola dirección (a saber 172.17.0.0). Ningún contenedor Docker obtendrá esa dirección asignada, porque es la dirección de red del puente Docker (docker0) interfaz.

Cuando se inicie Docker, creará una nueva interfaz de red puente, que podrá ver fácilmente al llamar ip a:

$ ip a
...
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 scope global docker0
       valid_lft forever preferred_lft forever

Como puede ver, en mi caso, el docker0 la interfaz tiene la dirección IP 172.17.42.1 con una máscara de red de /16 (o 255.255.0.0). Esto significa que la dirección de red es 172.17.0.0/16.

La dirección IP se asigna aleatoriamente, pero sin ninguna configuración adicional, siempre estará en el 172.17.0.0/16 la red. Para cada contenedor de Docker, se asignará una dirección aleatoria de ese rango.

Esto significa que, si desea otorgar acceso desde todos los contenedores posibles a su base de datos, use 172.17.0.0/16.

Solución Docker para Mac

17.06 en adelante

Gracias al comentario de @Birchlabs, ahora es mucho más fácil con este nombre DNS especial solo para Mac disponible:

docker run -e DB_PORT=5432 -e DB_HOST=docker.for.mac.host.internal

Desde 17.12.0-cd-mac46, docker.for.mac.host.internal debe usarse en lugar de docker.for.mac.localhost. Consulte la nota de la versión para obtener más detalles.

Versión antigua

La respuesta de @helmbert explica bien el problema. Pero Docker para Mac no expone la red puente, por lo que tuve que hacer este truco para solucionar la limitación:

$ sudo ifconfig lo0 alias 10.200.10.1/24

Abierto /usr/local/var/postgres/pg_hba.conf y agregue esta línea:

host    all             all             10.200.10.1/24            trust

Abierto /usr/local/var/postgres/postgresql.conf y editar el cambio listen_addresses:

listen_addresses="*"

Recarga el servicio y lanza tu contenedor:

$ PGDATA=/usr/local/var/postgres pg_ctl reload
$ docker run -e DB_PORT=5432 -e DB_HOST=10.200.10.1 my_app 

Lo que hace esta solución es básicamente lo mismo con la respuesta de @ helmbert, pero usa una dirección IP que está adjunta a lo0 en lugar de docker0 interfaz de red.

Solución simple para mac:

La versión más reciente de Docker (18.03) ofrece una solución de reenvío de puertos incorporada. Dentro de su contenedor docker, simplemente establezca el host db en host.docker.internal. Esto se reenviará al host en el que se ejecuta el contenedor de la ventana acoplable.

La documentación para esto está aquí: https://docs.docker.com/docker-for-mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *