En utilisant ubuntu tusty, il existe un service fonctionnant sur une machine distante, auquel je peux accéder via la redirection de port via un tunnel ssh à partir de localhost:9999
.
J'ai un conteneur docker en cours d'exécution. J'ai besoin d'accéder à ce service distant via le tunnel de l'hôte, depuis le conteneur.
J'ai essayé de créer un tunnel depuis le conteneur vers l'hôte avec -L 9000:Host-ip:9999
, puis accéder au service via 127.0.0.1:9000
de l'intérieur du conteneur ne parvient pas à se connecter. Pour vérifier si le mappage de port était activé, j'ai essayé nc -luv -p 9999 # at Host nc -luv -p 9000 # at container
ceci, par. 2 mais il n'y avait pas de communication perçue, même en faisant nc -luv Host-ip -p 9000
au conteneur
J'ai également essayé de mapper les ports via docker run -p 9999:9000
, mais cela signale que la liaison a échoué car le port hôte est déjà utilisé (du tunnel hôte à la machine distante, probablement).
Donc mes questions sont
1 - Comment vais-je réaliser la connexion? Dois-je configurer un tunnel ssh vers l'hôte, ou cela peut-il être réalisé avec le mappage du port docker seul?
2 - Comment tester rapidement la connexion? Via bash, de préférence.
Merci.
Je pense que vous pouvez le faire en ajoutant --net=Host
à votre docker. Mais voyez aussi cette question: Transférer le port d'hôte vers le conteneur Docker
Utilisation de votre réseau d'hôtes comme réseau pour vos conteneurs via --net=Host
ou dans docker-compose via network_mode: Host
est une option mais cela a pour effet secondaire indésirable que (a) vous exposez maintenant les ports de conteneur dans votre système hôte et (b) que vous ne pouvez plus vous connecter à ces conteneurs qui ne sont pas mappés à votre réseau hôte.
Dans votre cas, une solution rapide et plus propre serait de rendre votre tunnel ssh "disponible" pour vos conteneurs docker (par exemple en liant ssh au docker0
bridge) au lieu d'exposer vos conteneurs Docker dans votre environnement Host (comme suggéré dans la réponse acceptée).
Configuration du tunnel:
Pour que cela fonctionne, récupérez l'ip de votre docker0
bridge utilise via:
ifconfig
vous verrez quelque chose comme ceci:
docker0 Link encap:Ethernet HWaddr 03:41:4a:26:b7:31
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
Maintenant, vous devez dire à ssh de se lier à cette adresse IP pour écouter le trafic dirigé vers le port 9000 via
ssh -L 172.17.0.1:9000:Host-ip:9999
Sans définir le bind_address, :9000
serait niquement disponible pour l'interface de bouclage de votre hôte et non en soi pour vos conteneurs Docker.
Remarque: vous pouvez également lier votre tunnel à 0.0.0.0
, ce qui fera ssh écouter toutes les interfaces.
Configuration de votre application:
Dans votre application conteneurisée, utilisez le même docker0
ip pour se connecter au serveur: 172.17.0.1:9000
. Le trafic est désormais acheminé via votre docker0
le pont atteindra également votre tunnel ssh :)
Par exemple, si vous avez une application "DOT.NET Core" qui doit se connecter à une base de données distante située à :9000
, votre "ConnectionString" contiendrait "server=172.17.0.1,9000;
.