容器之间的 docker-compose 连接

docker-compose connection between containers

提问人:SerGO 提问时间:11/28/2020 更新时间:11/28/2020 访问量:2620

问:

我有 3 个容器,里面有我的机器人、服务器和数据库。docker-compose 启动后,服务器和数据库正在工作。Telegram Bot 执行 get-request 并出现以下错误: 获取“http://localhost:8080/user/”:拨打 tcp 127.0.0.1:8080:连接:连接被拒绝

docker-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
docker-compose docker-swarm

评论

0赞 morpheuz 11/28/2020
我们只能从中看出,显然没有进程在 localhost:8080 上侦听。请考虑提供有关机器人 docker 映像的更多信息,以帮助你,了解它的配置方式,或者你是否使用任何库或框架来开发机器人。此外,使用 和 选项似乎是多余的。depends_onlinks
1赞 David Maze 11/28/2020
localhost在 Docker 中几乎总是表示“这个容器”;Docker 文档中的 Compose 中的网络介绍了如何连接到其他容器。在现代 Docker 中,您根本不需要。links:

答:

0赞 Nir Gofman 11/28/2020 #1

你的容器在你的服务器和数据库容器之前启动。 当您使用时,它不会等待他们完成设置主题。 您应该尝试一些棘手的算法来等待其他容器完成设置。 我记得当我使用 Nginx 代理时,我使用了一种叫做 wait-for-it.shbotdepends_on

3赞 agentsmith 11/28/2020 #2

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

也许这个答案会帮助你解决问题。这听起来与您的问题相似。


但我想为你的问题提供另一种解决方案:

如果不需要从外部(从您的主机)访问容器,那么一个应用就是使用该功能和 docker 网络。expose

该功能允许访问网络中的其他容器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
3赞 Henrique Capozzi 11/28/2020 #3

使用 compose 时,请尝试使用容器主机名。如果机器人应尝试连接到

服务器:8080

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