Tengo una ventana acoplable-componer fichero yaml como en la de abajo

version: '2'
services:
  nodejs:
    build:
      context: .
      dockerfile: DockerFile
    ports:
      - "4000:4000"
    links:
      - redis
    expose:
      - "6379"
  redis:
    build:
      context: .
      dockerfile: Dockerfile-redis

Mi objetivo es avanzar nodejs-127.0.0.1 puerto 6379 a la redis de host. Ya puedo hacer ping redis desde el nodejs máquina, pero los puertos no están asignados. Trató de exponer las opciones, pero ninguna posibilidad, ya sea.

InformationsquelleAutor z.a. | 2016-02-16

4 Comentarios

  1. 50

    Si quieres enlazar a la redis puerto de su nodejs contenedor que tendrá que exponer ese puerto en el redis contenedor:

    version: '2'
    services:
      nodejs:
        build:
          context: .
          dockerfile: DockerFile
        ports:
          - "4000:4000"
        links:
          - redis
    
      redis:
        build:
          context: .
          dockerfile: Dockerfile-redis
        expose:
          - "6379"
    

    La expose etiqueta le permitirá exponer los puertos sin publicarlos en la máquina host, pero van a estar expuestos a los contenedores de redes.

    https://docs.docker.com/compose/compose-file/#expose

    La ports etiqueta será la asignación de los puertos de host con el puerto de contenedores HOST:CONTENEDOR

    https://docs.docker.com/compose/compose-file/#ports

    • sí tengo esta parte, pero el problema es que cuando vaya para 127.0.0.1:6379 en el nodejs contenedor me sale un error. Estoy buscando una forma automatizada para el reenvío de puertos, básicamente.
    • Bien, esto es debido a que se ejecutan en diferentes equipos o contenedores. Podría usted comprobar si el uso de redis:6379 en lugar de 127.0.0.1:6379 el problema resuelve?
    • sí, eso funciona. necesito aprender el reenvío de puerto, aunque.
    • Me alegro de saber que ha funcionado 🙂
    • Voy a tratar de reenvío de puertos en el interior del huésped mediante netcat p. ej., unix.stackexchange.com/a/101906/55079
    • Gracias! redis:6379 instead of 127.0.0.1:6379 me ha ayudado mucho!
    • Es muy importante saber que el HOST:asignación de PUERTOS no funciona en modo de enjambre porque no 0.0.0.0 es utilizada como el huésped que significa que está disponible desde cualquier dirección

  2. 31

    Es importante señalar que todas las soluciones anteriores asignar el puerto a cada interfaz en su máquina. Esto es menos de lo deseable si usted tiene una dirección IP pública, o su máquina tiene una IP en una red grande. Su aplicación puede estar expuesto a una audiencia mucho más amplia de lo que esperaba.

    redis:
      build:
        context:
        dockerfile: Dockerfile-redis
        ports:
        - "127.0.0.1:3901:3901"
    

    127.0.0.1 es la dirección ip que se asigna al nombre de host localhost en su máquina. Así que ahora la aplicación sólo está expuesto a través de esa interfaz y desde 127.0.0.1 sólo es accesible a través de su máquina, no estás exponiendo sus contenedores a todo el mundo.

    La documentación explica esto y se puede encontrar aquí: https://docs.docker.com/compose/compose-file/#ports


    Nota: Si está usando una ventana acoplable para mac esto hará que el contenedor de escuchar en 127.0.0.1 en la ventana acoplable para Mac VM y no será accesible desde el localhost. Si recuerdo correctamente.

    • Kudo para la prevención en seguridad.
    • Es muy importante saber que el HOST:asignación de PUERTOS no funciona en modo de enjambre. Mejor que abrir el puerto es ‘exponer’ el puerto y, a continuación, conectarse a ella a través de la dirección de redis:3901 (esto sólo va a estar disponible para otros contenedores en la misma red)
    • ¿Sabe usted si hay una manera de especificar el puerto de host como un puerto efímero, pero que limitan sólo a 127.0.0.1? Traté de 127.0.0.1::6379, por ejemplo, (donde 6379 es el puerto de contenedores), pero no obtener los resultados esperados.
  3. 3

    Parece que los otros las respuestas aquí todo el mal entendido tu pregunta. Si entiendo correctamente, usted quiere hacer peticiones a localhost:6379 (el valor predeterminado para redis) y será transmitida, de forma automática, en el mismo puerto en su redis contenedor.

    https://unix.stackexchange.com/a/101906/38639 me ayudó a llegar a la respuesta correcta.

    Primer lugar, usted tendrá que instalar el nc comando en su imagen. En CentOS, este paquete es llamado nmap-ncat, así en el ejemplo a continuación, sólo tiene que sustituir esto con el paquete adecuado si usted está utilizando un sistema operativo diferente como base de la imagen.

    A continuación, tendrás que decirle a ejecutar un determinado comando cada vez que el contenedor de botas de seguridad. Usted puede hacer esto usando CMD.

    # Add this to your Dockerfile
    RUN yum install -y --setopt=skip_missing_names_on_install=False nmap-ncat
    COPY cmd.sh /usr/local/bin/cmd.sh
    RUN chmod +x /usr/local/bin/cmd.sh
    CMD ["/usr/local/bin/cmd.sh"]
    

    Por último, tendremos que configurar el reenvío de puertos en cmd.sh. He encontrado que nc, incluso con la -l y -k opciones, ocasionalmente terminar cuando una solicitud se ha completado, así que estoy usando un bucle while para asegurarse de que está siempre en funcionamiento.

    # cmd.sh
    #! /usr/bin/env bash
    
    while nc -l -p 6379 -k -c "nc redis 6379" || true; do true; done &
    
    tail -f /dev/null # Or any other command that never exits
    
  4. 1

    Si quieres acceder a redis desde el host (127.0.0.1), usted tiene que utilizar el ports comando.

    redis:
      build:
        context: .
        dockerfile: Dockerfile-redis
        ports:
        - "6379:6379"
    
    • que crea dependencia circular, lo cual tiene sentido. Ya tengo que en nodejs
    • Yo podría haber entendido mal lo que quieres, he actualizado mi post que ahora expone el 6379 para el anfitrión (y cualquier otra máquina en la red a menos que usted tiene un firewall).
    • hmm, que también no funciona, me temo. esto no es necesario para exponer el puerto a la nodejs contenedor. puertos: expone los puertos del host real de la máquina. Quiero mapa rdis 6379 puerto a la nodejs 6379 puerto.

Dejar respuesta

Please enter your comment!
Please enter your name here