Comment accéder au serveur Web de Docker Container depuis l’hôte

Je cours sous boot2docker 1.3.1.

J’ai un conteneur Docker exécutant un serveur Web via uwsgi --http :8080 .

Si je me connecte au conteneur, je peux naviguer sur le site Web avec lynx http://127.0.0.1:8080 donc je sais que le serveur fonctionne.

J’ai couru mon conteneur avec:

 $ docker run -itP --expose 8080 uwsgi_app:0.2 

Il a les détails suivants:

 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5248ad86596d uwsgi_app:0.2 "bash" 11 minutes ago Up 11 minutes 0.0.0.0:49159->8080/tcp cocky_hypatia $ docker inspect --format '{{ .NetworkSettings.IPAddress }}' 5248ad86596d 172.17.0.107 

Je pensais pouvoir accéder à ce site Web à partir de mon hôte en allant sur http://172.17.0.107:49159 .

Cela ne fonctionne pas. Je vois juste “se connecter …” dans Chrome, pour aller nulle part.

Qu’est-ce que je fais mal?

Extension de la réponse d’ boot2docker : boot2docker est l’ancienne application pour Mac et Windows, docker-machine est la nouvelle.

Tout d’abord, listez vos machines:

 $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM default * virtualbox Running tcp://192.168.99.100:2376 

Ensuite, sélectionnez l’une des machines (celle par default s’appelle default ) et:

 $ docker-machine ip default 192.168.99.100 

Ok, stupide moi, j’ai trouvé la réponse dans les docs pour boot2docker https://docs.docker.com/installation/mac/#container-port-redirection

J’avais besoin d’utiliser l’adresse IP du boot2docker vm, plutôt que l’adresse IP du conteneur, c’est-à-dire

 $ boot2docker ip 192.168.59.103 

et je suis en mesure de parcourir mon site à partir de l’hôte à l’ http://192.168.59.103:49159/

Je n’ai pas besoin d’append de route sur l’hôte

Pour trouver l’adresse IP de votre conteneur, vous n’avez pas besoin d’ installer d’autres installations :

 docker inspect  

Cela fournit une mine d’informations. grep pour l’adresse IP.

Vous pouvez utiliser l’option de mappage de port boot2docker -L, comme décrit ici .

Donc, dans votre cas, ce serait

 boot2docker ssh -L 0.0.0.0:8080:localhost:8080 

et alors

 docker run -it -p 8080:8080 uwsgi_app:0.2 

De cette manière, vous n’avez pas besoin d’utiliser l’adresse IP de boot2docker: vous pouvez utiliser localhost ou votre propre adresse IP (et votre conteneur de docker est accessible depuis l’extérieur).

[EDIT: la version originale ignorait le -P en question]

Si vous souhaitez accéder aux conteneurs sans avoir à “publier” le port (ce qui modifie son numéro), il y a un bon parcours ici .

La clé est cette ligne:

 sudo route -n add 172.17.0.0/16 172.16.0.11 

qui indique au Mac comment acheminer vers le réseau privé à l’intérieur de la machine virtuelle VirtualBox sur laquelle se trouvent les conteneurs Docker.

Avait le même problème et dans mon cas, j’utilisais l’instance AWS EC2. J’essayais avec le conteneur IP qui ne fonctionnait pas. Ensuite, j’ai utilisé l’adresse IP publique de l’hôte AWS en tant qu’IP, qui fonctionnait.

Boot2docker est obsolète, mais vous pouvez toujours avoir ce problème sur Docker pour Windows ou Mac, même si le même conteneur fonctionne sous Linux. Un symptôme est que le fait d’essayer d’accéder à une page sur le serveur à l’intérieur du conteneur donne l’erreur “n’a pas envoyé de données” par opposition à “impossible de se connecter”.

Si c’est le cas, c’est peut-être parce que sur Win / Mac, l’ hôte du conteneur a sa propre adresse IP , ce n’est pas localhost car il est sous Linux. Essayez de lancer Django sur IP 0.0.0.0, ce qui signifie accepter les connexions de toutes les IP, comme ceci:

 python manage.py runserver 0.0.0.0:8000 

Sinon, si vous devez vous assurer que le serveur ne répond qu’aux requêtes locales (telles que celles de votre proxy local comme nginx, apache ou gunicorn), vous pouvez utiliser l’IP d’hôte renvoyée par hostname -i .

Et assurez-vous que vous utilisez l’ option de transfert de port -p correctement dans la commande d’ docker run .

En supposant que tout va bien, vous devriez pouvoir accéder à votre serveur à l’ adresse http: // localhost dans un navigateur exécuté sur la machine hôte.

Comment résoudre le problème sur l’hébergement de l’application sur le navigateur hôte local

Pour ce lancement, le conteneur avec la commande ci-dessous, dans mon cas c’était:

 [root@centoslab3 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1b81d8a0e3e1 centos:baseweb "/bin/bash" 8 minutes ago Exited (0) 24 seconds ago webtest [root@centoslab3 ~]# docker run --name=atul -v /root/dockertest:/var/www/html -i -t -p 5000:8000 centos:baseweb /bin/bash 

Dans la configuration httpd:

 [root@adb28b08c9ed /]# cd /etc/httpd/conf [root@adb28b08c9ed conf]# ll total 52 -rw-r--r--. 1 root root 34419 Sep 19 15:16 httpd.conf 

éditez le fichier avec le port 8000 dans listner et mettez à jour le conteneur ip et le port sous Servername.

Redémarrez le service httpd et vous avez terminé.

J’espère que cela t’aides