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 33306
sur 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 -d
au lieu de -rm
pour 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