Je ne sais pas si j'ai mal compris quelque chose ici, mais il semble qu'il ne soit possible de définir des mappages de ports qu'en créant un nouveau conteneur à partir d'une image. Existe-t-il un moyen d'affecter un mappage de port à un conteneur Docker existant?
docker
port
lxc
linux-containers
thasmo
la source
la source
Réponses:
Vous pouvez modifier le mappage de port en modifiant directement le
hostconfig.json
fichier à/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
Vous pouvez déterminer le [hash_of_the_container] via la
docker inspect <container_name>
commande et la valeur du champ "Id" est le hachage.Vous n'avez donc pas besoin de créer une image avec cette approche. Vous pouvez également modifier l'indicateur de redémarrage ici.
PS Vous pouvez visiter https://docs.docker.com/engine/admin/ pour savoir comment 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.04la source
hostconfig.json
etconfig.v2.json
de faire en sorte que cela fonctionne. Utilisez le lien fourni par @rohitmohta pour voir les détails.screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
Une fois que vous obtenez le tty en cours d'exécution, vous pouvez accédez à / var / lib / dockerJe suis également intéressé par ce problème.
Comme @Thasmo l'a mentionné, les transferts de port peuvent être spécifiés UNIQUEMENT avec la commande
docker run
(etdocker create
).Les autres commandes
docker start
n'ont pas d'-p
option etdocker port
n'affiche que les renvois en cours.Pour ajouter des transferts de port, je suis toujours ces étapes,
arrêter l' exécution du conteneur
valider le conteneur
REMARQUE: ce qui précède
test02
est une nouvelle image que je construis à partir dutest01
conteneur.re- initiée à partir de l'image commited
Où le premier 8080 est le port local et le second 8080 est le port à conteneurs.
la source
docker start
?Si par "existant" vous voulez dire "en cours d'exécution", 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 Pipework , si vous avez besoin d'exposer un service dans un conteneur en cours d'exécution sans l'arrêter / le redémarrer.
la source
Je ne sais pas si vous pouvez appliquer le mappage de port à un conteneur en cours d'exécution. Vous pouvez appliquer la redirection de port lors de l'exécution d'un conteneur qui est différent de la création d'un nouveau conteneur.
commencera à exécuter le conteneur. Ce didacticiel explique la redirection de port.
la source
docker run
crée et démarre un nouveau conteneur. C'est équivalent à fairedocker create
suivi dedocker start
.La modification de hostconfig.json ne semble pas fonctionner maintenant. Il se termine uniquement lorsque ce port est exposé mais pas publié sur l'hôte. Engager 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 un proxy inversé au sein du même réseau
Créez un nouveau réseau si votre conteneur précédent ne figure dans aucun conteneur nommé.
docker network create my_network
Joignez votre conteneur existant au réseau créé
docker network connect my_network my_existing_container
Démarrez un service proxy inversé (par exemple 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
Supprimez éventuellement le fichier default.conf dans nginx
docker exec nginx rm /etc/nginx/conf.d/default.conf
Créer une nouvelle configuration nginx
Copiez la configuration dans le conteneur nginx.
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
Redémarrez nginx
docker restart nginx
Avantages : Pour publier de nouveaux ports, vous pouvez arrêter / mettre à jour / recréer en toute sécurité le conteneur nginx comme vous le souhaitez sans toucher au conteneur métier. Si vous n'avez besoin d'aucun temps d'arrêt pour nginx, il est possible d'ajouter plus de services proxy inversés rejoignant le même réseau. En outre, un conteneur peut rejoindre plusieurs réseaux.
Éditer:
Pour inverser les services proxy non http, le fichier de configuration est un peu différent. Voici un exemple simple:
la source
Dans l'exemple de Fujimoto Youichi
test01
est un conteneur, tandistest02
qu'une image.Avant de le faire,
docker run
vous pouvez supprimer le conteneur d'origine, puis attribuer de nouveau le même nom au conteneur:(Utilisation
-P
pour exposer des ports à des ports aléatoires plutôt que de les attribuer manuellement).la source
Si vous l'exécutez
docker run <NAME>
, une nouvelle image apparaîtra, ce qui n'est probablement pas ce que vous voulez.Si vous souhaitez modifier une image actuelle, procédez comme suit:
docker ps -a
Prenez l'id de votre conteneur cible et accédez à:
Arrêtez le conteneur:
Changer les fichiers
Et changer de fichier
Redémarrez votre docker et cela devrait fonctionner.
la source
Si vous n'êtes pas à l'aise avec la configuration de profondeur Docker, IPtables serait votre ami.
C'est juste une astuce et non une manière recommandée, cela fonctionne avec mon scénario, car je ne pouvais pas arrêter le conteneur, j'espère qu'il vous aidera également.
la source
DOCKER_PORT
versMACHINE_PORT
, quelles parties doivent être modifiées?nous utilisons des outils pratiques comme ssh pour y parvenir facilement.
J'utilisais l'hôte ubuntu et l'image de docker basée sur ubuntu.
lorsqu'un nouveau port doit être tracé,
à l'intérieur du docker exécutez la commande suivante
172.17.0.1 était l'ip de l'interface docker (vous pouvez l'obtenir en exécutant
ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
sur l'hôte).ici, j'avais le port 8888 local mappé sur les hôtes 8888. vous pouvez changer le port si nécessaire.
si vous avez besoin d'un port supplémentaire, vous pouvez tuer le ssh et y ajouter une ligne de -R supplémentaire avec le nouveau port.
J'ai testé cela avec netcat.
la source
/var/lib/docker/containers/${container_id}
répertoire et modifiezhostconfig.json
PortBindings.HostPort
que vous souhaitez la modification.la source
Pour les utilisateurs Windows et Mac, il existe un autre moyen assez simple et convivial de modifier le port de mappage:
la source
Réponse courte: vous ne pouvez pas affecter un mappage de port à un conteneur Docker existant
Vous avez besoin d'un nouveau conteneur ... traitez-le.
la source
Si vous souhaitez simplement modifier le port du conteneur en cours d'exécution, vous devez:
tandis que:
la source
docker run
commande,NAME
est le nom de l'image à partir de laquelle exécuter un conteneur, tandis que dansdocker stop
leNAME
fait référence au nom du conteneur à arrêter.