Вопрос или проблема
При запуске 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, так как он уже занят.
Шаги для решения проблемы
-
Определение занятого порта:
Используйте команду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.
-
Завершение процесса:
Чтобы освободить порт, необходимо остановить процесс, который его использует. Вы можете сделать это с помощью командыkill
, указав номер PID из выводаnetstat
. В вашем случае PID — это 1089:sudo kill 1089
Если процесс не завершился, вы можете воспользоваться принудительным завершением:
sudo kill -9 1089
-
Проверка удаления:
После завершения процесса повторите командуnetstat
, чтобы убедиться, что порт 80 теперь свободен. -
Перезапуск Docker:
После освобождения порта попробуйте снова запустить вашу Docker-службу:docker-compose up
-
Альтернативный подход — изменение порта:
Если у вас есть необходимость использовать уже занятой порт, вы можете изменить конфигурацию вашегоdocker-compose.yml
. Например, измените строку:ports: - "80:80"
на
ports: - "8080:80"
Это перенаправит поток с порта 8080 вашего хоста на порт 80 внутри контейнера, что позволит избежать конфликта.
Дополнительные рекомендации
- Мониторинг активных процессов: Если проблемы с конфликтацией портов возникают часто, полезно установить утилиты для мониторинга, такие как
htop
илиglances
, чтобы иметь возможность быстро идентифицировать и управлять работающими процессами. - Проверка настроек сервиса: Поскольку вы упомянули, что нигде не устанавливали Apache, убедитесь, что никакие старые конфигурации не остались на месте, что может создавать замешательство.
Следуя представленным шагам, вы сможете справиться с проблемой, связанной с занятым портом, и продолжить работу с Docker без дополнительных преград.