J'ai dû faire face à ce même problème et j'ai pu le résoudre sans arrêter aucun de mes conteneurs en cours d'exécution. Il s'agit d'une solution à jour en février 2016, utilisant Docker 1.9.1. Quoi qu'il en soit, cette réponse est une version détaillée de la réponse de @ ricardo-branco, mais plus en profondeur pour les nouveaux utilisateurs.
Dans mon scénario, je voulais me connecter temporairement à MySQL fonctionnant dans un conteneur, et puisque d'autres conteneurs d'application y sont liés, l'arrêt, la reconfiguration et la réexécution du conteneur de base de données n'étaient pas un démarreur.
Puisque je souhaite accéder à la base de données MySQL en externe (à partir de Sequel Pro via le tunneling SSH), je vais utiliser le port 33306sur la machine hôte. (Non 3306, juste au cas où une instance MySQL externe est en cours d'exécution.)
Environ une heure de peaufinage des iptables s'est avérée infructueuse, même si:
Étape par étape, voici ce que j'ai fait:
mkdir db-expose-33306
cd db-expose-33306
vim Dockerfile
Modifiez dockerfile, en plaçant ceci à l'intérieur:
# 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
Construisez ensuite l'image:
docker build -t your-namespace/db-expose-33306 .
Ensuite, exécutez-le, en vous liant à votre conteneur en cours d'exécution. (Utilisez -dau lieu de -rmpour le garder en arrière-plan jusqu'à ce qu'il soit explicitement arrêté et supprimé. Je veux seulement qu'il fonctionne temporairement dans ce cas.)
docker run -it --rm --name=db-33306 --link the_live_db_container:db -p 33306:33306 your-namespace/db-expose-33306