Ich musste dieses gleiche Problem angehen und konnte es lösen, ohne einen meiner laufenden Container anzuhalten. Dies ist eine Lösung, die Stand Februar 2016 aktuell ist und Docker 1.9.1 verwendet. So, diese Antwort ist eine ausführlichere Version von @ricardo-branco's Antwort, jedoch detaillierter für neue Benutzer.
In meinem Szenario wollte ich vorübergehend auf MySQL zugreifen, das in einem Container läuft, und da andere Anwendungscontainer damit verknüpft sind, war es keine Option, den Datenbankcontainer anzuhalten, neu zu konfigurieren und neu zu starten.
Da ich auf die MySQL-Datenbank extern zugreifen möchte (von Sequel Pro über SSH-Tunneling), werde ich den Port 33306
auf der Host-Maschine verwenden. (Nicht 3306
, nur für den Fall, dass eine externe MySQL-Instanz läuft.)
Etwa eine Stunde des Feinabstimmens von iptables blieb erfolglos, obwohl:
Schritt für Schritt, hier ist was ich gemacht habe:
mkdir db-expose-33306
cd db-expose-33306
vim Dockerfile
Bearbeiten Sie die Datei dockerfile
und fügen Sie dies ein:
# Port 3306 im verknüpften Container "db" freigeben, um unter host:33306 erreichbar zu sein
FROM ubuntu:latest # (Empfohlen, die gleiche Basis wie der DB-Container zu verwenden)
RUN apt-get update && \
apt-get -y install socat && \
apt-get clean
USER nobody
EXPOSE 33306
CMD socat -dddd TCP-LISTEN:33306,reuseaddr,fork TCP:db:3306
Dann bauen Sie das Image:
docker build -t your-namespace/db-expose-33306 .
Führen Sie es dann aus, indem Sie es mit Ihrem laufenden Container verknüpfen. (Verwenden Sie -d
anstelle von -rm
, um es im Hintergrund zu halten, bis es ausdrücklich angehalten und entfernt wird. Ich möchte es nur vorübergehend in diesem Fall laufen lassen.)
docker run -it --rm --name=db-33306 --link the_live_db_container:db -p 33306:33306 your-namespace/db-expose-33306