web-dev-qa-db-fra.com

Docker: ports du conteneur MacOSX Expose sur la machine hôte

Dans mon travail, je travaille avec docker et l'option --net=Host fonctionne comme un charme qui transfère les ports du conteneur de docker vers la machine. Cela me permet d’ajouter des tâches Grunt utilisant certains ports par exemple:

  • Un taks pour servir mon rapport de couverture dans un port 9001
  • Une version déployée localement de mon application servie dans le port 9000
  • Une montre en direct recharger le port 35729
  • Pour les coureurs de tests unitaires, utilisez le port 9876

Quand j'ai commencé à utiliser Docker sur Mac, le premier problème que j'ai eu était: L'option --net=Host ne fonctionne plus. J'ai cherché et je comprends pourquoi cela n’est pas possible (Docker sur Mac fonctionne sur une propre machine virtuelle) et ma solution temporaire utilise l’option -p pour exposer les ports, mais cette limite me permet utiliser des ports parce que j’ai besoin d’exécuter la commande explicite -p pour chaque port que j’ai besoin d’exposer. 

Quelqu'un avec ce même problème? Comment gérer cela?

Votre problème est probablement que vous utilisez dockertoolbox ou dhingy/dlite ou toute autre solution fournissant un Linux à part entière VM, qui héberge ensuite docker pour exécuter votre conteneur à l'intérieur de cette machine virtuelle. Bien entendu, ce VM possède sa propre pile réseau et sa propre adresse IP sur l'hôte, et c'est à ce moment-là que vos outils auront des problèmes. Les ports exposés du conteneur ne sont pas exposés à OSX Host localhost, mais plutôt à OSX Docker-VM-ip.

Pour résoudre ces problèmes avec élégance

Exposer les ports à OSX localhost à partir du conteneur

  1. Commencez par utiliser/install docker-for-mac https://docs.docker.com/engine/installation/mac/ au lieu de dockertoolbox ou autres. Il est basé sur une pile xhyve spéciale qui réutilise la pile réseau de vos hôtes.
  2. quand vous faites maintenant docker run -p 3306:3306 percona, il liera 3306 sur le osx-Host-localhost, ainsi tout autre outil osx essayant de se lier à localhost: 3306 fonctionnera (très utile) exactement comme vous l’aviez utilisé lors de l’installation de mysql avec brew install mysql ou de la même manière.
  3. Si vous rencontrez des problèmes de performances avec les partages de code sous OSX avec des conteneurs Docker, vérifiez http://docker-sync.io - il est compatible avec Docker-for-Mac (indice: je suis biaisé sur celui-ci).

Exporter les ports de l'hôte OSX vers un conteneur

Vous n'exportez rien en particulier, vous les rendez plutôt accessibles dans leur ensemble à partir de tous les conteneurs (tous les ports de OSX-Host-localhost).

Si vous souhaitez attacher à un port que vous avez proposé sur l'hôte OSX, depuis un conteneur, par exemple. lors d'une session xdebug, votre IDE écoute sur le port 9000 sur l'hôte OSX-Host-localhost et le conteneur qui exécute FPM/PHP doit utiliser attacher à cet hôte osx-local: 9000 sur le mac, vous devez le faire: https://Gist.github.com/EugenMayer/3019516e5a3b3a01b6eac88190327e7c

Ainsi, vous créez une adresse IP de bouclage factice, de sorte que vous pouvez accéder à vos ports OSX-Host sans conteneurs en utilisant 10.254.254.254:9000 - ceci est portable et vous donne fondamentalement tout ce dont vous avez besoin pour développer comme vous avez l'habitude de le faire.


Donc, on vous donne la connectivité aux ports exposés par le conteneur pour les applications fonctionnant sur le Mac et essayant de se connecter à localhost: port

Et la seconde l’inverse, si quelque chose dans le conteneur veut s’attacher à un port de l’hôte.

5
Eugen Mayer

Une solution de contournement, mentionnée dans " Lier les ports de conteneur à l'hôte ", serait d'utiliser -P:

(ou --publish-all=true|false) à docker run est une opération généralisée qui identifie chaque port avec une ligne EXPOSE dans le champ Dockerfile ou --expose <port> de l’image et le mappe sur un port hôte dans une plage de ports éphémères.
La commande docker port doit ensuite être utilisée pour inspecter le mappage créé.

Ainsi, si votre application peut utiliser docker port <CONTAINER> pour récupérer le port mappé, vous pouvez ajouter autant de conteneurs que vous le souhaitez et obtenir les ports mappés de cette façon (sans avoir besoin d'une "commande explicite -p pour chaque port").

2
VonC

Pas sûr que docker pour mac puisse supporter une connexion bidirectionnelle ultérieurement https://forums.docker.com/t/will-docker-for-mac-support-bi-directional-connection-between-Host-and-container -in-the-future/19871

J'ai deux solutions:

  1. vous pouvez écrire un simple script wrapper et transmettre le port que vous souhaitez exposer au script
  2. utilisez vagrant pour démarrer une machine virtuelle avec un réseau sous contrôle.
1
xdays