Solución:
TL; DR
- Usar
172.17.0.0/16
como rango de direcciones IP, no172.17.0.0/32
. - 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 usodatabase
como nombre de host para conectarse a PostgreSQL. - Asegúrese de que PostgreSQL esté configurado para escuchar conexiones en todas las direcciones IP, no solo en
localhost
. Busque el escenariolisten_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