web-dev-qa-db-fra.com

Docker compose le mappage de port

J'ai un fichier yml docker-composé comme ci-dessous

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

Mon objectif est de transférer le port 6379 de nodejs-127.0.0.1 à l'hôte Redis. Je peux déjà cingler des redis depuis la machine nodejs, mais les ports ne sont pas mappés. Essayé exposer les options, mais aucune chance non plus.

37
z.a.

Si vous souhaitez vous connecter au port redis à partir de votre conteneur nodejs, vous devez exposer ce port dans le conteneur redis:

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

  redis:
    build:
      context: .
      dockerfile: Dockerfile-redis
    expose:
      - "6379"

La balise expose vous permettra d’exposer des ports sans les publier sur la machine hôte, mais ils seront exposés aux réseaux de conteneurs.

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

La balise ports mappera le port de l'hôte avec le port du conteneur Hôte: CONTAINER

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

51
JesusTinoco

Il est important de noter que toutes les solutions ci-dessus mappent le port sur chaque interface de votre ordinateur. Cela n’est pas souhaitable si vous avez une adresse IP publique ou si votre machine a une adresse IP sur un grand réseau. Votre application peut être exposée à un public beaucoup plus large que celui que vous espériez.

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

127.0.0.1 est l'adresse IP correspondant au nom d'hôte localhost de votre ordinateur. Alors maintenant, votre application n’est exposée que sur cette interface et comme 127.0.0.1 n’est accessible que via votre ordinateur, vous n’exposez pas vos conteneurs au monde entier.

La documentation explique ceci davantage et peut être trouvée ici: https://docs.docker.com/compose/compose-file/#ports


Remarque: Si vous utilisez Docker pour mac, le conteneur écoutera le 127.0.0.1 sur Docker pour Mac VM et ne sera pas accessible à partir de votre hôte local. Si je me souviens bien.

34
Breedly

Il semble que les autres réponses ici ont toutes mal compris votre question. Si je comprends bien, vous souhaitez adresser des demandes à localhost: 6379 (la valeur par défaut pour redis) et les transférer automatiquement vers le même port sur votre conteneur redis.

https://unix.stackexchange.com/a/101906/38639 m'a aidé à trouver la bonne réponse.

Tout d'abord, vous devez installer la commande nc sur votre image. Sur CentOS, ce package s'appelle nmap-ncat. Dans l'exemple ci-dessous, remplacez-le simplement par le package approprié si vous utilisez un système d'exploitation différent comme image de base.

Ensuite, vous devrez lui dire de lancer une certaine commande à chaque démarrage du conteneur. Vous pouvez le faire en utilisant 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"]

Enfin, nous devrons configurer le transfert de port dans cmd.sh. J'ai trouvé que nc, même avec les options -l et -k, se terminait de temps en temps lorsqu'une demande est terminée. J'utilise donc une boucle while pour en assurer le fonctionnement permanent.

# 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
3
Isaac Betesh

Si vous souhaitez accéder à redis à partir de l'hôte (127.0.0.1), vous devez utiliser la commande ports.

redis:
  build:
    context: .
    dockerfile: Dockerfile-redis
    ports:
    - "6379:6379"
1
Anthon