无法连接到位于 Docker 容器内部的 PostgreSQL。

huangapple go评论129阅读模式
英文:

Can not connect to postgresql which is inside of a docker container

问题

我正在编写一个使用两个容器(db和app)进行Docker化的Go应用程序。

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

以下是我的docker-compose.yml文件内容:

  1. version: '2'
  2. services:
  3. server:
  4. hostname: app
  5. image: golang:1.7.3-alpine
  6. build: ./server/
  7. privileged: true
  8. container_name: server
  9. command: go run server.go
  10. volumes:
  11. - ../src/:/go/src/
  12. - ../server.go:/go/server.go
  13. links:
  14. - db:db
  15. ports:
  16. - '8080:8080'
  17. env_file: environment
  18. db:
  19. hostname: dbpgsql
  20. image: postgres:latest
  21. container_name: db
  22. environment:
  23. POSTGRES_USER: cldb
  24. POSTGRES_PASSWORD: cldb
  25. POSTGRES_DB: cldb
  26. ports:
  27. - '5432:5432'
  28. volumes:
  29. - ./data:/docker-entrypoint-initdb.d

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

  1. func InitDB(dataSourceName string) {
  2. var err error
  3. DB, err = sql.Open("postgres", dataSourceName)
  4. if err != nil {
  5. log.Panic(err)
  6. }
  7. if err = DB.Ping(); err != nil {
  8. log.Panic(err)
  9. }
  10. DB.SetMaxIdleConns(100)
  11. }

希望这能帮到你!

英文:

I'm writing a go app which is dockerized in 2 containers: db and app.

while starting containers 'docker-compose up' I see the message: dial tcp: lookup dbpgsql on 127.0.0.11:53: no such host

  1. DB_ENV_DB=cldb
  2. DB_ENV_USER=cldb
  3. DB_ENV_PASS=cldb
  4. DB_PORT_5432_TCP_ADDR=dbpgsql
  5. DB_PORT_5432_TCP_PORT=5432

here is my docker-compose.yml

  1. version: '2'
  2. services:
  3. server:
  4. hostname: app
  5. image: golang:1.7.3-alpine
  6. build: ./server/
  7. privileged: true
  8. container_name: server
  9. command: go run server.go
  10. volumes:
  11. - ../src/:/go/src/
  12. - ../server.go:/go/server.go
  13. links:
  14. - db:db
  15. ports:
  16. - '8080:8080'
  17. env_file: environment
  18. db:
  19. hostname: dbpgsql
  20. image: postgres:latest
  21. container_name: db
  22. environment:
  23. POSTGRES_USER: cldb
  24. POSTGRES_PASSWORD: cldb
  25. POSTGRES_DB: cldb
  26. ports:
  27. - '5432:5432'
  28. volumes:
  29. - ./data:/docker-entrypoint-initdb.d

The app fails here when DB.Ping() is executed:

  1. func InitDB(dataSourceName string) {
  2. var err error
  3. DB, err = sql.Open("postgres", dataSourceName)
  4. if err != nil {
  5. log.Panic(err)
  6. }
  7. if err = DB.Ping(); err != nil {
  8. log.Panic(err)
  9. }
  10. DB.SetMaxIdleConns(100)
  11. }

答案1

得分: 4

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

英文:

You can connect to database with the service name (or alias name given in links options), in your case it's db. Hostname option sets the hostname by which the container knows itself. But it will not appear in docker ps nor in the /etc/hosts file of any other container. (https://docs.docker.com/engine/userguide/networking/default_network/configure-dns/)

答案2

得分: 0

在我的情况下,我在我的PostgreSQL服务中使用了container_name,这就是在应用程序连接到数据库时需要设置为主机名的内容。

英文:

In my case, I was using container_name in my post-gres service and thats what was required to be set as hostname while connecting to db in application

huangapple
  • 本文由 发表于 2016年12月19日 22:18:38
  • 转载请务必保留本文链接:https://go.coder-hub.com/41224582.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定