Docker 오류 바인딩 : 이미 사용중인 주소


94

docker-compose upDocker 프로젝트에서 실행 하면 다음 메시지와 함께 실패합니다.

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

netstat -pna | grep 3000 이것을 보여줍니다 :

tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      -  

나는 이미 시도 docker-compose down했지만 도움이되지 않습니다.


7
sudo netstat -pna | grep 3000듣고있는 프로세스를 얻으려면 a 를 실행하십시오 .
BMitch

2
출력은 다른 프로세스가 이미 포트 3000에서 수신하고 있음을 보여줍니다. 다른 포트를 사용할 수 있습니까? 함께 시도 sudo프로세스 이름을 볼 수 있습니다.
techtabu

네,이 포트에 ntop이있었습니다. 고맙습니다! 나는 몰랐다 sudo:) 출력을 변경할 수 있습니다
Ngoral

나에게는 고정 표시기의 프록시 포트 8888의
닐 맥기

이 답변에서 동일한 문제를 해결했습니다. stackoverflow.com/a/58772307/3530707
jmojico

답변:


92

귀하의 경우에는 포트를 사용하는 다른 프로세스였으며 의견에 표시된대로 sudo netstat -pna | grep 3000문제 해결에 도움이되었습니다.

다른 경우에는 (내가 여러 번 만났음) 대부분 다른 인스턴스에서 실행되는 동일한 컨테이너입니다. 이 경우 docker ps다른 디렉토리에서 동일한 컨테이너를 실행 한 다음 동일한 컨테이너 이름이 사용 된 다른 위치에서 다시 실행을 시도했기 때문에 매우 유용했습니다.

docker ps도움이 된 방법 : docker rm -f $(docker ps -aq) 모든 컨테이너를 제거 하는 사용하는 짧은 명령입니다.

편집 :docker ps 나를 어떻게 도왔 는지 추가했습니다 .


3
사실이 문제가 자주 발생합니다. 그리고 아무것도하지만, docker-compose down도움이되지
Ngoral

를 실행 한 동일한 디렉토리에서 실행중인 경우 도움이 될 것입니다 docker-compose up. 내 대답에서 이미 실행중인 컨테이너를 찾고 원하는 조치를 취하는 것이 좋습니다. 나는 그들을 제거하는 것이 적절하다고 느꼈습니다. 누군가가 제거하고 싶지 않다면 대신에 그들을 막기 위해 사용 rm하는 stop것이 있습니다.
Ayushya

1
tensorflow/tensorflow이미지가 실행될 동일한 포트에서 다른 서버가 실행되고 있습니다. 다른 포트에서 실행되도록 이미지를 설정하려면 어떻게해야합니까? 나는 이것을 시도했다 : docker run -it -d -p 8888:8000 tensorflow/tensorflow 내 이미지의 포트 8888을 클라이언트의 8000에 바인딩했지만 작동하지 않습니다.
Emanuel Fontelles

1
@EmanuelFontelles 디버그를 시도 할 때 -d옵션을 사용하지 마십시오 . 이제 포트는 HOST:CONTAINER. 따라서 당신은 실행해야합니다docker run -it -p 8000:8888
Ayushya

60

이것은 나를 도왔습니다.

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

다음 : kill -9 <process id>(macOS) 또는 sudo kill <process id>(Linux).

출처 : 사용자 Rub21의 코멘트 .


3
docker rm -fv $(docker ps -aq)이 라인은 내가 필요한 전부였습니다. 감사합니다
Ryan Walker

lsof는 매력을 발휘하고 프로세스를 죽이고 다시 작동합니다 ....
Mr. E

11

나는 같은 문제가 있었다
docker-compose down --rmi all(도커를 실행하는 동일한 디렉토리에서)
도움이됩니다.


3
예, 항상 도움이되지만 down일반적으로하고 싶은 마지막 작업입니다. 현재 상태를 잃는 것은 설탕 조각이 아닙니다.
Ngoral

3
이렇게하면 가져온 로컬 도커 이미지도 삭제되므로주의해서 사용하십시오
Micah Simmons

답변에서 로컬 도커 이미지를 삭제한다고 언급 했어야합니다.
Ahmed Nour Jamal El-Din

8

Linux / Unix의 경우 :

다음 명령을 사용하여 Linux 유틸리티에 대한 간단한 검색

netstat -nlp | grep 8888

이 포트에서 실행중인 처리를 표시 한 다음 해당 프로세스의 PID (행에서 PID 찾기)를 사용하여 해당 프로세스를 종료합니다.

kill PID

netstat는 PID / 프로그램을 보여줍니다 (예 : 2714 / splunkd) .sudo kill 2714가 작동합니다. 감사.
Roy

5

나는 같은 문제가 있었다. 호스트에서 Apache2 서비스를 중지하여이 문제를 해결했습니다.


이것도 내 문제였습니다. Apache를 설치하는 것을 잊었습니다
Mustapha-Belkacim

4

제 경우에는

userland 프록시 시작 오류 : listen tcp 0.0.0.0:9000 : bind : address already in use

그리고 내가 필요한 것은 PHP Storm에서 디버그 듣기를 끄는 것입니다. 상


4

어떤 경우에는 컨테이너를 중지하거나 프로세스를 종료하기 전에 문제에 대해보다 심층적 인 디버깅을 수행하는 것이 중요합니다.

아래 체크리스트를 따르십시오.

1) 현재 도커 구성 환경을 확인
하십시오 docker-compose ps.
포트가 다른 컨테이너에 의해 사용하는 경우, 그것을 중지 docker-compose stop <service-name-in-compose-file>또는 교체하여 제거 stop와 함께 rm.

2) 호스트에서 실행중인 모든 컨테이너 목록을 보려면 현재 작업 영역
실행 외부에서 실행중인 컨테이너를 확인합니다docker ps .
포트가 다른 컨테이너에서 사용중인 경우를 사용하여 중지 할 수 있습니다 docker stop <container-id>.
(*) 원본 compose환경 의 범위에 속하지 않기 때문에 먼저 docker inspect 를 사용 하여 중지하려는 컨테이너에 대한 자세한 정보를 수집하는 것이 좋습니다.

3) 호스트에서 실행중인 다른 프로세스에서 포트를 사용하는지 확인합니다.
예를 들어 포트가 6379이면 다음을 실행합니다.

$ 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

(*) 다양한 프로세스에서 열린 파일에 대한 정보를 검색하는 데 주로 사용되는 lsof 명령을 사용할 수도 있습니다 (그 netstat전에 실행하는 것이 좋습니다 ).

그래서, 상기 출력에서의 경우 PID이다 915. 이제 다음을 실행할 수 있습니다.

$ 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

그리고 상위 프로세스의 ID ( PPID)와 실행 명령을 확인합니다.
다음 $ pstree -s <PID>을 실행할 수도 있습니다. 프로세스 및 관련 프로세스를 시각적으로 표시합니다.

우리의 경우 프로세스가 아마도 데몬 (PPID는 1)임을 알 수 있습니다.이 경우 실행을 고려하십시오.
A) $ cat /proc/<PID>/status프로세스에 의해 생성 된 스레드 수와 같은 프로세스에 대한보다 자세한 정보를 얻으려면 그 기능 등 '.
B) $ systemctl status <PID>보기 위해특정 프로세스를 생성 한 단위. 서비스가 중요하지 않은 경우 서비스를 중지하고 비활성화 할 수 있습니다 .

4) Docker 서비스 다시 시작
실행 : sudo service docker restart.

5) 이 지점에 도달했습니다.
시스템이 위험에 처하지 않는 경우에만 서버를 다시 시작하십시오.


2

오늘 오후에 도커를 업그레이드했는데 같은 문제가 발생했습니다. 도커를 다시 시작했지만 운이 없었습니다.

마지막으로 컴퓨터를 다시 시작해야했는데 제대로 작동했습니다. 확실히 버그입니다.


다시 시작하는 것도 저에게 도움이되었습니다. 감사.
Alexander는

1

확인하십시오 docker-compose.yml. 포트가 두 번 지정된 경우 일 수 있습니다.

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

0

같은 문제가 여러 번 발생했습니다. 도커를 다시 시작하면 트릭을 수행하는 것 같습니다.


컨테이너를 다시 시작하는 방법을 봅니다. Docker를 다시 시작하는 방법은 무엇입니까?
Mark Wardell


0
docker-compose down --rmi all 

그런 다음 컴퓨터를 다시 시작하십시오.


7
8 개의 다른 답변으로 3 년 된 질문에 답할 때 질문의 새로운 측면이 무엇인지 지적하는 것이 유용합니다.
Jason Aller

0

@DmitrySandalov의 답변의 변형 : 8080에서 tomcat / java를 실행했는데 계속 진행해야했습니다. docker-compose.yml 파일을보고 8080에 대한 항목을 내가 선택한 다른 항목으로 변경했습니다.

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

완벽하게 작동했습니다. (유일한 주름은 외부 저장소에서 오기 때문에 프로젝트를 업데이트하면 변경 사항이 지워진다는 것입니다.)


0

동일한 문제가 있고 Windows와 관련된 경우 참고 사항 :

제 경우에는 제 방식의 프로세스가 grafana-server.exe. 바이너리 버전을 처음 다운로드하고 실행 파일을 두 번 클릭했기 때문에 이제 SYSTEM내가 할 수없는 사용자에 의해 서비스로 시작됩니다 taskkill(권한 없음).

Windows의 "서비스 관리자"로 이동하여 "Grafana"서비스를 검색하고 중지해야합니다. 그 후 포트 3000은 더 이상 점유되지 않습니다.

도움이되기를 바랍니다.


0

포트 8888을 사용하는 것은 Jupiter이고 다른 포트에서 실행되도록 Jupiter 노트북의 구성 파일을 변경해야했습니다.

특정 포트를 사용하는 사람을 나열합니다. sudo lsof -i -P -n | 그렙 9

~ / .jupyter / jupyter_notebook_config.py에서 다음 줄을 주석 해제 / 편집하여 Jupyter가 실행할 포트를 지정할 수 있습니다.

c.NotebookApp.port = 9999

jupyter_notebook_config.py가없는 경우 jupyter notebook --generate-config를 실행 해보십시오. Jupyter 구성에 대한 자세한 내용은 여기를 참조하세요.


0

network_mode : "bridge"를 "host"로 변경했습니다.

이것으로

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"

0

실행되기 전에 : docker run -d --name oracle -p 1521 : 1521 -p 5500 : 5500 qa / oracle 방금 포트를 docker run -d --name oracle -p 1522 : 1522 -p 5500으로 변경했습니다. 5500 qa / 오라클

그것은 나를 위해 잘 작동했습니다!


0

내 컴퓨터 netstat -tulpn에서 사용중인 포트 (8080)에 대해이 명령에서 PID가 표시되지 않았기 때문에이를 죽일 수 없었고 컨테이너를 죽이고 컴퓨터를 다시 시작해도 작동하지 않았습니다. 그래서 service docker restart명령은 나를 위해 도커를 다시 시작했고 (ubuntu) 포트는 더 이상 사용되지 않았고 나는 행복한 녀석이고 점심을 먹습니다.


0

새로운 conatier- listen tcp 0.0.0.0:8080 : bind : address already in use를 시작하려고 할 때 아래 오류가 발생했습니다.

솔루션 : netstat -tulnp | 그렙 8080

[root@ip-112-x6x-2x-xxx.xxxxx.compute.internal (aws_main) ~] # netstat -tulnp | grep 8080 tcp 00 0.0.0.0:8080 0.0.0.0:* LISTEN 12749 / java [root@ip-112-x6x-2x-xxx.xxxxx.compute.internal (aws_main) ~] #

죽이기 -9 12749

그런 다음 작동하는 컨테이너를 다시 시작하십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.