为了账号安全,请及时绑定邮箱和手机立即绑定

无法在容器之间建立连接

无法在容器之间建立连接

Go
慕容708150 2023-05-15 15:15:42
我在这里包含了代码.. 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)}docker-compose.ymlversion: '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?
查看完整描述

3 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

您的撰写文件中有错字。为服务名称自动配置 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"


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


查看完整回答
反对 回复 2023-05-15
?
12345678_0001

TA贡献1802条经验 获得超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

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


查看完整回答
反对 回复 2023-05-15
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

问题是 docker_compose 文件中的拼写错误。将 postgres 容器标记为 postgre。这解决了网络查找问题。



查看完整回答
反对 回复 2023-05-15
  • 3 回答
  • 0 关注
  • 209 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信