connexion du conteneur Docker à l'hôte Docker

10

J'ai une configuration où j'exécute toutes les parties de mon site Web dans des conteneurs Docker. Mon nginx qui écoute sur les ports 80 et 443 s'exécute dans un conteneur.

363292a98545        scivm/nginx-django-scivmcom:latest   /usr/bin/supervisord   12 days ago         Ghost               0.0.0.0:40001->22/tcp, 88.198.57.112:443->443/tcp, 88.198.57.112:80->80/tcp     lonely_feynmann           

Je souhaite configurer un proxy pour un service dans un autre conteneur. Ce conteneur est lié au port 3000 sur l'hôte:

b38c8ef72d0a        mazzolino/strider-dind:latest        wrapdocker /usr/bin/   41 minutes ago      Up 41 minutes       0.0.0.0:3000->3000/tcp, 22/tcp, 27017/tcp                                       distracted_einstein      

Mes iptables sur l'hôte docker ressemblent à ceci:

root@Ubuntu-1204-precise-64-minimal /var/run # iptables -L
Chain INPUT (policy ACCEPT) target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:8000
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

De l'intérieur du conteneur, je ne peux pas me connecter au port 3000 sur la machine hôte en raison de la configuration iptables.

Je ne veux pas ouvrir le port 3000 sur Internet public.

Existe-t-il un moyen d'ouvrir un pont direct entre le conteneur et l'hôte sur le port 3000?

Ou dois-je modifier mes iptables pour accepter de la gamme ip docker?

user3133475
la source

Réponses:

5

Tout ce dont vous avez besoin est des capacités de liaison de Docker [obsolète]

Débarrassez-vous de toutes les choses compliquées que vous avez essayé de faire et commencez à utiliser des conteneurs nommés, puis reliez-les les uns aux autres.

Elias Probst
la source
J'ai jeté un coup d'œil aux capacités des liens Docker, mais si je comprends bien, cela pose quelques problèmes. 1. Si l'enfant est redémarré, il obtiendra une nouvelle adresse IP. Ensuite, tous les parents de cet enfant devraient également être redémarrés pour obtenir les nouveaux varilabes d'environnement. 2. Je dois ajouter une logique à mon application pour lire ces variables d'environnement afin d'établir des connexions.
user3133475
Un conteneur redémarré ( docker restart your_container) doit conserver son adresse IP. Seulement si vous exécutez un nouveau conteneur basé sur une image donnée, il obtiendra une nouvelle IP ( docker run -d image command).
Elias Probst
2
Cela était vrai, mais au moins à partir de docker 1.0, un "redémarrage de docker" donne au conteneur une nouvelle adresse IP. Il suffit de frapper cela dans certains scripts qui reposaient sur le comportement précédent de l'IP ne changeant pas.
jamshid
1
Bien que je pense que c'est probablement la bonne chose à faire pour le PO, je suis venu ici pour chercher une réponse à la question posée. c'est-à-dire comment se connecter à un service sur l'hôte.
mc0e
2

La réponse d'Elias est correcte, mais le lien est long et déroutant. Voici un résumé simple:

Tout d'abord, exécutez le conteneur auquel lier et nommez-le:

sudo docker run -d --name db training/postgres

Exécutez ensuite l'autre conteneur, en le liant au premier conteneur:

sudo docker run -d -P --name web --link db:db training/webapp python app.py

Le lien entre le premier conteneur et le deuxième conteneur est placé /etc/hosts. Vous pouvez donc l'utiliser comme un nom d'hôte. Par exemple:

sudo docker run --name web --link db:db training/webapp ping db
Ron Romero
la source