Docker Error bind: alamat sudah digunakan

94

Ketika saya menjalankan docker-compose upproyek Docker saya gagal dengan pesan berikut:

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

netstat -pna | grep 3000 tunjukkan ini:

tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      -  

Saya sudah mencoba docker-compose down, tetapi tidak membantu.

Ngoral
sumber
7
Jalankan a sudo netstat -pna | grep 3000untuk mendapatkan proses yang mendengarkan.
BMitch
2
Output Anda menunjukkan beberapa proses lain sedang mendengarkan pada port 3000 sudah. Bisakah Anda menggunakan port lain? Cobalah sudountuk melihat nama proses.
techtabu
Ya, ada ntop di pelabuhan ini. Terima kasih! Saya tidak tahu sudobisa mengubah keluaran :)
Ngoral
Bagi saya itu port 8888 yang merupakan proxy buruh pelabuhan
Neil McGuigan
Saya memperbaiki masalah yang sama ini dalam jawaban ini: stackoverflow.com/a/58772307/3530707
jmojico

Jawaban:

93

Dalam kasus Anda, itu adalah beberapa proses lain yang menggunakan port dan seperti yang ditunjukkan dalam komentar, sudo netstat -pna | grep 3000membantu Anda dalam memecahkan masalah.

Sementara dalam kasus lain (saya sendiri mengalaminya berkali-kali) sebagian besar adalah wadah yang sama yang berjalan di beberapa contoh lain. Dalam hal docker psini sangat membantu karena saya sering membiarkan container yang sama berjalan di direktori lain dan kemudian mencoba menjalankan lagi di tempat lain, di mana nama container yang sama digunakan.

Bagaimana docker psmembantu saya: docker rm -f $(docker ps -aq) adalah perintah singkat yang saya gunakan untuk menghapus semua kontainer.

Edit: Menambahkan bagaimana docker psmembantu saya.

Ayushya
sumber
3
Sebenarnya saya sering mengalami masalah ini. Dan tidak ada, selain docker-compose downmembantu
Ngoral
Itu pasti akan membantu, dengan syarat Anda menjalankannya di direktori yang sama tempat Anda menjalankan docker-compose up. Sementara saya merekomendasikan dalam jawaban saya untuk menemukan wadah yang sudah berjalan dan mengambil tindakan yang diinginkan. Saya merasa pantas untuk menghapusnya, jika seseorang tidak ingin menghapusnya, maka ada malah menggunakan rmgunakan stopuntuk menghentikannya.
Ayushya
1
Saya memiliki server lain yang berjalan di port yang sama dengan tensorflow/tensorflowgambar yang akan dijalankan. Bagaimana cara menyiapkan gambar saya untuk dijalankan di port lain. Saya sudah mencoba ini: docker run -it -d -p 8888:8000 tensorflow/tensorflow Saya mengikat port 8888 dari gambar saya ke 8000 pada klien, tetapi tidak berhasil.
Emanuel Fontelles
1
@EmanuelFontelles Saat mencoba men-debug, jangan gunakan -dopsi. Sekarang, port diekspos sebagai HOST:CONTAINER. Jadi Anda harus laridocker run -it -p 8000:8888
Ayushya
62

Ini membantu saya:

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

lalu: kill -9 <process id>(macOS) atau sudo kill <process id>(Linux).

Sumber: komentar oleh pengguna Rub21 .

Tomasz Bartkowiak
sumber
3
docker rm -fv $(docker ps -aq)baris ini yang saya butuhkan. Terima kasih
Ryan Walker
lsof bekerja dengan baik, menghentikan proses dan kembali beraksi ....
Tn. E
11

Saya memiliki masalah yang sama,
docker-compose down --rmi all(di direktori yang sama tempat Anda menjalankan docker-compose)
membantu

Lytvoles
sumber
3
Ya, itu selalu membantu, tetapi itu downadalah hal terakhir yang biasanya ingin Anda lakukan. Kehilangan keadaan saat ini bukanlah sepotong gula.
Ngoral
3
Ini juga akan menghapus gambar buruh pelabuhan lokal yang telah Anda tarik jadi gunakan dengan hati
Micah Simmons
Anda seharusnya menyebutkan itu akan menghapus gambar buruh pelabuhan lokal di jawabannya.
Ahmed Nour Jamal El-Din
8

Untuk Linux / Unix:

Pencarian sederhana untuk utilitas linux menggunakan perintah berikut

netstat -nlp | grep 8888

Ini akan menunjukkan pemrosesan yang berjalan di port ini, lalu matikan proses itu menggunakan PID (cari PID di baris) dari proses itu.

kill PID
Neeraj Bansal
sumber
netstat menunjukkan PID / program (misalnya 2714 / splunkd). sudo kill 2714 bekerja. Terima kasih.
Roy
5

Saya memiliki masalah yang sama. Saya memperbaikinya dengan menghentikan layanan Apache2 di host saya.

Fabien Thetis
sumber
ini adalah masalah saya juga, saya lupa saya menginstal Apache
Mustapha-Belkacim
4

Dalam kasus saya itu

Kesalahan memulai proxy userland: dengarkan tcp 0.0.0.0:9000: bind: alamat sudah digunakan

Dan yang saya butuhkan hanyalah mematikan debug mendengarkan di php storm ikon

pengguna3724832
sumber
4

Dalam beberapa kasus, sangat penting untuk melakukan debugging yang lebih mendalam pada masalah sebelum menghentikan container atau menghentikan proses.

Pertimbangkan untuk mengikuti checklist di bawah ini:

1) Periksa Anda saat ini lingkungan buruh pelabuhan compose
Run docker-compose ps.
Jika port sedang digunakan oleh kontainer lain, hentikan docker-compose stop <service-name-in-compose-file>atau lepaskan dengan mengganti stopdengan rm.

2) Periksa penampung yang berjalan di luar ruang kerja Anda saat ini.
Jalankan docker psuntuk melihat daftar semua penampung yang berjalan di bawah host Anda.
Jika Anda menemukan port sedang digunakan oleh kontainer lain, Anda dapat menghentikannya dengan docker stop <container-id>.
(*) Karena Anda tidak berada dalam cakupan composelingkungan asal - sebaiknya gunakan inspeksi buruh pelabuhan terlebih dahulu untuk mengumpulkan lebih banyak informasi tentang container yang akan Anda hentikan.

3) Periksa apakah port digunakan oleh proses lain yang berjalan pada host
Misalnya jika port 6379 dijalankan:

$ 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

(*) Anda juga dapat menggunakan perintah lsof yang terutama digunakan untuk mengambil informasi tentang file yang dibuka oleh berbagai proses (saya sarankan berjalan netstatsebelum itu).

Jadi, Jika output di atas PID adalah 915. Sekarang Anda dapat menjalankan:

$ 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

Dan lihat ID dari proses induk (PPID ) dan perintah eksekusi.
Anda juga dapat menjalankan: $ pstree -s <PID>ke tampilan visual proses dan proses terkaitnya.

Dalam kasus kami, kami dapat melihat bahwa proses mungkin adalah daemon (PPID adalah 1) - Dalam hal ini pertimbangkan untuk menjalankan:
A) $ cat /proc/<PID>/statusuntuk mendapatkan informasi yang lebih mendalam tentang proses seperti jumlah utas yang muncul oleh proses, kemampuannya, dll. '.
B) $ systemctl status <PID>untuk melihatunit yang menyebabkan terciptanya proses tertentu. Jika layanan tidak kritis - Anda bisa menghentikan dan menonaktifkan layanan .

4) Mulai ulang layanan Docker
Run: sudo service docker restart.

5) Anda mencapai titik ini dan ..
Hanya jika ini tidak membahayakan sistem Anda - pertimbangkan untuk memulai ulang server.

RtmY
sumber
2

Saya meningkatkan buruh pelabuhan saya sore ini dan mengalami masalah yang sama. Saya mencoba memulai ulang buruh pelabuhan tetapi tidak berhasil.

Akhirnya, saya harus me-restart komputer saya dan berhasil. Pasti bug.

Charles Zhao
sumber
Memulai kembali membantu saya juga. Terima kasih.
Alexander
1

Periksa docker-compose.yml, mungkin kasus port ditentukan dua kali.

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

Saya mengalami masalah yang sama beberapa kali. Memulai ulang buruh pelabuhan tampaknya berhasil

arvind
sumber
saya melihat cara memulai ulang penampung. Bagaimana cara me-restart buruh pelabuhan?
Mark Wardell
0

Saya menyelesaikan masalah dengan memulai ulang Docker.

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

dan kemudian restart komputer Anda

Yusuf Kayikci
sumber
7
Saat menjawab pertanyaan tiga tahun dengan delapan jawaban lainnya, ada gunanya untuk menunjukkan aspek baru apa dari pertanyaan yang dijawab oleh jawaban Anda.
Jason Aller
0

Variasi dari jawaban @ DmitrySandalov: Saya menjalankan tomcat / java pada 8080, yang harus terus berjalan. Melihat file docker-compose.yml dan mengubah entri untuk 8080 menjadi pilihan saya yang lain.

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

Bekerja dengan sempurna. (Satu-satunya masalah adalah perubahan akan terhapus jika saya memperbarui proyek, karena ini berasal dari repo eksternal.)

SwingingFromTheTrees
sumber
0

Hanya catatan tambahan jika Anda memiliki masalah yang sama dan dengan Windows:

Dalam kasus saya, proses dalam cara saya adil grafana-server.exe. Karena saya pertama kali mengunduh versi biner dan mengklik dua kali file yang dapat dieksekusi, dan sekarang mulai sebagai layanan oleh pengguna SYSTEMyang saya tidak dapat taskkill(tanpa izin)

Saya harus pergi ke "Manajer layanan" Windows dan mencari layanan "Grafana", dan menghentikannya. Setelah itu port 3000 tidak lagi ditempati.

Semoga membantu.

WesternGun
sumber
0

Yang menggunakan port 8888 adalah Jupiter dan saya harus mengubah file konfigurasi notebook Jupiter untuk berjalan di port lain.

untuk mendaftar siapa yang menggunakan port khusus itu. sudo lsof -i -P -n | grep 9

Anda dapat menentukan porta yang Anda inginkan agar Jupyter menjalankan tanpa komentar / mengedit baris berikut di ~ / .jupyter / jupyter_notebook_config.py:

c.NotebookApp.port = 9999

Jika Anda tidak memiliki jupyter_notebook_config.py coba jalankan jupyter notebook --generate-config. Lihat ini untuk detail lebih lanjut tentang konfigurasi Jupyter.

Oscar Rangel
sumber
0

Mengubah network_mode: "bridge" menjadi "host" berhasil untuk saya.

Ini dengan

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"
tidak
sumber
0

Sebelum dijalankan di: docker run -d --name oracle -p 1521: 1521 -p 5500: 5500 qa / oracle Saya baru saja mengubah port menjadi docker run -d --name oracle -p 1522: 1522 -p 5500: 5500 qa / oracle

ini bekerja dengan baik untukku !

Mahesh Keragute
sumber
0

Di mesin saya, PID tidak ditampilkan dari perintah ini netstat -tulpnuntuk port yang sedang digunakan (8080), jadi saya tidak dapat mematikannya, mematikan container dan memulai ulang komputer tidak berfungsi. Jadi service docker restartperintah restart buruh pelabuhan untuk saya (ubuntu) dan port tidak lagi digunakan dan saya senang chap dan pergi untuk makan siang.

Jeremy
sumber
0

Saya mendapatkan kesalahan di bawah ini ketika saya mencoba untuk meluncurkan sebuah conatier baru- dengarkan tcp 0.0.0.0:8080: bind: alamat sudah digunakan.

Solusi: netstat -tulnp | grep 8080

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

bunuh -9 12749

Kemudian coba luncurkan kembali wadah yang seharusnya berfungsi

Kripa Mishra
sumber
-1
`$` sudo service redis-server stop

Apakah triknya.

Mlenge Fanuel
sumber