为什么我无法启动代理服务?绑定 0.0.0.0:8000 失败:端口已分配

Why I can not start proxy service? Bind for 0.0.0.0:8000 failed: port is already allocated

这是我的docker-撰写-proxy.yml

version: "3.7"

services:
  app:
    build:
      context: .
    ports:
      - "8000:8000"
    volumes:
      - ./app:/app
      - static_data:/vol/web

    environment:
      - DB_HOST=db
      - DB_NAME=app
      - DB_USER=postgres
      - DB_PASS=supersecretpassword
      - ALLOWED_HOSTS=127.0.0.1

    depends_on:
      - db

  proxy:
    image : proxy:latest    
    depends_on:
      - app
    ports:
      - "8000:8000"
    volumes:    
      - static_data:/vol/static_data


  db:
    image: postgres:10-alpine
    environment:
      - POSTGRES_DB=app
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=supersecretpassword

volumes:
  static_data: 

我在 运行 我的命令

之前检查了端口
netstat -ltnp | grep ':8000' 

而且端口没有被占用。 当我去

docker-compose -f docker-compose-proxy.yml up

我收到错误

ERROR: for 9bac48e03668_recipe-app-api-devops_proxy_1  Cannot start service proxy: driver failed programming external connectivity on endpoint recipe-app-api-devops_proxy_1 (af5860c135cb37026dcac6ce27151cd4e8448eaddc542d50dcd009c0e24c09fa): Bind for 0.0.0.0:8000 failed: port is already allocated

为什么?如何解决这个问题?

您在

指定了端口8000
    ports:
      - "8000:8000"

由于此端口已被用于某些用途,您会收到它已被分配的错误消息。因此,您需要找出正在使用端口 8000 的内容,然后更改容器的端口、停止其他进程或更改其他进程的端口。

您正在尝试将主机端口 8000 绑定到两个不同的东西:

services:
  app:
    ports:
      - "8000:8000"
  proxy:
    ports:
      - "8000:8000"

所以这告诉 Compose 尝试将主机端口 8000 路由到 app 容器,并将主机端口 8000 路由到 proxy 容器,它不能同时执行这两项操作。这基本上就是您遇到的错误。

如果您希望系统的所有请求都通过 proxy 容器,您只需从 app 容器中删除 ports: 块。它仍然可以通过 http://app:8000 从同一 Compose 文件中的其他容器中看到,但无法从外部访问 Docker.

如果您需要两个容器都可以访问,则需要更改其中一个容器上的第一个 ports: 编号,而不是第二个编号。

ports:
  - '8001:8000' # host port 8001 -> container port 8000

这根本不会影响容器之间的连接;无论 ports: 存在或不存在,他们将始终使用他们尝试连接的容器的“标准”端口号。