Liên kết lỗi Docker: địa chỉ đã được sử dụng


94

Khi tôi chạy docker-compose uptrong dự án Docker của mình, nó không thành công với thông báo sau:

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

netstat -pna | grep 3000 cho thấy điều này:

tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      -  

Tôi đã thử docker-compose down, nhưng nó không giúp ích gì.


7
Chạy a sudo netstat -pna | grep 3000để nhận quy trình đang lắng nghe.
BMitch

2
Đầu ra của bạn cho thấy một số quá trình khác đang lắng nghe trên cổng 3000. Bạn có thể sử dụng một số cổng khác? Hãy thử với sudođể xem tên quá trình.
techtabu

Đúng, đã có ntop trên cổng này. Thanx! Tôi không biết sudocó thể thay đổi đầu ra :)
Ngoral

Đối với tôi đó là cổng 8888 đó là Docker Proxy
Neil McGuigan

Tôi đã khắc phục sự cố tương tự trong câu trả lời này: stackoverflow.com/a/58772307/3530707
jmojico

Câu trả lời:


93

Trong trường hợp của bạn, đó là một số quy trình khác đang sử dụng cổng và như được chỉ ra trong các nhận xét, sudo netstat -pna | grep 3000đã giúp bạn giải quyết vấn đề.

Trong khi trong các trường hợp khác (bản thân tôi đã gặp nó nhiều lần) thì nó chủ yếu là cùng một vùng chứa đang chạy ở một số trường hợp khác. Trong trường hợp docker psđó rất hữu ích vì tôi thường để các vùng chứa giống nhau chạy trong các thư mục khác và sau đó thử chạy lại ở những nơi khác, nơi các tên vùng chứa giống nhau được sử dụng.

Làm thế nào docker psđã giúp tôi: docker rm -f $(docker ps -aq) là một lệnh ngắn mà tôi sử dụng để xóa tất cả các vùng chứa.

Chỉnh sửa: Đã thêm cách docker psgiúp tôi.


3
Trên thực tế, tôi gặp vấn đề này thường xuyên. Và không có gì, nhưng docker-compose downsẽ giúp
Ngoral

Điều đó chắc chắn sẽ hữu ích, với điều kiện là bạn đang chạy nó trong cùng một thư mục mà bạn đã chạy docker-compose up. Mặc dù trong câu trả lời, tôi khuyên bạn nên tìm vùng chứa đã chạy và thực hiện hành động mong muốn. Tôi cảm thấy thích hợp để xóa chúng, nếu ai đó không muốn xóa, thì thay vào đó, có sử rmdụng stopđể ngăn chặn chúng.
Ayushya

1
Tôi có một máy chủ khác đang chạy trên cùng một cổng mà tensorflow/tensorflowhình ảnh sẽ chạy. Làm cách nào để thiết lập hình ảnh của tôi chạy trong một cổng khác. Tôi đã thử điều này: docker run -it -d -p 8888:8000 tensorflow/tensorflow Tôi đã liên kết cổng 8888 từ hình ảnh của mình thành 8000 trên máy khách, nhưng không hoạt động.
Emanuel Fontelles

1
@EmanuelFontelles Khi cố gắng gỡ lỗi, không sử dụng -dtùy chọn. Bây giờ, các cổng được hiển thị như HOST:CONTAINER. Vì vậy bạn nên chạydocker run -it -p 8000:8888
Ayushya

62

Điều này đã giúp tôi:

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

và sau đó: kill -9 <process id>(macOS) hoặc sudo kill <process id>(Linux).

Nguồn: bình luận của người dùng Rub21 .


3
docker rm -fv $(docker ps -aq)dòng này là tất cả những gì tôi cần. Cảm ơn
Ryan Walker

lsof làm việc một cách quyến rũ, giết chết quá trình và hoạt động trở lại ....
Mr. E

11

Tôi đã gặp vấn đề tương tự,
docker-compose down --rmi all(trong cùng một thư mục mà bạn chạy docker-soạn lên)
giúp


3
Có, nó luôn hữu ích, nhưng downlà điều cuối cùng bạn thường muốn làm. Mất trạng thái hiện tại không phải là một miếng đường.
Ngoral

3
Thao tác này cũng sẽ xóa các hình ảnh docker cục bộ mà bạn đã kéo, vì vậy hãy sử dụng nó một cách thận trọng
Micah Simmons

Bạn nên đề cập rằng nó sẽ xóa các hình ảnh docker cục bộ trong câu trả lời.
Ahmed Nour Jamal El-Din

8

Đối với Linux / Unix:

Tìm kiếm đơn giản cho tiện ích linux bằng lệnh sau

netstat -nlp | grep 8888

Nó sẽ hiển thị quá trình đang chạy tại cổng này, sau đó giết quá trình đó bằng PID (tìm PID trong hàng) của quá trình đó.

kill PID

netstat hiển thị PID / chương trình (ví dụ: 2714 / splunkd) .sudo kill 2714 hoạt động. Cảm ơn.
Roy

5

Tôi đã từng gặp vấn đề tương tự. Tôi đã sửa lỗi này bằng cách dừng dịch vụ Apache2 trên máy chủ của mình.


đây cũng là vấn đề của tôi, tôi quên rằng tôi đã cài đặt Apache
Mustapha-Belkacim

4

Trong trường hợp của tôi, nó là

Lỗi khi khởi động proxy userland: nghe tcp 0.0.0.0:9000: bind: địa chỉ đã được sử dụng

Và tất cả những gì tôi cần là tắt tính năng nghe gỡ lỗi trong php Storm biểu tượng


4

Trong một số trường hợp, điều quan trọng là phải thực hiện gỡ lỗi chuyên sâu hơn cho sự cố trước khi dừng một vùng chứa hoặc hủy một quy trình.

Hãy xem xét việc làm theo danh sách kiểm tra dưới đây:

1) Kiểm tra môi trường soạn docker hiện tại
Chạy docker-compose ps.
Nếu cổng đang được sử dụng bởi một thùng chứa khác, hãy ngăn chặn docker-compose stop <service-name-in-compose-file>hoặc loại bỏ cổng đó bằng cách thay thế stopbằng rm.

2) Kiểm tra các vùng chứa đang chạy bên ngoài không gian làm việc hiện tại của bạn
Chạy docker psđể xem danh sách tất cả các vùng chứa đang chạy trong máy chủ của bạn.
Nếu bạn thấy cổng đang được sử dụng bởi một vùng chứa khác, bạn có thể dừng cổng đó lại bằng docker stop <container-id>.
(*) Vì bạn không thuộc phạm vi của composemôi trường gốc - trước tiên bạn nên sử dụng tính năng kiểm tra của docker để thu thập thêm thông tin về vùng chứa mà bạn sắp dừng.

3) Kiểm tra xem cổng có được sử dụng bởi các quy trình khác đang chạy trên máy chủ hay không
Ví dụ: nếu cổng là 6379 chạy:

$ 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

(*) Bạn cũng có thể sử dụng lệnh lsof chủ yếu được sử dụng để truy xuất thông tin về các tệp được mở bởi các quy trình khác nhau (tôi khuyên bạn nên chạy netstattrước đó).

Vì vậy, trong trường hợp đầu ra ở trên PID915. Bây giờ bạn có thể chạy:

$ 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

Và xem ID của tiến trình mẹ ( PPID) và lệnh thực thi.
Bạn cũng có thể chạy: $ pstree -s <PID>để hiển thị trực quan quá trình và các quá trình liên quan của nó.

Trong trường hợp của chúng tôi, chúng tôi có thể thấy rằng quy trình có thể là một daemon (PPID là 1) - Trong trường hợp đó, hãy xem xét việc chạy:
A) $ cat /proc/<PID>/statusđể có được thông tin chuyên sâu hơn về quy trình như số luồng được sinh ra bởi quy trình, khả năng của nó, v.v. '.
B) $ systemctl status <PID>để xemđơn vị đã tạo ra một quy trình cụ thể. Nếu dịch vụ không quan trọng - bạn có thể dừng và tắt dịch vụ .

4) dịch vụ Restart Docker
Run: sudo service docker restart.

5) Bạn đã đạt đến điểm này và ..
Chỉ khi nó không khiến hệ thống của bạn gặp rủi ro - hãy xem xét khởi động lại máy chủ.


2

Tôi đã nâng cấp docker của mình chiều nay và gặp phải vấn đề tương tự. Tôi đã thử khởi động lại docker nhưng không may mắn.

Cuối cùng, tôi phải khởi động lại máy tính của mình và nó đã hoạt động. Chắc chắn là một lỗi.


Khởi động lại cũng giúp tôi. Cảm ơn.
Alexander

1

Kiểm tra docker-compose.yml, có thể là trường hợp cổng được chỉ định hai lần.

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

1

Tôi đã gặp lỗi dưới đây khi tôi cố gắng khởi chạy conatier- nghe tcp 0.0.0.0:8080: bind: address đã được sử dụng.

Giải pháp: 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) ~] #

giết -9 12749

Sau đó, hãy thử khởi chạy lại vùng chứa mà nó sẽ hoạt động


Tại chỗ trên ! giải pháp của bạn đã giúp.
Alferd Nobel

0

Tôi đã gặp cùng một vấn đề vài lần. Khởi động lại docker dường như thực hiện thủ thuật


tôi thấy cách khởi động lại một vùng chứa. Làm thế nào để khởi động lại docker?
Mark Wardell

0

Tôi giải quyết vấn đề bằng cách khởi động lại Docker.


0
docker-compose down --rmi all 

và sau đó khởi động lại máy tính của bạn


7
Khi trả lời một câu hỏi ba tuổi với tám câu trả lời khác, điều hữu ích là chỉ ra khía cạnh mới của câu hỏi mà câu trả lời của bạn đề cập đến.
Jason Aller

0

Một biến thể của câu trả lời của @ DmitrySandalov: Tôi đã chạy tomcat / java trên 8080, cần phải tiếp tục. Đã xem xét tệp docker-compos.yml và thay đổi mục nhập cho 8080 thành một mục khác mà tôi lựa chọn.

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

Hoạt động hoàn hảo. (Khó khăn duy nhất là thay đổi sẽ bị xóa nếu tôi cập nhật dự án, vì nó đến từ một repo bên ngoài.)


0

Chỉ là một lưu ý phụ nếu bạn gặp vấn đề tương tự và với Windows:

Trong trường hợp của tôi, quy trình theo cách của tôi chỉ là grafana-server.exe. Bởi vì lần đầu tiên tôi tải xuống phiên bản nhị phân và nhấp đúp vào tệp thực thi và bây giờ nó bắt đầu như một dịch vụ của người dùng SYSTEMmà tôi không thể taskkill(không có quyền)

Tôi phải truy cập "Trình quản lý dịch vụ" của Windows và tìm kiếm dịch vụ "Grafana" và dừng nó lại. Sau đó cổng 3000 không còn bị chiếm dụng nữa.

Hy vọng rằng sẽ giúp.


0

Cái đang sử dụng cổng 8888 là Jupiter và tôi phải thay đổi tệp cấu hình của máy tính xách tay Jupiter để chạy trên cổng khác.

để liệt kê những người đang sử dụng cổng cụ thể đó. sudo lsof -i -P -n | grep 9

Bạn có thể chỉ định cổng bạn muốn Jupyter chạy bỏ ghi chú / chỉnh sửa dòng sau trong ~ / .jupyter / jupyter_notebook_config.py:

c.NotebookApp.port = 9999

Trong trường hợp bạn không có jupyter_notebook_config.py hãy thử chạy sổ ghi chép jupyter --generate-config. Xem phần này để biết thêm chi tiết về cấu hình Jupyter.


0

Thay đổi network_mode: "bridge" thành "host" đã giúp tôi.

Cái này với

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

Trước khi nó chạy trên: docker run -d --name oracle -p 1521: 1521 -p 5500: 5500 qa / oracle Tôi vừa thay đổi cổng thành docker run -d --name oracle -p 1522: 1522 -p 5500: 5500 qa / oracle

Nó làm việc tốt cho tôi !


0

Trên máy của tôi, PID không được hiển thị từ lệnh này netstat -tulpncho cổng đang sử dụng (8080), vì vậy tôi không thể giết nó, việc tắt các vùng chứa và khởi động lại máy tính không hoạt động. Vì vậy, service docker restartlệnh khởi động lại docker cho tôi (ubuntu) và cổng không còn được sử dụng nữa và tôi là một người vui vẻ và đi ăn trưa.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.