it-swarm.com.de

Wie kann ich einem vorhandenen Docker-Container eine Portzuordnung zuweisen?

Ich bin mir nicht sicher, ob ich hier etwas missverstanden habe, aber es scheint nur möglich zu sein, Portzuordnungen festzulegen, indem Sie einen neuen Container aus einem Bild erstellen. Gibt es eine Möglichkeit, einem vorhandenen Docker-Container eine Portzuordnung zuzuweisen?

288
Thasmo

Ich interessiere mich auch für dieses Problem.

Wie @Thasmo erwähnt, können Portweiterleitungen NUR mit dem docker run-Befehl angegeben werden.
Andere Befehle, docker start hat keine -p-Option, und docker port zeigt nur die aktuellen Weiterleitungen an.

Um Portweiterleitungen hinzuzufügen, folge ich immer diesen Schritten:

  1. stop laufender Container

    docker stop test01
    
  2. Commit der Container

    docker commit test01 test02
    

    HINWEIS: Das obige test02 ist ein neues Bild, das ich aus dem test01-Container konstruiere.

  3. re - run aus dem zugesagten Bild

    docker run -p 8080:8080 -td test02
    

Der erste 8080 ist der lokale Port und der zweite 8080 der Containerport.

350

Sie können die Portzuordnung ändern, indem Sie die hostconfig.json-Datei direkt unter /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json bearbeiten.

Sie können den [hash_of_the_container] über den Befehl docker inspect <container_name> bestimmen und der Wert des Felds "Id" ist der Hash. 

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

Sie müssen also mit diesem Ansatz kein Bild erstellen. Sie können hier auch das Restart-Flag ändern.

P.S. Besuchen Sie https://docs.docker.com/engine/admin/ - , um zu erfahren, wie Sie die Docker-Engine ordnungsgemäß auf Ihrem Host-Computer neu starten. Ich habe Sudo systemctl restart docker verwendet, um meine Docker-Engine, die auf Ubuntu 16.04 ausgeführt wird, neu zu starten.

173
holdfenytolvaj

Wenn Sie mit "Vorhanden" "Ausführen" meinen, ist es (derzeit) nicht möglich, ein Port-Mapping hinzuzufügen.

Sie können jedoch dynamisch eine neue Netzwerkschnittstelle hinzufügen, z. Pipework , wenn Sie einen Dienst in einem laufenden Container verfügbar machen müssen, ohne ihn zu stoppen/neu zu starten.

22
jpetazzo

Nicht sicher, ob Sie einen aktiven Container mit der Portzuordnung anwenden können. Sie können die Portweiterleitung anwenden, während Sie einen Container ausführen, der sich vom Erstellen eines neuen Containers unterscheidet. 

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

startet den Container. Dieses Tutorial erklärt die Portumleitung. 

17
rajalokan

In Fujimoto Youichis Beispiel ist test01 ein Container, wohingegen test02 ein Bild ist.

Bevor Sie docker run ausführen, können Sie den Originalcontainer entfernen und dem Container dann denselben Namen zuweisen:

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

(Verwenden Sie -P, um Ports für zufällige Ports bereitzustellen, anstatt sie manuell zuzuweisen).

11
Luca

Die Bearbeitung von hostconfig.json scheint jetzt nicht zu funktionieren. Es endet nur damit, dass dieser Port verfügbar gemacht wird, aber nicht auf dem Host veröffentlicht wird. Das Festlegen und Wiederherstellen von Containern ist für mich nicht die beste Vorgehensweise. Niemand erwähnte docker network?

Die beste Lösung wäre die Verwendung eines umgekehrten Proxy in demselben Netzwerk.

  1. Erstellen Sie ein neues Netzwerk, wenn sich Ihr vorheriger Container nicht in einem der genannten Container befindet.

    docker network create my_network

  2. Verbinden Sie Ihren vorhandenen Container mit dem erstellten Netzwerk

    docker network connect my_network my_existing_container

  3. Starten Sie einen umgekehrten 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

    Entfernen Sie optional die 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 : Um neue Ports zu veröffentlichen, können Sie den Nginx-Container nach Belieben sicher anhalten/aktualisieren/neu erstellen, ohne den Geschäftscontainer zu berühren. Wenn Sie für nginx keine Ausfallzeit benötigen, können Sie weitere umgekehrte Proxy-Dienste hinzufügen, die demselben Netzwerk angehören. Außerdem kann ein Container mehreren Netzwerken beitreten.

Bearbeiten:

Um die Proxy-Nicht-HTTP-Dienste umzukehren, 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;
}
6
Sean C.

Wenn Sie docker run <NAME> ausführen, wird ein neues Bild erzeugt, das wahrscheinlich nicht das ist, was Sie möchten.

Wenn Sie ein aktuelles Bild ändern möchten, gehen Sie wie folgt vor:

docker ps -a

Nimm die ID deines Zielcontainers und gehe zu:

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

Stoppen Sie den Container:

docker stop <NAME>

Ändern Sie die Dateien

vi config.v2.json

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

Und Datei ändern 

vi hostconfig.json

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

Starten Sie Ihr Docker neu und es sollte funktionieren.

4
docker-noob

wir können nützliche Tools wie ssh verwenden, um dies leicht zu erreichen.

Ich habe Ubuntu-Host und Ubuntu-basierte Docker-Image verwendet.

  1. Innerhalb des Dockers ist der openssh-Client installiert.
  2. Außerhalb des Dockers (Host) ist der openssh-Server-Server installiert.

wenn ein neuer Port definiert werden muss,

führen Sie im Docker den folgenden Befehl aus

ssh -R8888:localhost:8888 <username>@172.17.0.1

172.17.0.1 war die IP der Docker-Schnittstelle (Sie können dies durch Ausführen von ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" " auf dem Host erhalten).

hier hatte ich einen lokalen 8888-Port, der dem Host 8888 zugeordnet wurde. Sie können den Port nach Bedarf ändern.

wenn Sie einen weiteren Port benötigen, können Sie die SSH beenden und eine weitere Zeile von -R mit dem neuen Port hinzufügen.

Ich habe das mit netcat getestet.

3
melchi
  1. Stoppen Sie die Docker-Engine und diesen Container.
  2. Gehe in das Verzeichnis /var/lib/docker/containers/${container_id} und bearbeite hostconfig.json
  3. Bearbeiten Sie PortBindings.HostPort, dass Sie die Änderung möchten.
  4. Starten Sie Docker Engine und Container.
1
ezileli

Wenn Sie sich nicht mit der Tiefenkonfiguration von Docker auskennen, wäre IPtables Ihr Freund.

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}

Dies ist nur ein Trick, der nicht empfohlen wird. Dies funktioniert mit meinem Szenario, weil ich den Container nicht stoppen kann. Ich hoffe, dass er Ihnen auch helfen wird.

1
Mansur Ali

Für Windows- und Mac-Benutzer gibt es jetzt eine weitere einfache und benutzerfreundliche Möglichkeit, den Mapping-Port zu ändern:

  1. lade die Kitematic herunter

  2. gehen Sie zur Einstellungsseite des Containers, auf der Registerkarte Ports können Sie den dort veröffentlichten Port direkt ändern.

  3. starten Sie den Container erneut

0
john

Als Ergänzung der Antwort von @ Fujimoto-Youichi

Sie können $ docker run -P CONTAINER auch verwenden, um beim Erstellen des Containers Ports nach dem Zufallsprinzip zuzuordnen.

-P eq an --publish-all: "Alle freigelegten Ports werden auf beliebigen Ports veröffentlicht",

führen Sie dann docker inspect CONTAINER aus, um das Port-Mapping wie in der folgenden Abbildung gezeigt zu finnen:

.  docker inspect for a rabbitmq container show all ports mapping

Lesen Sie mehr über docker run -P in docker run

0
aitbahaa