Transfert de port dans docker-machine?

Depuis que boot2docker est obsolète, je suis passé à docker-machine mais je ne sais pas comment ouvrir un port depuis docker-machine . Dans boot2docker je pourrais faire comme ceci:

 boot2docker ssh -L 27017:localhost:27017 

Cela ferait passer le port 27017 de VirtualBox à localhost 27017 tant que la connexion SSH est ouverte. Notez que je ne cherche pas un moyen d’ouvrir le port de manière permanente dans VirtualBox. Comment puis-je y parvenir avec docker-machine ?

Vous pouvez toujours accéder à la commande VBoxmanage.exe à partir de la VirtualBox utilisée par la machine Docker:

 VBoxManage controlvm "boot2docker-vm" natpf1 "tcp-port27017,tcp,,27017,,27017"; 
  • Utilisez les informations de docker-machine info pour obtenir le nom de votre vm.
  • utilisez modifyvm si la vm n’est pas encore démarrée.

Voir un exemple pratique dans cette réponse .


C’est la solution de contournement actuelle, en attendant la possibilité de transmettre l’argument à docker-machine ssh : voir numéro 691 .

L’autre solution consiste à ne pas transférer le port et à utiliser directement l’adresse IP de la machine virtuelle:

  $(docker-machine ip default) 

Comme commenté par sdc :

Vous pouvez confirmer que le transfert de port est configuré correctement avec

  VBoxManage showvminfo boot2docker-vm | grep "NIC.* Rule" 

Avec les versions récentes de la machine, vous pouvez simplement faire (où par défaut est le nom de la machine):

 docker-machine ssh default -L 27017:localhost:27017 

C’est une solution plus temporaire que le changement de configuration de la machine virtuelle.

Utilisez la variante suivante pour transférer uniquement les ports dans un processus en arrière-plan:

 docker-machine ssh default -f -N -L 27017:localhost:27017 
  • -f Demande à ssh d’aller en arrière-plan juste avant l’exécution de la commande.
  • -N Autoriser la commande vide (utile ici pour transférer des ports uniquement)

Vous pouvez insérer ssh dans la machine et transmettre les arguments de transfert de port habituels:

 ssh docker@$(docker-machine ip default) -L 27017:localhost:27017 

Le mot de passe de l’utilisateur docker est tcuser . (voir https://github.com/boot2docker/boot2docker )

Comme j’ai du mal à me souvenir comment faire, j’ai créé un petit script bash appelé pf (qui signifie “port forward”) qui vous permet de faire:

 $ pf 8080 

Cela transmettra le port docker 8080 au port hôte 8080 en arrière-plan (append -f pour le faire fonctionner au premier plan). Pour utiliser un autre port hôte, procédez comme suit:

 $ pf 8090:8080 

qui mappe le port hôte 8090 à 8080.

Pour arrêter l’ajout de redirection de port:

 $ pf 8090:8080 -s 

(en fait, le port hôte est suffisant: pf 8090 -s ). D’autres options sont également disponibles, alors consultez la page github .

Si vous ne voulez pas avoir besoin de mots de passe, j’appendais que vous devez simplement pointer sur la clé privée.

 ssh -L 8080:localhost:8080 -i ~/.docker/machine/machines/default/id_rsa docker@$(docker-machine ip default) 

Juste pour améliorer la réponse à @VonC dans le script – actuellement, si vous utilisez Docker Toolbox sur MacOS X, la machine VM par défaut est “default”. Donc, un script pour mapper tous les objects exposés depuis un conteneur devrait ressembler à ceci:

 for port in `docker port cassandra | cut -d'-' -f1`; do port_num=`echo ${port} | cut -d'/' -f1` port_type=`echo ${port} | cut -d'/' -f2` echo "Create rule natpf1 for ${port_type} port ${port_num}" VBoxManage controlvm "default" natpf1 "${port_type}-port${port_num},${port_type},,${port_num},,${port_num}" done 

Si vous essayez d’exécuter plusieurs fois, une déclaration avant la création doit être ajoutée pour supprimer la règle existante:

 VBoxManage controlvm "default" natpf1 delete "${port_type}-port${port_num}" 

Dans le script, cela suppose que vous avez déjà transféré les ports du conteneur vers la machine virtuelle.

 docker port cassandra 

donne une sortie comme:

 7000/tcp -> 0.0.0.0:7000