web-dev-qa-db-fra.com

Comment publier des ports dans des fichiers Docker

Je dois mapper les ports de l'hôte sur les ports du conteneur. Je peux y parvenir en exécutant la commande "docker run" avec l’option -p. Comment y parvenir grâce à la Dockerfile? L’utilisation de ce qui suit donne un "deprecated error"

EXPOSE 80:8080

Sinon, comment puis-je rendre les ports exposés publics via le fichier docker?

21
user_mda

Tu ne peux pas. Quels ports sont publiés sur l'hôte de docker est strictement une décision qui devrait être prise par l'administrateur local, et non par l'image qu'ils essaient d'exécuter; ce serait (a) un problème de sécurité (hé, je viens d'ouvrir un accès ssh à votre système!) et (b) sujet à échec (mon conteneur de serveur Web ne peut pas se lier sur le port 80 car j'exécute déjà un serveur sur port 80).

Si vous souhaitez éviter les longues lignes de commande docker run, utilisez quelque chose comme docker-compose pour automatiser le processus. Vous pouvez ensuite passer docker-composer une configuration comme:

mywebserver:
  image: myname/mywebserver
  ports:
    - 80:8080

Ensuite, un simple docker-compose up démarrera votre conteneur avec le port de conteneur 8080 lié au port d’hôte 80.

Mise à jour 2017-03-11

En réponse au commentaire de Willa:

  • L'utilisation de docker-compose ne résoudra pas le problème de la collision de ports. Le problème des collisions de ports est une des raisons pour lesquelles les images ne devraient pas pouvoir spécifier les liaisons de ports de l'hôte. J'offrais simplement docker-compose comme alternative aux longues lignes de commande docker run avec plusieurs liaisons de ports. Le problème de collision de ports permettrait éventuellement à un conteneur d’effectuer une attaque par déni de service sur votre hôte: si, par exemple, un conteneur démarre et se lie au port 80 avant un serveur Apache sur votre hôte (ou dans un autre conteneur), vous venez de perdre votre service Web.

  • Concernant le problème de sécurité: Si une image était en mesure de spécifier des liaisons de port d'hôte, les conteneurs pourraient ouvrir l'accès à ce dernier à votre insu. Autoriser un utilisateur distant à accéder à un conteneur sur votre hôte vous ouvre la possibilité d'une compromission de l'hôte si les fonctionnalités d'espace de noms du noyau ne parviennent pas à isoler complètement le conteneur, et même si vous faites entièrement confiance à l'isolation, il vous ouvre la voie. problèmes juridiques potentiels si ce conteneur est utilisé à des fins illicites. Dans les deux cas, c'est une mauvaise idée.

21
larsks

Il y a une différence entre expose et publish .

Exposer signifie ouvrir le port côté conteneur, publier signifie l’ouvrir sur l’hôte Docker vers le monde extérieur.

Par exemple, si votre commande d'exécution de menu fixe avait -p 80: 8080 , elle expose le port 8080 sur le conteneur et le port de publication 80 sur l'hôte.

Vous ne pouvez vraiment exposer les ports dans le fichier Docker. Si vous voulez avoir la possibilité de les publier, vous devez utiliser l'option -P opting avec l'exécution du menu fixe. Ainsi:

docker run -P your_app
16
Michael

Ce que vous pouvez faire est de EXPOSE une liste de ports sur votre Dockerfile et d'exécuter plus tard la commande docker run -P your_app pour publier tous les ports exposés sur le fichier Docker

0
Fabián Bertetto