Docker compose port mapping

后端 未结 4 1299
别跟我提以往
别跟我提以往 2020-12-13 01:56

I have a docker-compose yml file as in below

version: \'2\'
services:
  nodejs:
    build:
      context: .
      doc         


        
相关标签:
4条回答
  • 2020-12-13 02:11

    If you want to bind to the redis port from your nodejs container you will have to expose that port in the redis container:

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

    The expose tag will let you expose ports without publishing them to the host machine, but they will be exposed to the containers networks.

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

    The ports tag will be mapping the host port with the container port HOST:CONTAINER

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

    0 讨论(0)
  • 2020-12-13 02:13

    It seems like the other answers here all misunderstood your question. If I understand correctly, you want to make requests to localhost:6379 (the default for redis) and have them be forwarded, automatically, to the same port on your redis container.

    https://unix.stackexchange.com/a/101906/38639 helped me get to the right answer.

    First, you'll need to install the nc command on your image. On CentOS, this package is called nmap-ncat, so in the example below, just replace this with the appropriate package if you are using a different OS as your base image.

    Next, you'll need to tell it to run a certain command each time the container boots up. You can do this using 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"]
    

    Finally, we'll need to set up port-forwarding in cmd.sh. I found that nc, even with the -l and -k options, will occasionally terminate when a request is completed, so I'm using a while-loop to ensure that it's always running.

    # 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
    
    0 讨论(0)
  • 2020-12-13 02:17

    It's important to point out that all of the above solutions map the port to every interface on your machine. This is less than desirable if you have a public IP address, or your machine has an IP on a large network. Your application may be exposed to a much wider audience than you'd hoped.

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

    127.0.0.1 is the ip address that maps to the hostname localhost on your machine. So now your application is only exposed over that interface and since 127.0.0.1 is only accessible via your machine, you're not exposing your containers to the entire world.

    The documentation explains this further and can be found here: https://docs.docker.com/compose/compose-file/#ports


    Note: If you're using Docker for mac this will make the container listen on 127.0.0.1 on the Docker for Mac VM and will not be accessible from your localhost. If I recall correctly.

    0 讨论(0)
  • 2020-12-13 02:23

    If you want to access redis from the host (127.0.0.1), you have to use the ports command.

    redis:
      build:
        context: .
        dockerfile: Dockerfile-redis
        ports:
        - "6379:6379"
    
    0 讨论(0)
提交回复
热议问题