Tuve que lidiar con este mismo problema y pude resolverlo sin detener ninguno de mis contenedores en ejecución. Esta es una solución actualizada a partir de febrero de 2016, utilizando Docker 1.9.1. De todos modos, esta respuesta es una versión detallada de la respuesta de @ ricardo-branco, pero en mayor profundidad para los nuevos usuarios.
En mi caso, quería conectarme temporalmente a MySQL que se ejecuta en un contenedor, y dado que otros contenedores de aplicaciones están vinculados a él, detener, reconfigurar y volver a ejecutar el contenedor de la base de datos no fue un iniciador.
Como me gustaría acceder a la base de datos MySQL externamente (desde Sequel Pro a través de túneles SSH), voy a usar el puerto 33306
en la máquina host. (No3306
, solo en caso de que se esté ejecutando una instancia externa de MySQL).
Aproximadamente una hora de ajuste de iptables resultó infructuoso, aunque:
Paso a paso, esto es lo que hice:
mkdir db-expose-33306
cd db-expose-33306
vim Dockerfile
Editar dockerfile
, colocando esto dentro:
# 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
Luego construye la imagen:
docker build -t your-namespace/db-expose-33306 .
Luego ejecútelo, vinculándolo a su contenedor en ejecución. (Use en -d
lugar de -rm
mantenerlo en segundo plano hasta que se detenga y elimine explícitamente. Solo quiero que se ejecute temporalmente en este caso).
docker run -it --rm --name=db-33306 --link the_live_db_container:db -p 33306:33306 your-namespace/db-expose-33306