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?
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,
-
arrêtez! conteneur en marche
docker stop test01
-
commit le contenant
docker commit test01 test02
NOTE: ci-dessus,
test02
est une nouvelle image que je suis la construction de latest01
conteneur. -
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.
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
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.
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.
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).
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.
É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
-
dans tous les nommés.
docker network create my_network
-
Rejoindre votre conteneur existant à la création de réseau
docker network connect my_network my_existing_container
-
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
-
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
-
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;
}
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 :
plus d'informations à propos de docker run -P
dans docker run
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
pour les utilisateurs de Windows & Mac, il existe maintenant une autre façon simple et conviviale de changer le port de mapping:
téléchargez le kitematic
aller à la page des paramètres du conteneur, sur l'onglet ports, vous pouvez modifier directement le port publié.
redémarrer le conteneur
si vous voulez simplement changer le port du conteneur courant, vous faites:
- arrêter le conteneur existant
sudo docker NOM de l'arrêt
- 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