代码之家  ›  专栏  ›  技术社区  ›  Richard Rublev

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

  •  0
  • Richard Rublev  · 技术社区  · 2 年前

    这是我的docker compose代理。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
    

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

    1 回复  |  直到 2 年前
        1
  •  1
  •   Lajos Arpad    2 年前

    您指定了端口 8000

        ports:
          - "8000:8000"
    

    因为这个端口已经被用于某些东西,所以您会得到一个错误,即它已经被分配。所以,您需要找出是什么在使用端口 8000 或者更改容器的端口,停止另一个进程,或者更改另一个进程的端口。

        2
  •  1
  •   David Maze    2 年前

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

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

    因此,这告诉Compose尝试将主机端口8000路由到 app 容器,并将主机端口8000路由到 proxy 容器,但它不能两者兼而有之。这基本上就是你所犯的错误。

    如果您希望系统的所有请求都通过 代理 容器,您只需删除 ports: 隔街 应用程序 容器在同一个Compose文件中的其他容器中仍然可以通过 http://app:8000 但从Docker外部无法访问它。

    如果需要两个容器都可以访问,则需要更改第一个容器 端口: 一个或另一个容器上的编号,但不是第二个。

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

    这根本不会影响容器之间的连接;不管怎样 端口: 无论是否存在,他们都会使用他们试图连接的容器的“标准”端口号。