Ich musste mich mit demselben Problem befassen und konnte es lösen, ohne einen meiner laufenden Container anzuhalten. Dies ist eine Lösung, die ab Februar 2016 mit Docker 1.9.1 auf dem neuesten Stand ist. Wie auch immer, diese Antwort ist eine detaillierte Version der Antwort von @ ricardo-branco, aber für neue Benutzer ausführlicher.
In meinem Szenario wollte ich vorübergehend eine Verbindung zu MySQL herstellen, das in einem Container ausgeführt wird. Da andere Anwendungscontainer damit verknüpft sind, war das Stoppen, Neukonfigurieren und erneutes Ausführen des Datenbankcontainers kein Starter.
Da ich extern auf die MySQL-Datenbank zugreifen möchte (von Sequel Pro über SSH-Tunneling), werde ich den Port 33306
auf dem Host-Computer verwenden. (Nicht 3306
, nur für den Fall, dass eine äußere MySQL-Instanz ausgeführt wird.)
Ungefähr eine Stunde, in der Iptables optimiert wurden, erwies sich als erfolglos, obwohl:
Schritt für Schritt habe ich Folgendes getan:
mkdir db-expose-33306
cd db-expose-33306
vim Dockerfile
Bearbeiten dockerfile
, platzieren Sie dies in:
# Exposes port 3306 on linked "db" container, to be accessible at host:33306
FROM ubuntu:latest # (Recommended to use the same base as the DB container)
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 erstellen Sie das Bild:
docker build -t your-namespace/db-expose-33306 .
Führen Sie es dann aus und verknüpfen Sie es mit Ihrem laufenden Container. (Verwenden Sie -d
statt -rm
, um es im Hintergrund zu belassen, bis es explizit gestoppt und entfernt wird. Ich möchte, dass es in diesem Fall nur vorübergehend ausgeführt wird.)
docker run -it --rm --name=db-33306 --link the_live_db_container:db -p 33306:33306 your-namespace/db-expose-33306