Creé un entorno de desarrollo de Rails siguiendo las instrucciones de https://docs.docker.com/compose/rails/

Funciona, pero no puedo conectarme al servidor Postgres desde la máquina host. Estoy ejecutando macOS High Sierra. Cuando ejecuto docker container ls veo 5432/tcp como el puerto para el contenedor de Postgres. Tenga en cuenta que no hay IP listada delante de 5432. Cuando ejecuto docker network inspect <postgress_container_ID> obtengo 172.18.0.2 como IP.

Pero cuando ejecuto psql -h 172.18.0.2 -p 5432 -U postgres obtengo

xpsql: could not connect to server: Operation timed out
  Is the server running on host "172.18.0.2" and accepting
  TCP/IP connections on port 5432?

¿Qué estoy haciendo mal?

2
Rayhan Muktader 22 ene. 2018 a las 19:10

3 respuestas

La mejor respuesta

Al mirar sus detalles 5432 / tcp , me parece que no ha exportado el número de puerto 5432 .

Si ha exportado el puerto, entonces debería verse así.

 0.0.0.0:5432->5432/tcp

Y luego, al usar la dirección IP de HOST (la IP de su máquina Mac local), debería poder conectarse, si aún no funciona, comparta su comando docker: ¿cómo está ejecutando el contenedor?

Docker componer archivo

version: '3'
services:
  db:
    image: postgres
    ports:
     - "5432:5432"
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/airbnb
    ports:
      - "3000:3000"
    depends_on:
      - db

En su archivo docker-compose, no está exponiendo el número de puerto 5432, por lo tanto, desde el exterior, no podrá conectar Postgres DB.

Intente agregar puertos: - "5432: 5432" en su archivo docker-compose. y luego, utilizando la dirección IP de su máquina, debería poder conectar la base de datos.

4
Rohan J Mohite 24 ene. 2018 a las 21:34

Por defecto, postgres expone el puerto 5432. Esto solo expondrá el puerto a otros contenedores dentro de la misma red Docker, es decir, a todos los otros contenedores en el archivo de composición. Esto se debe a que, de manera predeterminada, docker compose crea una red para todos los contenedores en el archivo de composición. .

Tiene algunas opciones para conectarse a un contenedor desde el host:

  1. Exponga el puerto con el formato HOST:CONTAINER que hará que el contenedor sea puerto disponible en HOST IP. Por ejemplo, use 127.0.0.1:5432 para que pueda acceder al puerto en esa dirección en su host.
  2. Utilice la puerta de enlace IP de la red Docker como la interfaz / dirección de origen. Por ejemplo, si el contenedor es 172.18.0.2, entonces es probable que la puerta de enlace sea 172.18.0.1. Por lo general, hay una manera de hacer esto con postgres y bibliotecas de socket, pero desafortunadamente no veo una manera de hacerlo con psql.
  3. Configure tablas de IP para que su host pueda acceder a la red Docker.

Otra opción es acceder desde un contenedor dentro de la red Docker. Puede hacer docker-compose run --rm db psql -h db -U postgres, que ejecutará un contenedor único con la misma imagen Docker que el contenedor db y dentro de la misma red.

2
six8 24 ene. 2018 a las 19:56

Use la IP de la VM donde Docker se está ejecutando realmente. Puede encontrar esta IP ejecutando:

docker-machine ip default
0
yamenk 22 ene. 2018 a las 16:19
48385824