779 Stimmen

Wie weise ich einem vorhandenen Docker-Container eine Portzuordnung zu?

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?

689voto

Fujimoto Youichi Punkte 6789

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:

  1. Stoppe den laufenden Container

    docker stop test01
  2. Commite den Container

    docker commit test01 test02

    HINWEIS: Oben ist test02 ein neues Image, das ich aus dem test01 Container erstelle.

  3. 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.

515voto

holdfenytolvaj Punkte 5057

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.

  1. Stoppen Sie den Container (docker stop ).
  2. Stoppen Sie den Docker-Dienst (nach Tacsiazumas Kommentar).
  3. Ändern Sie die Datei.
  4. Starten Sie Ihren Docker-Engine neu (um die Konfigurationscaches zu leeren).
  5. 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.

80voto

jpetazzo Punkte 13872

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.

43voto

Sean C. Punkte 1355

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

  1. Erstellen Sie ein neues Netzwerk, wenn Ihr vorheriger Container in keinem benannten ist.

    docker network create my_network

  2. Fügen Sie Ihren bestehenden Container dem erstellten Netzwerk hinzu

    docker network connect my_network my_existing_container

  3. 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

  4. 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

  5. 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;
}

38voto

Luca Punkte 403

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).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X