Docker 容器失败,因为 service rabbit 在端点编码器_rabbit_1 上编程外部连接失败

use*_*892 8 docker

由于以下错误,我的 docker 容器无法建立几个月了:

ERROR: for rabbit  Cannot start service rabbit: driver failed programming external connectivity on endpoint encoder_rabbit_1 (e9fa1caaf9b8cc57e0a1480cb50b17d0afb276d74471fca9fec922ddc559b1b2): Error starting userland proxy: listen tcp 0.0.0.0:5672: bind: address already in use
Run Code Online (Sandbox Code Playgroud)

为了“解决”我所做的问题:

$> sudo lsof -i tcp:5672
Run Code Online (Sandbox Code Playgroud)

我得到:

COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
beam.smp 1313 rabbitmq   54u  IPv6  27235      0t0  TCP *:amqp (LISTEN)
Run Code Online (Sandbox Code Playgroud)

然后:

$> sudo kill -9 1313
Run Code Online (Sandbox Code Playgroud)

通过终止rabbitmq进程,我可以建立容器:

$> docker-compose up -d --build --force-recreate
Run Code Online (Sandbox Code Playgroud)

我可以做些什么来避免出现此错误而不在每次rabbitmq 进程时都杀死它?

感谢您的帮助

编辑 1: 根据 Zeitounator 的评论,我在下面发布docker-compose.yml

version: '2.1'
services:
  files:
    image: busybox
    volumes:
      - ./file/input:/file/input
      - ./file/output:/file/output

  grafana:
    image: grafana/grafana:5.1.0
    ports:
      - 3000:3000
    volumes:
      - ./prometheus/grafana/:/etc/grafana/provisioning/
    environment:
      - GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource
      - GF_AUTH_BASIC_ENABLED=false
    depends_on: 
      - prometheus

  prometheus:
    image: prom/prometheus
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    ports: 
      - 9090:9090

  aggregatore:
    build: aggregatore/.
    volumes:    
      - ./aggregatore:/src
    volumes_from: 
      - files
    ports:
      - 8000:8000
    command: ["python", "/src/main.py"]    
    depends_on: 
      rabbit:
        condition: service_healthy

  classificatore:
    build: classificatore/.
    volumes:    
      - ./classificatore:/src
    volumes_from: 
      - files
    ports: 
      - 8080:5000      
    command: ["python", "/src/main.py"]
    depends_on: 
      rabbit:
        condition: service_healthy

  mpeg-pre-encoder:
    build: mpeg-pre-encoder/.
    volumes:
      - ./mpeg-pre-encoder:/src
      - ./gabac_encoder:/src/gabac_encoder
    volumes_from: 
      - files    
    depends_on: 
      rabbit:
        condition: service_healthy

  rabbit:
    image: rabbitmq
    ports:
      - 5672:5672
    healthcheck:
      test: ["CMD", "rabbitmqctl", "cluster_status"]
      interval: 5s
      timeout: 2s
      retries: 20
Run Code Online (Sandbox Code Playgroud)

我已将兔子端口更改为

ports:
  - 7000:7000
Run Code Online (Sandbox Code Playgroud)

它做到了!

由于我根本不是这方面的专家,而且我没有编写 .yml 文件,如果只有 rabbitmq 使用该端口,那兔子是如何使我的容器失败的?在 .yml 中,我在该端口上找不到任何其他进程映射。我想我错过了一些步骤

Zei*_*tor 4

基本问题是您将 docker 服务的端口映射到本地主机上的端口 5672,并且该端口已被占用。3种解决方案:

  • 删除使用5672端口的软件(即在localhost上运行的rabbitmq)
  • 更改本地主机上的rabbitmq使用的端口,这样你就可以映射5672而不会出现错误
  • 更改您映射的端口,使其不会与现有端口冲突。