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?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).
Wenn Sie docker run
ausführen, wird ein neues Image erstellt, was wahrscheinlich nicht das ist, was Sie wollen.
Wenn Sie ein aktuelles Image ändern möchten, führen Sie folgende Schritte durch:
docker ps -a
Notieren Sie die ID des Zielcontainers und gehen Sie zu:
cd /var/lib/docker/containers/
Stoppen Sie den Container:
docker stop
Ändern Sie die Dateien
vi config.v2.json
"Config": {
....
"ExposedPorts": {
"80/tcp": {},
"8888/tcp": {}
},
....
},
"NetworkSettings": {
....
"Ports": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
Und ändern Sie die Datei
vi hostconfig.json
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
"8888/tcp": [
{
"HostIp": "",
"HostPort": "8888"
}
]
}
Starten Sie Ihr Docker neu und es sollte funktionieren.
Den HostPort eines Containers auf Docker Desktop (unter Windows 10 / MacOS) ändern
# alle Container auflisten
$ docker ps -a
$ docker stop docker101tutorial
# Mit grep die ID des Containers erhalten
$ docker inspect docker101tutorial | grep -i id
"Id": "sha256:fff0a4b22d6f3d2eb8d2748b8a8bbc9967ea87199988acee8e86ac70bce9c3eb",
# einfaches Ubuntu Docker-Image mit Shell ausführen und dessen Namespace in den Docker-Host ändern
# https://stackoverflow.com/questions/60408574/how-to-access-var-lib-docker-in-windows-10-docker-desktop/60411313#60411313
# https://forums.docker.com/t/the-location-of-images-in-docker-for-windows/19647/4
$ docker run -it --privileged --pid=host ubuntu nsenter -t 1 -m -u -i sh
# Wir möchten den Verzeichnispfad des Containers docker101tutorial herausfinden. Wir suchen nach:
# `"Image":"sha256:fff0a4b22d6f3d2eb8d2748b8a8bbc9967ea87199988acee8e86ac70bce9c3eb"`
# in /var/lib/docker/containers/*/config.v2.json
$ find /var/lib/docker/containers/ -name config.v2.json -exec grep -H fff0a4b22d {} \;
/var/lib/docker/containers/c1eda20b30f058bce9f8ece3b47a21641df5b399770e12ab57416a954d3c8bbf/config.v2.json
# bearbeiten
$ vi /var/lib/docker/containers/c1eda20b30f058bce9f8ece3b47a21641df5b399770e12ab57416a954d3c8bbf/hostconfig.json
- Drücken Sie
i
für den Einfügemodus. - Ändern Sie
"HostPort":"80"
in"HostPort":"8092"
- Drücken Sie
Escape
und schreiben Sie:wq
. Drücken SieEnter
. - Starten oder stoppen Sie jetzt
docker101tutorial
nicht. Andernfalls werden die Änderungen amHostPort
rückgängig gemacht. - Klicken Sie mit der rechten Maustaste auf das Docker Desktop-Symbol in der Taskleiste und wählen Sie Neustart.
- In der Liste der Container von Docker Desktop sehen Sie Ihren Container. Der angezeigte Port sollte sich auf
8092
ändern. - Starten Sie Ihren Container. Jetzt wird er auf Port
8092
Basierend auf der Antwort von @holdfenytolvaj.
Nicht sicher, ob Sie das Port-Mapping auf einen laufenden Container anwenden können. Sie können die Port-Weiterleitung anwenden, während ein Container läuft, was sich von der Erstellung eines neuen Containers unterscheidet.
$ docker run -p : -d
wird den Container starten. Dieses Tutorial erläutert die Portweiterleitung.
Wir können praktische Tools wie SSH verwenden, um dies einfach zu erreichen.
Ich habe den Ubuntu-Host und das auf Ubuntu basierende Docker-Image verwendet.
- Innerhalb des Docker ist openssh-client installiert.
- Außerhalb des Dockers (Host) ist der openssh-server installiert.
wenn ein neuer Port nach außen gemappt werden muss,
führen Sie innerhalb des Docker den folgenden Befehl aus
ssh -R8888:localhost:8888 @172.17.0.1
172.17.0.1 war die IP-Schnittstelle des Dockers (Sie können dies erhalten, indem Sie auf dem Host ausführen ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
).
hier habe ich den lokalen Port 8888 auf die Ports des Hosts zurückgemappt. Sie können den Port bei Bedarf ändern.
wenn Sie einen weiteren Port benötigen, können Sie das SSH beenden und eine weitere Zeile von -R damit mit dem neuen Port hinzufügen.
Ich habe dies mit Netcat getestet.