【问题标题】:Can not connect to postgresql which is inside of a docker container无法连接到 docker 容器内的 postgresql
【发布时间】:2017-05-04 14:56:16
【问题描述】:

我正在编写一个在 2 个容器中 dockerized 的 go 应用程序:db 和 app。

在启动容器 'docker-compose up' 时,我看到消息:dial tcp: lookup dbpgsql on 127.0.0.11:53: no such host

DB_ENV_DB=cldb
DB_ENV_USER=cldb
DB_ENV_PASS=cldb
DB_PORT_5432_TCP_ADDR=dbpgsql
DB_PORT_5432_TCP_PORT=5432

这是我的 docker-compose.yml

version: '2'
services:
  server:
    hostname: app
    image: golang:1.7.3-alpine
    build: ./server/
    privileged: true
    container_name: server
    command: go run server.go
    volumes:
      - ../src/:/go/src/
      - ../server.go:/go/server.go
    links:
      - db:db
    ports:
     - '8080:8080'
   env_file: environment

 db:
   hostname: dbpgsql
   image: postgres:latest
   container_name: db
   environment:
      POSTGRES_USER: cldb
      POSTGRES_PASSWORD: cldb
      POSTGRES_DB: cldb
    ports:
      - '5432:5432'
   volumes:
     - ./data:/docker-entrypoint-initdb.d

执行 DB.Ping() 时应用程序在此处失败:

func InitDB(dataSourceName string) {
    var err error
    DB, err = sql.Open("postgres", dataSourceName)
    if err != nil {
       log.Panic(err)
    }

    if err = DB.Ping(); err != nil {
       log.Panic(err)
    }

    DB.SetMaxIdleConns(100)
}

【问题讨论】:

  • 你不需要在你的 docker 镜像中映射端口 53 吗?

标签: postgresql go docker docker-compose


【解决方案1】:

您可以使用服务名称(或链接选项中给出的别名)连接到数据库,在您的情况下它是db。 Hostname 选项设置容器认识自己的主机名。但它不会出现在 docker ps 中,也不会出现在任何其他容器的 /etc/hosts 文件中。 (https://docs.docker.com/engine/userguide/networking/default_network/configure-dns/)

【讨论】:

    【解决方案2】:

    就我而言,我在我的 post-gres 服务中使用 container_name,这就是在应用程序中连接到 db 时需要设置为主机名的内容

    【讨论】:

      猜你喜欢
      • 2021-08-10
      • 2019-12-19
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 2022-01-11
      • 2020-03-24
      • 2020-11-20
      • 2021-04-05
      相关资源
      最近更新 更多