Ho dovuto affrontare questo stesso problema e sono stato in grado di risolverlo senza arrestare nessuno dei miei contenitori in esecuzione. Questa è una soluzione aggiornata a febbraio 2016, utilizzando Docker 1.9.1. Comunque, questa risposta è una versione dettagliata della risposta di @ ricardo-branco, ma più in profondità per i nuovi utenti.
Nel mio scenario, volevo collegarmi temporaneamente a MySQL in esecuzione in un contenitore e poiché altri contenitori di applicazioni sono collegati ad esso, arrestare, riconfigurare e rieseguire il contenitore del database non è stato un inizio.
Dato che mi piacerebbe accedere al database MySQL esternamente (da Sequel Pro tramite tunneling SSH), userò la porta 33306
sul computer host. (Non3306
, nel caso in cui sia in esecuzione un'istanza di MySQL esterna.)
Circa un'ora di ottimizzazione di iptables si è rivelata inutile, anche se:
Passo dopo passo, ecco cosa ho fatto:
mkdir db-expose-33306
cd db-expose-33306
vim Dockerfile
Modifica dockerfile
, inserendo questo all'interno:
# 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
Quindi crea l'immagine:
docker build -t your-namespace/db-expose-33306 .
Quindi eseguirlo, collegandolo al contenitore in esecuzione. (Utilizzare -d
invece di -rm
mantenerlo in background fino a quando non viene esplicitamente arrestato e rimosso. In questo caso, lo voglio solo temporaneamente.)
docker run -it --rm --name=db-33306 --link the_live_db_container:db -p 33306:33306 your-namespace/db-expose-33306