Запуск контейнера Docker, принимающего трафик от хоста
У меня есть следующая конфигурация:
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"]
Run-apache.sh script:
#!/bin/bash
rm -rf /run/httpd/* /tmp/httpd*
exec /usr/sbin/apachectl -D FOREGROUND
Затем я создаю изображение с помощью
sudo docker build --rm -t platzi/httpd .
то
sudo docker run -d -p 80:80 platzi/httpd
После этого, когда я пытаюсь запустить контейнер, принимающий соединения с хоста в порту 80, я получаю следующее:
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
Любая помощь?
Ответы
Ответ 1
Ошибка кажется довольно ясной:
FATA [0002] Ответ на ошибку от демона: не удается запустить контейнер 67ed31b50133adc7c745308058af3a6586a34ca9ac53299d721449dfa4996657: Ошибка при запуске прокси-сервера userland: прослушать tcp 0.0.0.0:80: bind: адрес уже используется
В нем говорится, что "адрес уже используется". Это означает, что что-то в вашей системе - вероятно, такой веб-сервер, как Apache, уже прослушивает порт 80. Вам нужно будет:
- остановить веб-сервер,
- выберите другой хост-порт в аргументе
-p
в docker run
или
- просто отпустите аргумент
-p
.
Поскольку Docker не может настроить запрошенную пересылку порта, он не запускает контейнер.
Параметры (a) и (b) позволят контейнеру связываться с портом 80 на вашем хосте. Это необходимо, только если вы хотите получить доступ к контейнеру откуда-то, кроме вашего хоста.
Опция (c) полезна, если вы хотите только получить доступ к контейнеру с узла докера, но не хотите, чтобы в противном случае выставляли контейнер в вашей локальной сети. В этом случае вы должны использовать IP-адрес контейнера, назначенный докере, который вы можете получить, запустив docker inspect
и просмотрев вывод или просто выполнив:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_id
Ответ 2
Это говорит, что порт 80 занят... запустите это, чтобы увидеть, кто использует порт 80
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
прокрутите в крайнее правое положение, чтобы увидеть неправильный PID процесса, содержащего порт 80... его PID 1380, поэтому давайте создадим список процессов, чтобы увидеть этот 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;
так разорвать, что обидеть процесс, чтобы освободить порт 80
sudo kill 1380 # if you know the pid ( 1380 for example )
__ или __
sudo fuser -k 80/tcp # just kill whatever pid is using port 80 tcp
Если после выполнения вышеуказанного все еще говорится "занято", то, вероятно, процесс, который вы убили, автоматически перезапустился, и в этом случае вам необходимо отключить его наблюдатель, однако вы можете пройтись по дереву процессов из вывода netstat, чтобы определить этот родительский процесс и уничтожить его. слишком
Ответ 3
Если вы работаете в Ubuntu, просто запустите
sudo /etc/init.d/apache2 stop
Затем перезагрузите ваш Docker Image
docker reload
Ответ 4
Я нашел так решение:
$ docker stop container_name
$ docker commit container_name image_name
$ docker rm container_name
тогда вы можете создать новый контейнер из изображения:
$ docker run -d -P --name container_name_the_same_or_new image_name
и сейчас работает.