Docker Error bind: แอดเดรสถูกใช้งานแล้ว


94

เมื่อฉันรันdocker-compose upในโปรเจ็กต์ Docker มันจะขึ้นข้อความต่อไปนี้:

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เพื่อรับกระบวนการที่กำลังฟังอยู่
BMitch

2
ผลลัพธ์ของคุณแสดงให้เห็นว่ากระบวนการอื่นกำลังฟังอยู่บนพอร์ต 3000 คุณสามารถใช้พอร์ตอื่นได้หรือไม่? ลองsudoดูชื่อกระบวนการ
techtabu

ใช่มี ntop บนพอร์ตนี้ Thanx! ฉันไม่รู้ว่าsudoสามารถเปลี่ยนเอาต์พุตได้ :)
Ngoral

สำหรับฉันมันคือพอร์ต 8888 ซึ่งเป็นพร็อกซีนักเทียบท่า
Neil McGuigan

ฉันแก้ไขปัญหาเดียวกันนี้ในคำตอบนี้: stackoverflow.com/a/58772307/3530707
jmojico

คำตอบ:


93

ในกรณีของคุณมันเป็นกระบวนการอื่นที่ใช้พอร์ตและตามที่ระบุไว้ในความคิดเห็น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เพื่อหยุดพวกเขาแทน
อยุธยา

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
อยุธยา

62

สิ่งนี้ช่วยฉัน:

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(ในไดเร็กทอรีเดียวกับที่คุณเรียกใช้ docker-compose up)
ช่วยด้วย


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 ทำงาน ขอบคุณ.
รอย


4

ในกรณีของฉันมันคือ

เกิดข้อผิดพลาดในการเริ่มใช้พร็อกซี userland: listen tcp 0.0.0.0:9000: bind: address ถูกใช้งานแล้ว

และสิ่งที่ฉันต้องการคือปิดการฟัง debug ใน php storm ไอคอน


4

ในบางกรณีจำเป็นอย่างยิ่งที่จะต้องทำการดีบักในเชิงลึกมากขึ้นของปัญหาก่อนที่จะหยุดคอนเทนเนอร์หรือฆ่ากระบวนการ

พิจารณาทำตามรายการตรวจสอบด้านล่าง:

1) ตรวจสอบสภาพแวดล้อมการเขียนนักเทียบท่าในปัจจุบัน เรียก
ถ้าพอร์ตอยู่ในการใช้งานโดยภาชนะอื่นหยุดมันด้วยหรือเอาออกโดยการแทนที่ด้วยdocker-compose ps
docker-compose stop <service-name-in-compose-file>stoprm

2) ตรวจสอบคอนเทนเนอร์ที่ทำงานนอกพื้นที่ทำงานปัจจุบันของคุณ
เรียกใช้docker psเพื่อดูรายการคอนเทนเนอร์ทั้งหมดที่ทำงานภายใต้โฮสต์ของคุณ หากคุณพบว่าพอร์ตที่อยู่ในการใช้งานโดยภาชนะอื่นคุณสามารถหยุดมันด้วย
(*) เนื่องจากคุณไม่ได้อยู่ภายใต้ขอบเขตของสภาพแวดล้อมต้นทางจึงเป็นแนวทางปฏิบัติที่ดีในการใช้นักเทียบท่าตรวจสอบก่อนเพื่อรวบรวมข้อมูลเพิ่มเติมเกี่ยวกับคอนเทนเนอร์ที่คุณกำลังจะหยุดdocker stop <container-id>
compose

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>เพื่อแสดงภาพของกระบวนการและกระบวนการที่เกี่ยวข้อง

ในกรณีของเราเราจะเห็นว่ากระบวนการนี้น่าจะเป็น daemon (PPID คือ 1) - ในกรณีนั้นให้พิจารณาการรัน:
A) $ cat /proc/<PID>/statusเพื่อรับข้อมูลเชิงลึกเกี่ยวกับกระบวนการเช่นจำนวนเธรดที่เกิดจากกระบวนการ ความสามารถ ฯลฯ '
B) $ systemctl status <PID>เพื่อดูไฟล์หน่วยที่ทำให้เกิดการสร้างกระบวนการเฉพาะ หากบริการไม่สำคัญคุณสามารถหยุดและปิดใช้บริการได้

4) การให้บริการเริ่มต้นใหม่เทียบท่า Run:
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"

1

ฉันได้รับข้อผิดพลาดด้านล่างเมื่อฉันพยายามเปิดตัว conatier ใหม่ - ฟัง tcp 0.0.0.0:8080: bind: ที่อยู่ถูกใช้งานแล้ว

วิธีแก้ไข: netstat -tulnp | grep 8080

[root@ip-112-x6x-2x-xxx.xxxxx.compute.internal (aws_main) ~] # netstat -tulnp | grep 8080 tcp 0 0 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

จากนั้นลองเปิดคอนเทนเนอร์อีกครั้งก็น่าจะใช้ได้


จับได้เห็นชัดตรงเผง ! โซลูชันของคุณช่วยได้
Alferd Nobel

0

ฉันพบปัญหาเดียวกันหลายครั้ง การรีสตาร์ทนักเทียบท่าดูเหมือนจะทำเคล็ดลับ


ฉันเห็นวิธีรีสตาร์ทคอนเทนเนอร์ วิธีการรีสตาร์ท Docker
Mark Wardell


0
docker-compose down --rmi all 

จากนั้นรีสตาร์ทคอมพิวเตอร์ของคุณ


7
เมื่อตอบคำถามอายุสามขวบพร้อมกับคำตอบอื่น ๆ อีกแปดคำจะมีประโยชน์ในการชี้ให้เห็นว่าคำถามของคุณอยู่ในแง่มุมใหม่ใด
Jason Aller

0

รูปแบบของคำตอบของ @ DmitrySandalov: ฉันมี tomcat / java ที่ทำงานบน 8080 ซึ่งจำเป็นต้องดำเนินการต่อไป ดูไฟล์ docker-compose.yml และเปลี่ยนรายการสำหรับ 8080 เป็นไฟล์อื่นที่ฉันเลือก

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

ทำงานได้อย่างสมบูรณ์แบบ (ริ้วรอยเดียวคือการเปลี่ยนแปลงจะถูกลบออกหากฉันเคยอัปเดตโครงการเนื่องจากมาจาก repo ภายนอก)


0

หมายเหตุด้านข้างหากคุณมีปัญหาเดียวกันและใช้ Windows:

grafana-server.exeในกรณีของกระบวนการในทางของฉันเป็นเพียง เนื่องจากฉันดาวน์โหลดเวอร์ชันไบนารีเป็นครั้งแรกและดับเบิลคลิกที่ไฟล์ปฏิบัติการและตอนนี้เริ่มเป็นบริการโดยผู้ใช้SYSTEMซึ่งฉันไม่สามารถทำได้taskkill(ไม่ได้รับอนุญาต)

ฉันต้องไปที่ "Service manager" ของ Windows และค้นหาบริการ "Grafana" และหยุดมัน หลังจากนั้นพอร์ต 3000 จะไม่ถูกครอบครองอีกต่อไป

หวังว่าจะช่วยได้


0

อันที่ใช้พอร์ต 8888 คือ Jupiter และฉันต้องเปลี่ยนไฟล์คอนฟิกของโน๊ตบุ๊ค Jupiter เพื่อให้ทำงานบนพอร์ตอื่น

เพื่อแสดงรายการว่าใครกำลังใช้พอร์ตนั้น sudo lsof -i -P -n | grep 9

คุณสามารถระบุพอร์ตที่คุณต้องการให้ Jupyter รัน uncommenting / แก้ไขบรรทัดต่อไปนี้ใน ~ / .jupyter / jupyter_notebook_config.py:

c.NotebookApp.port = 9999

ในกรณีที่คุณไม่มี jupyter_notebook_config.py ให้ลองเรียกใช้สมุดบันทึก jupyter --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

ก่อนที่มันจะทำงานบน: นักเทียบท่าวิ่ง -d - ชื่อ oracle -p 1521: 1521 -p 5500: 5500 qa / oracle ฉันเพิ่งเปลี่ยนพอร์ตเป็นนักเทียบท่าวิ่ง -d - ชื่อ oracle -p 1522: 1522 -p 5500: 5500 qa / oracle

มันใช้งานได้ดีสำหรับฉัน!


0

บนเครื่องของฉัน PID ไม่แสดงจากคำสั่งนี้netstat -tulpnสำหรับพอร์ตที่ใช้งาน (8080) ดังนั้นฉันจึงไม่สามารถฆ่ามันได้การฆ่าคอนเทนเนอร์และการรีสตาร์ทคอมพิวเตอร์ไม่ทำงาน ดังนั้นservice docker restartคำสั่งจึงรีสตาร์ทนักเทียบท่าสำหรับฉัน (อูบุนตู) และพอร์ตไม่ได้ใช้งานอีกต่อไปและฉันมีความสุขกับการรับประทานอาหารกลางวัน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.