Ich bin mir nicht sicher, ob ich hier etwas falsch verstanden habe, aber es sieht so aus, als ob es nur möglich ist, Port-Mappings zu setzen, indem man einen neuen Container aus einem Image erstellt. Gibt es eine Möglichkeit, einem vorhandenen Docker-Container ein Port-Mapping zuzuweisen?
Antworten
Zu viele Anzeigen?Ich bin auch an diesem Problem interessiert.
Wie @Thasmo erwähnt hat, können Portweiterleitungen NUR mit dem docker run
(und docker create
) Befehl angegeben werden.
Andere Befehle wie docker start
haben keine -p
Option und docker port
zeigt nur aktuelle Weiterleitungen an.
Um Portweiterleitungen hinzuzufügen, befolge ich immer diese Schritte:
-
Stoppe den laufenden Container
docker stop test01
-
Commite den Container
docker commit test01 test02
HINWEIS: Oben ist
test02
ein neues Image, das ich aus demtest01
Container erstelle. -
Führe das Image aus dem commiteten Image erneut aus
docker run -p 8080:8080 -td test02
Wo die erste 8080 der lokale Port und die zweite 8080 der Containerport ist.
Sie können das Port-Mapping ändern, indem Sie die Datei hostconfig.json
direkt bearbeiten unter /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
oder /var/snap/docker/common/var-lib-docker/containers/[hash_of_the_container]/hostconfig.json
, wenn Sie Docker als Snap installiert haben.
Sie können den [hash_of_the_container] über den Befehl docker inspect
bestimmen und der Wert des Feldes "Id" ist der Hash.
- Stoppen Sie den Container (
docker stop
). - Stoppen Sie den Docker-Dienst (nach Tacsiazumas Kommentar).
- Ändern Sie die Datei.
- Starten Sie Ihren Docker-Engine neu (um die Konfigurationscaches zu leeren).
- Starten Sie den Container (
docker start
).
Sie müssen also kein Image mit diesem Ansatz erstellen. Sie können auch das Neustart-Flag hier ändern.
P.S. Sie können https://docs.docker.com/engine/admin/ besuchen, um zu erfahren, wie Sie Ihre Docker-Engine gemäß Ihrer Host-Maschine korrekt neu starten. Ich habe sudo systemctl restart docker
verwendet, um meine Docker-Engine neu zu starten, die auf Ubuntu 16.04 läuft.
Wenn mit "bestehend" gemeint ist, dass es "läuft", dann ist es (derzeit) nicht möglich, eine Port-Zuordnung hinzuzufügen.
Sie können jedoch dynamisch eine neue Netzwerkschnittstelle mit z. B. Pipework hinzufügen, wenn Sie einen Dienst in einem laufenden Container freigeben müssen, ohne ihn zu stoppen/neuzustarten.
Das Bearbeiten von hostconfig.json scheint jetzt nicht zu funktionieren. Es endet nur damit, dass der Port freigegeben, aber nicht auf den Host veröffentlicht wird. Comitten und Neuerstellen der Container ist für mich nicht der beste Ansatz. Hat niemand docker network
erwähnt?
Die beste Lösung wäre die Verwendung eines Reverse-Proxys im selben Netzwerk
-
Erstellen Sie ein neues Netzwerk, wenn Ihr vorheriger Container in keinem benannten ist.
docker network create my_network
-
Fügen Sie Ihren bestehenden Container dem erstellten Netzwerk hinzu
docker network connect my_network my_existing_container
-
Starten Sie einen Reverse-Proxy-Dienst (z.B. nginx), der die benötigten Ports veröffentlicht, indem Sie demselben Netzwerk beitreten
docker run -d --name nginx --network my_network -p 9000:9000 nginx
Optional entfernen Sie die Datei default.conf in nginx
docker exec nginx rm /etc/nginx/conf.d/default.conf
-
Erstellen Sie eine neue nginx-Konfiguration
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; } }
Kopieren Sie die Konfiguration in den nginx-Container.
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
-
Starten Sie nginx neu
docker restart nginx
Vorteile: Zum Veröffentlichen neuer Ports können Sie den nginx-Container sicher stoppen/aktualisieren/neu erstellen, wie Sie möchten, ohne den Business-Container zu beeinträchtigen. Wenn Sie keine Ausfallzeit für nginx benötigen, ist es möglich, mehr Reverse-Proxy-Services demselben Netzwerk beizutreten. Außerdem kann ein Container mehreren Netzwerken beitreten.
Bearbeiten:
Um Non-HTTP-Dienste über Reverse-Proxy umzuleiten, ist die Konfigurationsdatei etwas anders. Hier ist ein einfaches Beispiel:
upstream my_service {
server my_existing_container:9000;
}
server {
listen 9000;
proxy_pass my_service;
}
In Fujimoto Youichi's example test01
is a container, whereas test02
is an image.
Before doing docker run
you can remove the original container and then assign the container the same name again:
$ docker stop container01
$ docker commit container01 image01
$ docker rm container01
$ docker run -d -P --name container01 image01
(Using -P
to expose ports to random ports rather than manually assigning).
- See previous answers
- Weitere Antworten anzeigen