无法获得容器之间的连接

时间:2018-12-12 04:09:40

标签: postgresql go docker-compose

更新分辨率

问题是docker_compose文件中的错字。我将postgres容器标记为postgre。这解决了网络查找问题。请咨询我是否应该删除此帖子。

我在这里包括了代码。 https://github.com/vinceyoumans/achal

问题:泊坞窗中的两个容器组成文件。一种是标准的Postgress容器。第二个是goLang Scratch容器。当postgres连接失败时,GoLang main.go文件会出现混乱。您可以在github上查看代码。

错误是:

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

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

main.go

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.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?

3 个答案:

答案 0 :(得分:2)

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

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解析从容器中查看每个服务。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

问题是docker_compose文件中的错字。我将postgres容器标记为postgre。这解决了网络查找问题。请咨询我是否应该删除此帖子。