Comment attribuer un mappage de port à un conteneur Docker existant?

Je ne suis pas sûr d'avoir mal compris quelque chose ici, mais il semble qu'il soit seulement possible de définir des correspondances port en créant un nouveau conteneur à partir d'une image. Est-il possible d'attribuer un mappage de port à un conteneur Docker?

244
demandé sur Peter Mortensen 2013-10-12 18:46:18

11 réponses

je suis également intéressé par ce problème.

comme @Thasmo mentionné, les transferts de ports ne peuvent être spécifiés qu'avec la commande docker run .

Les autres commandes, docker start n'ont pas l'option -p et docker port n'affiche que les annonces courantes.

pour ajouter port forwardings, je suis toujours ces étapes,

  1. arrêtez! conteneur en marche

    docker stop test01
    
  2. commit le contenant

    docker commit test01 test02
    

    NOTE: ci-dessus, test02 est une nouvelle image que je suis la construction de la test01 conteneur.

  3. re- exécuter de la commis image

    docker run -p 8080:8080 -td test02
    

où le premier 8080 est le port local et le second 8080 est le port à conteneurs.

298
répondu Fujimoto Youichi 2018-04-05 12:56:14

vous pouvez modifier le mappage du port en éditant directement le fichier hostconfig.json à /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json

vous pouvez déterminer le [hash_of_the_container] via la commande docker inspect <container_name> et la valeur du champ" Id " est le hash.

1) stop the container 
2) change the file
3) restart your docker engine (to flush/clear config caches)
4) start the container

donc vous n'avez pas besoin de créer une image avec cette approche. Vous pouvez également modifier le redémarrage drapeau ici.

P. S. Vous pouvez visiter https://docs.docker.com/engine/admin / pour apprendre à redémarrer correctement votre moteur docker selon votre machine hôte. J'ai utilisé sudo systemctl restart docker pour redémarrer mon moteur docker qui fonctionne sur Ubuntu 16.04

141
répondu holdfenytolvaj 2016-10-29 22:15:02

si par" existant "vous voulez dire" courant", alors il n'est pas (actuellement) possible d'ajouter un mappage de port.

vous pouvez, cependant , ajouter dynamiquement une nouvelle interface réseau avec par exemple tuyauteries , si vous avez besoin d'exposer un service dans un conteneur courant sans l'arrêter/redémarrer.

18
répondu jpetazzo 2013-10-17 02:34:33

pas sûr si vous pouvez appliquer le port cartographiant un conteneur en cours d'exécution. Vous pouvez appliquer port forwarding tout en exécutant un conteneur qui est différent de la création d'un nouveau conteneur.

$ docker run -p <public_port>:<private_port> -d <image>  

commencera à courir conteneur. ce tutoriel explique la redirection du port.

16
répondu rajalokan 2016-05-20 14:38:57

dans L'exemple de Fujimoto Youichi, test01 est un contenant, tandis que test02 est une image.

avant de faire docker run vous pouvez enlever le conteneur d'origine et puis attribuer le conteneur le même nom à nouveau:

$ docker stop container01
$ docker commit container01 image01
$ docker rm container01
$ docker run -d -P --name container01 image01

(utilisant -P pour exposer les ports à des ports aléatoires plutôt que d'assigner manuellement).

11
répondu Luca 2016-05-20 14:38:35

dans l'autre sens si vous n'êtes pas à l'aise avec la configuration de profondeur de Docker IPtables serait votre ami.

iptables -t nat -A DOCKER -p tcp --dport ${YOURPORT} -j DNAT --to-destination ${CONTAINERIP}:${YOURPORT}

iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source ${CONTAINERIP} --destination ${CONTAINERIP} --dport ${YOURPORT}

iptables -A DOCKER -j ACCEPT -p tcp --destination ${CONTAINERIP} --dport ${YOURPORT}

C'est juste un truc pas recommandé de cette façon cela fonctionne avec mon scénario parce que je n'ai pas pu arrêter le conteneur, j'espère vous aider aussi.

1
répondu Mansur Ali 2018-01-22 11:36:15

Édition hostconfig.json semble ne pas fonctionner maintenant. Il se termine seulement avec ce port étant exposé mais pas publié à l'hôte. Commettre et recréer des conteneurs n'est pas la meilleure approche pour moi. Personne n'a mentionné docker network ?

la meilleure solution serait d'utiliser le proxy inversé dans le même réseau

  1. dans tous les nommés.

    docker network create my_network

  2. Rejoindre votre conteneur existant à la création de réseau

    docker network connect my_network my_existing_container

  3. lancer un service de proxy inversé (par ex. nginx) publiant les ports dont vous avez besoin, rejoignant le même réseau

    docker run -d --name nginx --network my_network -p 9000:9000 nginx

    supprimer optionnellement le défaut .conf in nginx

    docker exec nginx rm /etc/nginx/conf.d/default.conf

  4. créer un nouveau NGINX config

    server
    {
        listen 9000;
    
        location / {
            proxy_pass http://my_existing_container:9000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
    }
    

    copier la configuration dans Nginx container.

    docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf

  5. Redémarrer nginx

    docker restart nginx

avantages : pour publier de nouveaux ports, vous pouvez en toute sécurité arrêter/mettre à jour/recréer nginx conteneur que vous le souhaitez sans avoir à toucher l'entreprise conteneur. Si vous avez besoin d'un temps d'arrêt zéro pour nginx, il est possible d'ajouter plus de services de proxy inversés rejoignant le même réseau. En outre, un conteneur peut rejoindre plus d'un réseau.

Edit:

pour inverser les services proxy non-http, le fichier de configuration est un peu différent. Voici un exemple simple:

upstream my_service {
    server my_existing_container:9000;
}

server {
    listen 9000;
    proxy_pass my_service;
}
1
répondu Sean C. 2018-03-08 04:00:59

comme complément de la réponse 151970920" de @Fujimoto-Youichi

vous pouvez également utiliser $ docker run -P CONTAINER pour cartographier les ports au hasard lors de la création de votre conteneur, mais soyez prudent avec la sécurité ascpect !

-P eq --publish-all : "Il publier tous les ports exposés à des ports aléatoires" ,

puis lancez docker inspect CONTAINER sur la cartographie des ports fin comme indiqué dans l'image ci-dessous :

. docker inspect for a rabbitmq container show all ports mapping

plus d'informations à propos de docker run -P dans docker run

0
répondu aitbahaa 2018-07-19 12:36:24

Je ne peux pas croire combien de mauvaises réponses dans une page. si vous faites "docker run", cela générera une nouvelle image.

si vous voulez changer une image courante faites ce qui suit

docker ps -a

prendre le numéro d'identification du conteneur et passer à

cd /var/lib/docker/containers/<conainerID><and then some:)>

arrêter le conteneur

   'docker stop <NAME>'

modifier les fichiers

vi config.v2.json

"Config": {
....
"ExposedPorts": {
"80/tcp": {},
"8888/tcp": {}
},
....
},
"NetworkSettings": {
....
"Ports": {
 "80/tcp": [
 {
 "HostIp": "",
 "HostPort": "80"
 }
 ],

et modifier le fichier

vi hostconfig.json

"PortBindings": {
 "80/tcp": [
 {
 "HostIp": "",
 "HostPort": "80"
 }
 ],
 "8888/tcp": [
 {
 "HostIp": "",
 "HostPort": "8888"
 }
 ]
 }

redémarrez votre docker et ça devrait marcher

-1
répondu docker-noob 2018-03-19 20:37:28

pour les utilisateurs de Windows & Mac, il existe maintenant une autre façon simple et conviviale de changer le port de mapping:

  1. téléchargez le kitematic

  2. aller à la page des paramètres du conteneur, sur l'onglet ports, vous pouvez modifier directement le port publié.

  3. redémarrer le conteneur

-3
répondu john 2017-02-23 11:06:23

si vous voulez simplement changer le port du conteneur courant, vous faites:

  1. arrêter le conteneur existant

    sudo docker NOM de l'arrêt

  2. redémarrez maintenant avec le nouveau port mapping

    sudo docker run-d-p 81: 80 nom

où:

"- d " à background / deamon le docker

"-p" activer le mappage de port

" 81 " port externe (exposé) que vous utilisez pour accéder à votre navigateur

"80" interne conteneur docker du port d'écoute

-8
répondu Vlad Gulin 2016-04-23 23:34:24