Запуск контейнера 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

и сейчас работает.