Ошибка при запуске прокси пользовательского пространства: слушать tcp 0.0.0.0:80: привязка: адрес уже используется

Вопрос или проблема

При запуске docker у меня возникает проблема с портом:

ОШИБКА: для mmp_php_1 Не удалось запустить службу php: ошибка драйвера при программировании внешней подключаемости на конечной точке mmp_php_1 (80f0277f963830426b07e4ae461b8533864822fceb67263a78c27b4ae91d87f5): Ошибка при запуске прокси-пользователя: слушать tcp 0.0.0.0:80: привязка: адрес уже используется

ОШИБКА: для php Не удалось запустить службу php: ошибка драйвера при программировании внешней подключаемости на конечной точке mmp_php_1 (80f0277f963830426b07e4ae461b8533864822fceb67263a78c27b4ae91d87f5): Ошибка при запуске прокси-пользователя: слушать tcp 0.0.0.0:80: привязка: адрес уже используется
ОШИБКА: Обнаружены ошибки при поднятии проекта.

Затем я проверяю порты, и кажется, что что-то использует 80.

timothy@13-9360:~/Public/pub/mmp$ ps -eaf | grep 1380
root      1380     2  0 Nov04 ?        00:00:00 [hci0]
timothy  20779  9201  0 08:34 pts/18   00:00:00 grep --color=auto 1380
timothy@13-9360:~/Public/pub/mmp$ netstat -tlnp | grep 80
(Не все процессы могут быть идентифицированы, информация о не принадлежащих процессах
не будет показана, вам нужно быть root, чтобы увидеть все.)
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -               
tcp6       0      0 :::8080                 :::*                    LISTEN      -               
tcp6       0      0 :::80                   :::*                    LISTEN      - 

Как мне убить тот процесс, который здесь запущен, чтобы я мог снова использовать порт 80?

Мой локальный хост в данный момент является страницей приветствия apache, что странно, потому что я удалил apache с моего компьютера. Не знаю, почему это происходит.

sudo netstat -tlnp

Активные интернет-соединения (только серверы)
Протокол Recv-Q Send-Q Локальный адрес          Зарубежный адрес         Состояние       PID/Имя программы
tcp        0      0 0.0.0.0:58347           0.0.0.0:*               LISTEN      1029/rpc.mountd 
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      2591/vino-server
tcp        0      0 127.0.0.1:63342         0.0.0.0:*               LISTEN      16215/java      
tcp        0      0 0.0.0.0:44814           0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1019/rpcbind    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1089/nginx -g daemo
tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN      3036/dnsmasq    
tcp        0      0 0.0.0.0:46357           0.0.0.0:*               LISTEN      1029/rpc.mountd 
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      20431/cupsd     
tcp        0      0 127.0.0.1:29754         0.0.0.0:*               LISTEN      1268/vpnagentd  
tcp        0      0 0.0.0.0:17500           0.0.0.0:*               LISTEN      2696/dropbox    
tcp        0      0 127.0.0.1:6942          0.0.0.0:*               LISTEN      16215/java      
tcp        0      0 0.0.0.0:42622           0.0.0.0:*               LISTEN      1029/rpc.mountd 
tcp        0      0 127.0.0.1:17600         0.0.0.0:*               LISTEN      2696/dropbox    
tcp        0      0 0.0.0.0:2049            0.0.0.0:*               LISTEN      -               
tcp        0      0 127.0.0.1:17603         0.0.0.0:*               LISTEN      2696/dropbox    
tcp6       0      0 :::5672                 :::*                    LISTEN      18276/docker-proxy
tcp6       0      0 :::5900                 :::*                    LISTEN      2591/vino-server
tcp6       0      0 :::59533                :::*                    LISTEN      1029/rpc.mountd 
tcp6       0      0 :::42991                :::*                    LISTEN      1029/rpc.mountd 
tcp6       0      0 :::111                  :::*                    LISTEN      1019/rpcbind    
tcp6       0      0 :::8080                 :::*                    LISTEN      18412/docker-proxy
tcp6       0      0 :::80                   :::*                    LISTEN      1089/nginx -g daemo
tcp6       0      0 ::1:631                 :::*                    LISTEN      20431/cupsd     
tcp6       0      0 :::15672                :::*                    LISTEN      18260/docker-proxy
tcp6       0      0 :::47673                :::*                    LISTEN      1029/rpc.mountd 
tcp6       0      0 :::17500                :::*                    LISTEN      2696/dropbox    
tcp6       0      0 :::35324                :::*                    LISTEN      -               
tcp6       0      0 :::2049                 :::*                    LISTEN      -     

Разве я не должен был просто сменить порт, как вы говорили.

version: '3'
services:
  php:
    build: .
    volumes:
     - ./www:/var/www/html:delegated
     - ./configs:/configs
    links:
     - db:db
     - redis:redis
     - rabbit:rabbit
     - elasticsearch:elasticsearch
    ports:
     -  "80:80"
     -  "443:443"
    extra_hosts:
     -  "localhost.local:127.0.0.1"
    environment:
     - CONFIG__DEFAULT__CATALOG__SEARCH__ELASTICSEARCH_SERVER_HOSTNAME=elasticsearch
  db:
    image: mariadb
    environment:

У меня был аналогичный случай один раз.

Другой процесс был привязан к порту 80.

Мне нужно было найти виновника. Я использовал netstat, чтобы узнать, какой процесс использует порт 80.

Вам, возможно, потребуется установить пакет, который включает netstat: net-tools

sudo apt install net-tools -y

После установки netstat был установлен, и я продолжил с командой

sudo netstat -tlnp

Что я получил, было похоже на это :

Протокол Recv-Q Send-Q Локальный адрес          Зарубежный адрес         Состояние       PID/Имя программы

tcp6       0      0 :::80                   :::*                    LISTEN      4227/httpd

Итак, процесс httpd с ID 4227 использовал порт 80.
Я открыл htop, нажал F3, чтобы включить поиск, ввел httpd и обнаружил, что nextcloud (облачный сервер хранения файлов) был родительским процессом, использующим httpd (сервер веб-страниц).

Что делать дальше, однако, зависит от вас. Вы можете изменить порты, которые они используют, а затем перенаправить их внутрь. Или может просто удалить приложение, использующее этот порт, или временно отключить его.

Я собирался установить Docker, чтобы контейнеризировать свои существующие серверы/сервисы и т.д., поэтому я удалил snap Nextcloud и перезапустил Docker.

sudo snap remove nextcloud

Чтобы перезапустить docker, я изначально попытался sudo systemctl restart docker
но понял, что это не имя службы, потому что это был Snap docker.

Чтобы найти имя службы, мне нужно было просмотреть статусы systemctl:

sudo systemctl status | grep docker

и выяснить, что имя службы было snap.docker.dockerd.service

Чтобы перезапустить его, я использовал sudo systemctl restart snap.docker.dockerd.service

Затем я снова попытался выполнить свою команду docker, и ошибка исчезла.

Ответ или решение

Ошибка: Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use

При попытке запустить сервис в Docker, вы столкнулись с ошибкой, которая указывает на то, что порт 80 уже используется другим процессом. Это распространенное затруднение, которое может возникнуть по различным причинам, и требует тщательного анализа и устранения.

Анализ проблемы

Ошибка, которую вы получаете, подтверждает следующее:

ERROR: for mmp_php_1  Cannot start service php: driver failed programming external connectivity on endpoint mmp_php_1 (80f0277f963830426b07e4ae461b8533864822fceb67263a78c27b4ae91d87f5): Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use

Это сообщение указывает на то, что Docker не может привязать порт 80, так как он уже занят.

Шаги для решения проблемы

  1. Определение занятого порта:
    Используйте команду netstat для выяснения, какой процесс использует порт 80. Вам нужно будет выполнять команду с правами суперпользователя для получения полной информации о процессах. Выполните следующую команду:

    sudo netstat -tlnp | grep 80

    Вывод, который вы получили, показывает следующее:

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

    Это говорит о том, что nginx использует порт 80.

  2. Завершение процесса:
    Чтобы освободить порт, необходимо остановить процесс, который его использует. Вы можете сделать это с помощью команды kill, указав номер PID из вывода netstat. В вашем случае PID — это 1089:

    sudo kill 1089

    Если процесс не завершился, вы можете воспользоваться принудительным завершением:

    sudo kill -9 1089
  3. Проверка удаления:
    После завершения процесса повторите команду netstat, чтобы убедиться, что порт 80 теперь свободен.

  4. Перезапуск Docker:
    После освобождения порта попробуйте снова запустить вашу Docker-службу:

    docker-compose up
  5. Альтернативный подход — изменение порта:
    Если у вас есть необходимость использовать уже занятой порт, вы можете изменить конфигурацию вашего docker-compose.yml. Например, измените строку:

    ports:
     - "80:80"

    на

    ports:
     - "8080:80"

    Это перенаправит поток с порта 8080 вашего хоста на порт 80 внутри контейнера, что позволит избежать конфликта.

Дополнительные рекомендации

  • Мониторинг активных процессов: Если проблемы с конфликтацией портов возникают часто, полезно установить утилиты для мониторинга, такие как htop или glances, чтобы иметь возможность быстро идентифицировать и управлять работающими процессами.
  • Проверка настроек сервиса: Поскольку вы упомянули, что нигде не устанавливали Apache, убедитесь, что никакие старые конфигурации не остались на месте, что может создавать замешательство.

Следуя представленным шагам, вы сможете справиться с проблемой, связанной с занятым портом, и продолжить работу с Docker без дополнительных преград.

Оцените материал
Добавить комментарий

Капча загружается...