【问题标题】:Cannot get connection between containers无法获得容器之间的连接
【发布时间】:2018-12-12 04:09:40
【问题描述】:

我已在此处包含代码.. 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 文件,看看这个网络出了什么问题。我缺少什么。

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?

【问题讨论】:

标签: postgresql go docker-compose


【解决方案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】:

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

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 解析)每个服务。

【讨论】:

【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2020-03-23
    • 1970-01-01
    • 2015-07-01
    • 2014-10-27
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多