Je travaille sur une architecture de services Web. Certains logiciels doivent être exécutés sur la machine hôte native, mais pas dans Vagrant. Mais je voudrais exécuter des services à la clientèle sur l'invité.
Le paramètre config.vm.forwarded_port
De Vagrant ouvrira un port sur l'hôte et enverra les données à l'invité. Mais comment puis-je ouvrir un port sur l'invité et envoyer les données à l'hôte? (Il s'agit toujours d'une redirection de port, mais en sens inverse.)
Quand vous courez vagrant ssh
, il utilise cette commande sous-jacente:
ssh -p 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=ERROR -o IdentitiesOnly=yes -i ~/.vagrant.d/insecure_private_key [email protected]
SSH prend en charge la redirection de ports dans la direction souhaitée avec le -R guestport:Host:hostport
option. Donc, si vous voulez vous connecter au port 12345
sur l'invité et le faire transférer à localhost:80
, vous utiliseriez cette commande:
ssh -p 2222 -R 12345:localhost:80 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=ERROR -o IdentitiesOnly=yes -i ~/.vagrant.d/insecure_private_key [email protected]
Comme Eero commente correctement, vous pouvez également utiliser la commande vagrant ssh -- -R 12345:localhost:80
, qui a le même effet dans une commande beaucoup plus concise.
Dans le livre Vagrant: Up and Running
(Date de publication: 12 juin 2013), écrit par le créateur de Vagrant, il a indiqué qu'il n'était pas possible pour la machine invitée d'accéder aux services s'exécutant sur la machine hôte.
À la place d'utiliser Forwarded Ports
, vous pouvez configurer un réseau privé en utilisant Host-Only Networks
.
Avantages d'utiliser Host-Only Networks
plus de Forwarded Ports
Les ordinateurs invités peuvent accéder aux services en cours d'exécution sur l'ordinateur hôte
Cette fonctionnalité résoudrait votre problème.
Les ordinateurs invités peuvent accéder aux services exécutés sur un autre ordinateur invité.
Cette fonctionnalité est très utile pour séparer les services sur plusieurs machines afin de reproduire avec plus de précision un environnement de production.
Garantir
Les ordinateurs externes n'ont aucun moyen d'accéder aux services exécutés sur les ordinateurs invités
Moins de travail
Pas besoin de configurer chaque Forwarded Port
Comment configurer Host-Only Networks
config.vm.network :"hostonly", "192.168.0.0"
# Vagrant Version # 1
config.vm.network :private_network, ip: "192.168.0.0"
# Vagrant Version # 2
Avoir cette ligne dans votre Vagrantfile
demandera à vagrant de créer un réseau privé ayant une adresse IP statique: 192.168.0.0
L'adresse IP de l'hôte est toujours la même adresse IP mais avec le dernier octet 1. Dans l'exemple précédent, la machine hôte aurait l'adresse IP 192.168.0.1
.
Vous pouvez accéder aux ports de la machine hôte via la passerelle par défaut à l'intérieur du système d'exploitation invité. (Qui a généralement une adresse IP de 10.0.2.2
.)
Par exemple, si un serveur Web s'exécute sur le port 8000 de votre ordinateur hôte ...
echo 'Hello, guest!' > hello
python -m SimpleHTTPServer 8000
Vous pouvez y accéder depuis le vagabond VM à 10.0.2.2:8000
(à condition de 10.0.2.2
est l'adresse IP de la passerelle par défaut de l'invité):
vagrant ssh
curl http://10.0.2.2:8000/hello # Outputs: Hello, guest!
Pour trouver l'adresse IP de la passerelle par défaut dans le système d'exploitation invité, exécutez netstat -rn
(ou ipconfig
sur un invité Windows) et recherchez la ligne avec une adresse IP de destination égale à 0.0.0.0
_ (ou le champ "Passerelle par défaut" sous Windows):
$ netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.33.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
Vous pouvez extraire cette adresse IP par programme avec netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2
.
Sources: Comment se connecter à l'hôte PostgreSQL à partir d'une machine virtuelle virtualisée vagabonde ; Connectez-vous à la machine hôte depuis un OS invité de VirtualBox?
Ajoutez ce qui suit à votre ~/.ssh/config
sur la machine hôte:
Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698
Il vous permet d’accéder à un service sur le port 52698 de la machine hôte depuis Vagrant, tant que vous vous êtes connecté via vagrant ssh
.
Vous pouvez confirmer que cela fonctionne en exécutant netstat -lt
sur vagrant VM et en prenant note des lignes suivantes:
tcp 0 0 localhost:52698 *:* LISTEN
tcp6 0 0 ip6-localhost:52698 [::]:* LISTEN
Je peux accéder aux services en cours d'exécution sur mon ordinateur hôte via son adresse IP locale (pas son adresse de bouclage). J'ai testé en créant un serveur http sur le port 80 (puis sur le port 987) et curl
ing 197.45.0.10:80 et 197.45.0.10:987 (l'adresse IP réelle a été modifiée pour protéger l'innocent). Cela a fonctionné les deux fois, et je n'ai pas de configuration vagabonde spéciale (pas de public_network, ni de forwarded_port) et, bien que certains ports soient transférés via PuTTY, les ports 80 et 987 ne sont pas transférés. Essayez donc d’utiliser l’adresse IP locale ou publique de la machine hôte.
Et si vous souhaitez accéder (en ssh à) une instance d'invité vagabond à une autre, vous pouvez activer public_network
ainsi que le transfert depuis le port 22 dans le Vagrantfile
comme ceci:
config.vm.network "public_network"
config.vm.network "forwarded_port", guest: 22, Host: 2200
Ensuite, tant que ce port est ouvert (c.-à-d. Que vous effectuez davantage de redirection de port dans la configuration de votre routeur), vous pouvez accéder à cette machine depuis n'importe où, même le monde extérieur.