Ligação de erro do Docker: endereço já em uso

102

Quando executo docker-compose upno meu projeto Docker, ele falha com a seguinte mensagem:

Error starting userland proxy: listen tcp 0.0.0.0:3000: bind: address already in use

netstat -pna | grep 3000 mostra isso:

tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      -  

Já tentei docker-compose down, mas não adiantou.

Ngoral
fonte
7
Execute um sudo netstat -pna | grep 3000para obter o processo que está ouvindo.
BMitch de
2
Sua saída mostra que algum outro processo já está escutando na porta 3000. Você pode usar alguma outra porta? Tente sudover o nome do processo.
techtabu
Sim, não havia ntop nesta porta. Obrigado! Eu não sabia que sudoposso mudar a saída :)
Ngoral
Para mim é a porta 8888, que é docker proxy
Neil McGuigan
Corrigi o

Respostas:

100

No seu caso foi algum outro processo que estava utilizando a porta e conforme indicado nos comentários, sudo netstat -pna | grep 3000te ajudou a resolver o problema.

Enquanto em outros casos (eu mesmo já o encontrei muitas vezes), é principalmente o mesmo contêiner em execução em alguma outra instância. Nesse caso, docker psfoi muito útil, pois muitas vezes deixei os mesmos containers rodando em outros diretórios e depois tentei rodar novamente em outros lugares, onde os mesmos nomes de container foram usados.

Como docker psme ajudou: docker rm -f $(docker ps -aq) é um comando curto que uso para remover todos os containers.

Edit: Adicionado como docker psme ajudou.

Ayushya
fonte
3
Na verdade, tenho esse problema com frequência. E nada, mas docker-compose downajuda
Ngoral
Isso certamente ajudará, desde que você o esteja executando no mesmo diretório em que o executou docker-compose up. Embora eu recomende em minha resposta encontrar o contêiner que já está em execução e realizar a ação desejada. Achei apropriado removê-los, se alguém não quiser remover, então existe o rmuso stoppara pará-los.
Ayushya
1
Tenho outro servidor em execução na mesma porta em que a tensorflow/tensorflowimagem será executada. Como posso configurar minha imagem para rodar em outra porta. Já tentei isso: docker run -it -d -p 8888:8000 tensorflow/tensorflow vinculei a porta 8888 da minha imagem à 8000 no cliente, mas não funcionou.
Emanuel Fontelles
1
@EmanuelFontelles Ao tentar depurar, não use a -dopção. Agora, as portas estão expostas como HOST:CONTAINER. Portanto, você deve correrdocker run -it -p 8000:8888
Ayushya
67

Isso me ajudou:

docker-compose down  # Stop container on current dir if there is a docker-compose.yml
docker rm -fv $(docker ps -aq)  # Remove all containers
sudo lsof -i -P -n | grep <port number>  # List who's using the port

e então: kill -9 <process id>(macOS) ou sudo kill <process id>(Linux).

Fonte: comentário do usuário Rub21 .

Tomasz Bartkowiak
fonte
3
docker rm -fv $(docker ps -aq)esta linha era tudo que eu precisava. Obrigado
Ryan Walker
lsof funcionou muito bem, acabou com o processo e voltou à ação ....
Sr. E
13

Eu tive o mesmo problema, docker-compose down --rmi all(no mesmo diretório onde você executa docker-compose up) ajuda

UPD: CUIDADO - isso também excluirá as imagens da janela de encaixe locais que você puxou (do comentário )

Lytvoles
fonte
3
Sim, sempre ajuda, mas downé a última coisa que você geralmente quer fazer. Perder o estado atual não é um pedaço de açúcar.
Ngoral
3
Isso também excluirá as imagens do docker locais que você puxou, então use com cuidado
Micah Simmons
Você deveria ter mencionado que isso excluirá as imagens do docker locais na resposta.
Ahmed Nour Jamal El-Din,
8

Para Linux / Unix:

Pesquisa simples para o utilitário Linux usando o seguinte comando

netstat -nlp | grep 8888

Ele mostrará o processamento em execução nesta porta e, em seguida, elimine esse processo usando o PID (procure um PID na linha) desse processo.

kill PID
Neeraj Bansal
fonte
netstat mostra o PID / programa (por exemplo, 2714 / splunkd) .sudo kill 2714 funciona. Obrigado.
Roy
6

Eu tive o mesmo problema. Corrigi isso interrompendo o serviço Apache2 em meu host.

Fabien Thetis
fonte
esse era o meu problema também, esqueci que instalei o Apache
Mustapha-Belkacim
5

Em alguns casos, é fundamental realizar uma depuração mais aprofundada do problema antes de interromper um contêiner ou encerrar um processo.

Considere seguir a lista de verificação abaixo:

1) Verifique seu ambiente docker compose atual
Executar docker-compose ps.
Se a porta estiver em uso por outro contêiner, pare-a docker-compose stop <service-name-in-compose-file>ou remova-a substituindo stopporrm .

2) Verifique os contêineres em execução fora de seu espaço de trabalho atual
Executar docker pspara ver uma lista de todos os contêineres em execução em seu host.
Se você descobrir que a porta está sendo usada por outro contêiner, pode pará-la com docker stop <container-id>.
(*) Porque você não está no escopo do composeambiente de origem - é uma boa prática primeiro usar docker inspect para reunir mais informações sobre o contêiner que você está prestes a parar.

3) Verifique se a porta é usada por outros processos em execução no host.
Por exemplo, se a porta é 6379 executada:

$ sudo netstat -ltnp | grep ':6379'
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      915/redis-server 12 
tcp6       0      0 ::1:6379                :::*                    LISTEN      915/redis-server 12

(*) Você também pode usar o comando lsof, que é usado principalmente para recuperar informações sobre arquivos que são abertos por vários processos (sugiro que seja executado netstatantes disso).

Portanto, no caso da saída acima, o PIDé 915. Agora você pode executar:

$ ps j 915
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1   915   915   915 ?           -1 Ssl    123   0:11 /usr/bin/redis-server 127.0.0.1:6379

E veja o ID do processo pai ( PPID) e o comando de execução.
Você também pode executar:$ pstree -s <PID> para uma exibição visual do processo e seus processos relacionados.

Em nosso caso, podemos ver que o processo provavelmente é um daemon (PPID é 1) - Nesse caso, considere executar:
A) $ cat /proc/<PID>/statuspara obter informações mais detalhadas sobre o processo, como o número de threads gerados pelo processo, suas capacidades, etc '.
B) $ systemctl status <PID>para ver ounidade que ocasionou a criação de um processo específico. Se o serviço não for crítico - você pode parar e desabilitar o serviço .

4) Reinicie o serviço Docker
Executar:sudo service docker restart .

5) Você alcançou este ponto e ...
Somente se não estiver colocando seu sistema em risco - considere reiniciar o servidor.

RtmY
fonte
4

No meu caso foi

Erro ao iniciar o proxy do ambiente de usuário: ouvir tcp 0.0.0.0:9000: vincular: endereço já em uso

E tudo que eu preciso é desligar a escuta de depuração na tempestade de php ícone

user3724832
fonte
3

Eu estava recebendo o erro abaixo quando estava tentando iniciar um novo conatier- listen tcp 0.0.0.0:8080: bind: address already in use.

Solução: netstat -tulnp | grep 8080

[[email protected] (aws_main) ~] # netstat -tulnp | grep 8080 tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 12749 / java [[email protected] (aws_main) ~] #

matar -9 12749

Em seguida, tente reiniciar o contêiner, ele deve funcionar

Kripa Mishra
fonte
Spot on! sua solução ajudou.
Alferd Nobel de
2

Eu atualizei meu docker esta tarde e tive o mesmo problema. Tentei reiniciar o docker, mas não tive sorte.

Finalmente, tive que reiniciar meu computador e funcionou. Definitivamente um bug.

Charles Zhao
fonte
Reiniciar também ajudou para mim. Obrigado.
Alexander
1

Verifique docker-compose.yml, pode ser o caso de a porta ser especificada duas vezes.

version: '3'
services:
  registry:
    image: mysql:5.7
        ports:
      - "3306:3306"             <--- remove either this line or next
      - "127.0.0.1:3306:3306"
DmitrySandalov
fonte
0

Corri para o mesmo problema várias vezes. Reiniciar o docker parece funcionar

Arvind
fonte
Eu vejo como reiniciar um contêiner. Como reiniciar o docker?
Mark Wardell
0

Eu resolvo o problema reiniciando o Docker.

Mike Lin
fonte
0
docker-compose down --rmi all 

e então reinicie seu computador

Yusuf Kayikci
fonte
7
Ao responder a uma pergunta de três anos com oito outras respostas, é útil apontar qual novo aspecto da pergunta sua resposta aborda.
Jason Aller
0

Uma variação da resposta de @DmitrySandalov: eu tinha tomcat / java rodando no 8080, que precisava continuar. Olhei o arquivo docker-compose.yml e alterei a entrada de 8080 para outra de minha escolha.

nginx:
  build: nginx
  ports:
    #- '8080:80' <-- original entry
    - '8880:80'
    - '8443:443'

Funcionou perfeitamente. (O único problema é que a alteração será apagada se eu atualizar o projeto, já que ele vem de um repositório externo.)

SwingingFromTheTrees
fonte
0

Apenas uma observação se você tiver o mesmo problema e estiver com o Windows:

No meu caso, o processo do meu jeito é justo grafana-server.exe. Porque eu primeiro baixei a versão binária e cliquei duas vezes no executável, e agora ele começa como um serviço do usuário SYSTEMque eu não posso taskkill(sem permissão)

Tenho que ir ao "Service manager" do Windows e procurar o serviço "Grafana", e pará-lo. Depois disso, a porta 3000 não está mais ocupada.

Espero que ajude.

WesternGun
fonte
0

O que estava usando a porta 8888 era o Jupiter e tive que mudar o arquivo de configuração do notebook Jupiter para rodar em outra porta.

para listar quem está usando essa porta específica. sudo lsof -i -P -n | grep 9

Você pode especificar a porta que deseja que o Jupyter execute descomentando / editando a seguinte linha em ~ / .jupyter / jupyter_notebook_config.py:

c.NotebookApp.port = 9999

Caso você não tenha um jupyter_notebook_config.py tente executar o jupyter notebook --generate-config. Veja isto para mais detalhes sobre a configuração do Jupyter.

Oscar Rangel
fonte
0

Mudar network_mode: "bridge" para "host" fez isso por mim.

Isso com

version: '2.2'
services:
  bind:
    image: sameersbn/bind:latest
    dns: 127.0.0.1
    ports:
      - 172.17.42.1:53:53/udp
      - 172.17.42.1:10000:10000
    volumes:
        - "/srv/docker/bind:/data"
    environment:
      - 'ROOT_PASSWORD=secret'
    network_mode: "host"
noud
fonte
0

Antes de ser executado em: docker run -d --name oracle -p 1521: 1521 -p 5500: 5500 qa / oracle Acabei de alterar a porta para docker run -d --name oracle -p 1522: 1522 -p 5500: 5500 qa / oracle

Funcionou bem para mim !

Mahesh Keragute
fonte
0

Na minha máquina, um PID não estava sendo mostrado a partir deste comando netstat -tulpnpara a porta em uso (8080), então eu não pude eliminá-lo, matar os contêineres e reiniciar o computador não funcionou. Então o service docker restartcomando reiniciou o docker para mim (ubuntu) e a porta não estava mais em uso e eu sou um cara feliz e vou almoçar.

Jeremy
fonte
-1
`$` sudo service redis-server stop

Faz o truque.

Mlenge Fanuel
fonte
-1

talvez seja muito rude, mas funciona para mim. reinicie o próprio serviço docker

sudo service docker restart

espero que funcione para você também!

Khaerul Umam
fonte