web-dev-qa-db-fra.com

Exécution d'un conteneur Docker qui accepte le trafic de l'hôte

J'ai la configuration suivante:
Dockerfile

FROM centos  
MAINTAINER Eduar Tua <[email protected]>  

RUN yum -y update && yum clean all
RUN yum -y install httpd && yum clean all
RUN echo "Apache works" >> /var/www/html/index.html

EXPOSE 80

ADD run-Apache.sh /run-Apache.sh
RUN chmod -v +x /run-Apache.sh

CMD ["/run-Apache.sh"]

Le script run-Apache.sh:

#!/bin/bash

rm -rf /run/httpd/* /tmp/httpd*

exec /usr/sbin/apachectl -D FOREGROUND

Ensuite, je construis l'image avec:

Sudo docker build --rm -t platzi/httpd .  

puis

Sudo docker run -d -p 80:80 platzi/httpd

Après cela, lorsque j'essaie d'exécuter le conteneur en acceptant les connexions de l'hôte dans le port 80, j'obtiens ceci:

67ed31b50133adc7c745308058af3a6586a34ca9ac53299d721449dfa4996657
FATA[0002] Error response from daemon: Cannot start container     67ed31b50133adc7c745308058af3a6586a34ca9ac53299d721449dfa4996657: Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use

De l'aide?

16
eduartua

L'erreur semble assez claire:

FATA [0002] Réponse d'erreur du démon: impossible de démarrer le conteneur 67ed31b50133adc7c745308058af3a6586a34ca9ac53299d721449dfa4996657: erreur de démarrage du proxy de l'espace utilisateur: écouter tcp 0.0.0.0:80: bind: adresse déjà utilisée

Il dit "adresse déjà utilisée". Cela signifie que quelque chose sur votre système - probablement un serveur Web comme Apache - écoute déjà sur le port 80. Vous devrez soit:

  • arrêtez le serveur web,
  • sélectionnez un autre port d'hôte dans le -p argument à docker run ou
  • déposez simplement le -p argument.

Étant donné que Docker ne peut pas configurer la redirection de port demandée, il ne démarre pas le conteneur.

Les options (a) et (b) permettront au conteneur de se lier au port 80 sur votre hôte. Cela n'est nécessaire que si vous souhaitez accéder au conteneur depuis un emplacement autre que votre hôte.

L'option (c) est utile si vous souhaitez uniquement accéder au conteneur à partir de l'hôte Docker mais que vous ne souhaitez pas autrement exposer le conteneur sur votre réseau local. Dans ce cas, vous utiliseriez l'adresse IP du conteneur attribuée par docker, que vous pouvez obtenir en exécutant docker inspect et en parcourant la sortie, ou en exécutant simplement:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_id
15
larsks

Cela signifie que le port 80 est occupé ... exécutez ceci pour voir qui utilise le port 80

Sudo netstat -tlnp | grep 80

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1380/nginx -g daemo
tcp6       0      0 :::80                   :::*                    LISTEN      1380/nginx -g daemo

faites défiler à l'extrême droite pour voir le PID incriminé du processus contenant le port 80 ... son PID 1380 permet donc de faire une liste de processus pour voir ce pid

ps -eaf | grep 1380

root      1380     1  0 11:33 ?        00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;

donc démonter ce processus offensant pour libérer le port 80

Sudo kill 1380  # if you know the pid ( 1380 for example )

__ ou __

Sudo fuser -k 80/tcp #  just kill whatever pid is using port 80 tcp

Si après avoir fait ci-dessus, il dit toujours occupé, le processus que vous avez tué a probablement été relancé automatiquement, auquel cas vous devez supprimer son observateur, mais vous pouvez remonter l'arborescence des processus à partir de la sortie de netstat pour identifier ce processus parent et le tuer aussi.

21
Scott Stensland

Si vous utilisez Ubuntu, exécutez simplement

Sudo /etc/init.d/Apache2 stop

Rechargez ensuite votre image Docker

docker reload
9
Maurice Elagu

J'ai trouvé donc la solution:

$ docker stop container_name
$ docker commit container_name image_name
$ docker rm container_name

alors vous pouvez créer un nouveau conteneur à partir de l'image:

$ docker run -d -P --name container_name_the_same_or_new image_name

et fonctionne maintenant.

0
Kasia Kasia