【问题标题】:docker-compose connection between containersdocker-compose 容器之间的连接
【发布时间】:2021-03-10 13:09:04
【问题描述】:

我的机器人、服务器和数据库有 3 个容器。在 docker-compose up 之后,服务器和数据库正在工作。电报机器人执行获取请求并出现此错误: 获取“http://localhost:8080/user/”:拨打tcp 127.0.0.1:8080:连接:连接被拒绝

码头工人-compose.yml
version: "3"
services:
  db:
    image: postgres
    container_name: todo_postgres
    restart: always
    ports:
      - "5432:5432"
    environment:
      # TODO: Change it to environment variables
      POSTGRES_USER: user
      POSTGRES_DB: somedb
      POSTGRES_PASSWORD: pass
  server:
    depends_on:
      - db
    build: .
    restart: always
    ports:
      - 8080:8080
    environment:
      DB_NAME: somedb
      DB_USERNAME: user
      DB_PASSWORD: pass

  bot:
    depends_on:
      - server
    build:
      ./src/telegram_bot
    environment:
      BOT_TOKEN: TOKEN
    restart: always
    links:
      - server

【问题讨论】:

  • 我们可以从中看出,显然没有进程在监听 localhost:8080。考虑提供有关 bot docker 映像的更多信息以帮助您,例如它是如何配置的,或者您是否使用任何库或框架来开发 bot。此外,使用depends_onlinks 选项似乎是多余的。
  • localhost 在 Docker 中几乎总是意味着“这个容器”; Docker 文档中的Networking in Compose 描述了如何连接到其他容器。在现代 Docker 中,您根本不需要 links:

标签: docker docker-compose docker-swarm


【解决方案1】:

使用 compose 时,请尝试使用容器主机名。在这种情况下,您的机器人应该尝试连接

服务器:8080

Compose 将处理名称解析到您需要的 IP

【讨论】:

    【解决方案2】:

    您的bot 容器在之前您的服务器和数据库容器。 当您使用depends_on 时,它实际上是等待他们自己完成设置。 您应该尝试一些棘手的算法来等待其他容器完成设置。 我记得当我使用 Nginx 代理时,我使用了一个名为 wait-for-it.sh

    【讨论】:

      【解决方案3】:

      您尝试的是在您的容器(服务)bot 中访问 localhost。

      也许this answer 会帮你解决问题。听起来和你的问题很相似。


      但我想为您提供另一个解决方案:

      如果不需要从外部(从您的主机)访问容器表单,一种方法是使用 expose 功能和 docker 网络。

      expose 功能允许访问您网络中的其他容器

      公开端口而不将它们发布到主机 - 它们只能被链接的服务访问。只能指定内部端口。


      示例

      这个例子在做什么?

      几个非强制性的步骤

      1. 在您的 docker 容器中设置 静态 ip 这些步骤不是必需的,可以省略。但是,我喜欢这样做,因为您现在可以更好地控制网络。 您也可以通过容器的主机名(即容器名称或服务名称)访问容器

      需要的步骤如下:

      1. 这会暴露端口 8080,但不要发布它。
        expose:
              - 8080
        
      2. 允许静态ip配置的网络
        networks:
          vpcbr:
            driver: bridge
            ipam:
              config:
                - subnet: 10.5.0.0/16
        

      一个完整的文件可能如下所示:

      version: "3.8"
      services:
        first-service:
          image: <your-image>
          networks: 
            vpcbr:
              ipv4_address: 10.5.0.2
          expose:
            - 8080
      
        second-service:
           image: <your-image>
          networks: 
            vpcbr:
              ipv4_address: 10.5.0.3
          depends_on: 
            - first-service
      
      networks:
        vpcbr:
          driver: bridge
          ipam:
            config:
              - subnet: 10.5.0.0/16
      

      【讨论】:

        最近更新 更多