无法建立容器之间的连接

Iri*_*ngo 7 postgresql go docker-compose

我已在此处包含代码.. https://github.com/vinceyoumans/achal

问题: docker compose 文件中有两个容器。一种是标准的 Postgress 容器。第二个是 goLang Scratch 容器。当 postgres 连接失败时,GoLang main.go 文件会出现混乱。你可以在github上看到代码。

错误是:

拨打 tcp:在 127.0.0.11:53 上查找 postgres:没有这样的主机

请求: 查看 main.go 和 dockercompose 文件,看看这个网络出了什么问题。我缺少什么。

主程序

db, err := gorm.Open("postgres", "host='postgres' port=5432 user=docker dbname='docker' password='password'")

if err != nil {
    fmt.Println("============   exiting ==========")
    fmt.Println(err)
    panic("failed to connect database e")
    //  the error i get... dial tcp: lookup postgres on 127.0.0.11:53: no such host
    // panic("failed to connect database: " + err)
}
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

version: '3.6'
services:
  postgre:
    image: postgres:11.1-alpine
    ports:
      - '5432:5432'
    #network_mode: bridge
    #container_name: postgres
 
    environment:
      POSTGRES_USER: 'user'
      POSTGRES_PASSWORD: 'password'
      POSTGRESS_DB: 'db_amex01'
    volumes:
      - ./init:/docker-entrypoint-initdb.d/

  todo:
    build: ./go_amex/
    # ports:
    #   - "8000:8080"

# sudo docker-compose -f docker-compose.yml up

#  HELP:  how would I add the goLang service from this point?
Run Code Online (Sandbox Code Playgroud)

BMi*_*tch 10

您的撰写文件中有一个拼写错误。系统会自动为服务名称配置 DNS 别名,并且还会为您的项目创建默认的 docker 网络。因此,所需要的只是连接到服务名称,在您的情况下是“postgre”而不是“postgres”。要解决这个问题,请尝试这个撰写文件:

version: '3.6'
services:
  postgres:
    image: postgres:11.1-alpine
    ports:
      - '5432:5432'
    environment:
      POSTGRES_USER: 'user'
      POSTGRES_PASSWORD: 'password'
      POSTGRESS_DB: 'db_amex01'
    volumes:
      - ./init:/docker-entrypoint-initdb.d/

  todo:
    build: ./go_amex/
    # ports:
    #   - "8000:8080"
Run Code Online (Sandbox Code Playgroud)

有关撰写文件网络的更多详细信息,请参阅:https ://docs.docker.com/compose/networking/

请注意,您可能会看到的下一个错误是连接被拒绝。Compose 将同时启动两个容器,并且您的应用程序可能会在数据库完成启动之前运行。为了解决这个问题,您需要在应用程序代码中使用重试循环,重试之间有较短的延迟,并设置超时或重试限制。


小智 5

您缺少网络配置。如果您想在容器之间进行通信,这是必需的。

version: '3.6'
services:
  postgres: # you were missing the 's'
    image: postgres:11.1-alpine
    ports:
      - '5432:5432'
    networks:
      - mynet

    environment:
      POSTGRES_USER: 'user'
      POSTGRES_PASSWORD: 'password'
      POSTGRESS_DB: 'db_amex01'
    volumes:
      - ./init:/docker-entrypoint-initdb.d/

  todo:
    build: ./go_amex/
    ports:
      - "8000:8000" # I looked at your main.go file, it's port 8000!
    networks:
      - mynet

networks:
  mynet:
    driver: bridge
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用服务名称作为主机名来查看(通过 dns 解析)容器内的每个服务。

  • 从 compose 文件版本 2 及更高版本开始,如果您未定义网络,则会为项目或堆栈创建默认网络。https://docs.docker.com/compose/networking/ (3认同)
  • 网络:这里实际上需要吗?我知道 docker compose 的版本 3 中已经添加了一个网络。我在这里遇到问题:/sf/ask/3762103271/ Between-go-scratch-container-and-pg-container-how-to-reso (2认同)