首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在容器之间连接

无法在容器之间连接
EN

Stack Overflow用户
提问于 2018-12-12 04:09:40
回答 3查看 27.8K关注 0票数 6

我已经把密码写在这里了。https://github.com/vinceyoumans/achal

问题:在一个码头组合文件中的两个容器。一个是标准的邮政集装箱。第二个是goLang划痕容器。当postgres连接失败时,GoLang main.go文件将陷入恐慌。你可以在github上看到代码。

错误是:

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

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

main.go

代码语言:javascript
复制
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)
}

船坞-复合船坞

代码语言:javascript
复制
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?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-12 10:19:37

您的撰写文件中有一个错误。将自动为服务名称配置DNS别名,并为您的项目创建默认的停靠网络。因此,所需要的就是连接到服务名称,在您的示例中,该名称是"postgre“而不是"postgres”。要解决这个问题,请尝试以下撰写文件:

代码语言:javascript
复制
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"

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

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

票数 7
EN

Stack Overflow用户

发布于 2018-12-12 04:41:25

你错过了网络配置。如果要在容器之间进行通信,这是必需的。

代码语言:javascript
复制
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解析)从容器中看到每个服务。

票数 4
EN

Stack Overflow用户

发布于 2018-12-13 13:34:46

这个问题是docker_compose文件中的一个错误。我把postgres容器标记为postgre。解决了网络查找问题。如果我要删除这篇文章,请提出建议。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53735948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档