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.
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
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.
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
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"