docker-组成容器之间的连接

docker-compose connection between containers

我的机器人、服务器和数据库有 3 个容器。在 docker-compose up 之后,服务器和数据库正在运行。电报机器人确实收到请求并接受了这个错误: 获取“http://localhost:8080/user/”:拨打 tcp 127.0.0.1:8080: connect: connection refused

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

您的 bot 容器先于 服务器和数据库容器启动 。 当您使用 depends_on 时,实际上 而不是 等待他们完成设置主题。 您应该尝试一些棘手的算法来等待其他容器完成设置。 我记得当我使用 Nginx 代理时,我使用了一个叫做 wait-for-it.sh

的东西

您尝试访问容器(服务)中的本地主机bot

也许this answer能帮你解决问题。这听起来与您的问题相似。


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

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

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

Expose ports without publishing them to the host machine - they’ll only be accessible to linked services. Only the internal port can be specified.


例子

这个例子在做什么?

一些非强制性步骤

  1. 在你的 docker 容器中设置一个 static 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

使用 compose 时,请尝试使用容器主机名。以防您的机器人尝试连接到

服务器:8080

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