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?
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:
-p
argument à docker run
ou-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
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.
Si vous utilisez Ubuntu, exécutez simplement
Sudo /etc/init.d/Apache2 stop
Rechargez ensuite votre image Docker
docker reload
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.