2017-04-26 157 views
1

我有一个使用golang构建的web服务器。当我在本地测试它时,它工作正常。无法连接到来自Golang容器的Postgres docker容器

但是,当我为我的Web服务器构建Docker镜像时,它无法连接到正在运行的Postgres容器。

这里是我的docker-compose.yml

version: '2' 
services: 
    go: 
     image: golang:1.7 
     volumes: 
      - ./:/server/http 
     ports: 
      - "80:8080" 
     links: 
      - postgres 
      - mongodb 
      - redis 
     environment: 
      DEBUG: 'true' 
      PORT: '8080' 

    postgres: 
     image: onjin/alpine-postgres:9.5 
     restart: unless-stopped 
     ports: 
      - "5432:5432" 
     environment: 
      LC_ALL: C.UTF-8 
      POSTGRES_USER: user 
      POSTGRES_PASSWORD: pass 
      POSTGRES_DB: mydb 
    mongodb: 
     image: mvertes/alpine-mongo:3.2.3 
     restart: unless-stopped 
     ports: 
      - "27017:27017" 

    redis: 
     image: sickp/alpine-redis:3.2.2 
     restart: unless-stopped 
     ports: 
      - "6379:6379" 

Dockerfile

FROM golang:1.7 

RUN mkdir -p /home/app 

WORKDIR /home/app 

COPY . /home/app 

RUN make deps && make 

ENTRYPOINT ["./bin/api-test"] 

EXPOSE 8080 

我使用的Postgres的连接字符串:

postgresql://user:[email protected]/mydb?sslmode=disable 

对于主机,我尝试localhost并返回出现以下错误:

dial tcp [::1]:5432: getsockopt: connection refused 

尝试postgres,它返回下列信息:

dial tcp 202.71.99.194:5432: getsockopt: connection refused 

试过IP地址,我得到运行此命令将返回172.19.0.3

docker inspect apitest_postgres_1 | grep IPAddress 

其中apitest_postgres_1是Postgres的容器名称。它也返回了这个错误:

dial tcp 172.19.0.3:5432: getsockopt: connection timed out 

你能告诉我我在这里失踪了吗?我对码头工人没有经验,而且这花了很长时间调查解决方案。

编辑: 我运行使用此命令我golang泊坞窗:

docker run --env-file ./example.env --rm -it -p 8080:8080 api-test 

example.env是该文件包含我的环境瓦尔。

编辑2: 我改变了连接字符串如下:

postgresql://user:[email protected]:5432?sslmode=disable 

它返回以下错误:

dial tcp: lookup postgres on 192.168.65.1:53: no such host 

我得到的想法,我的Mac是问题在这里。我的默认DNS是8.8.8.8,这不应该是一个问题。

+0

你有没有尝试在url中设置'postgres'作为主机'postgresql:// user:secret @ postgres/mydb?sslmode = disable'?与服务名称相同。 –

+0

@Зелёныйyup试过了,它返回了以下错误:'拨号tcp 202.71.99.194:5432:getsockopt:连接被拒绝' –

+0

您确定您允许Postgres'pg_hba.conf'中的TCP/IP网络上的所有连接吗? –

回答

2

看起来就像你去拉图像,而不是建立你自己的形象。

而不是image: golang:1.7build: .代替它来构建和使用您的Dockerfile

你也可能需要通过Postgres的环境变量DB_HOSTDB_USERDB_PASS等就可以实现这一点,但在创建例如docker.env文件,然后添加env_file你去应用下docker-compose.yml文件:

例docker.env:

DB_HOST=postgres 
DB_USER=user 
DB_PASS=pass 
DB_NAME=mydb 

更正泊坞窗,compose.yml:

version: '2' 
services: 
    app: 
     build: . 
     volumes: 
      - ./:/server/http 
     ports: 
      - "80:8080" 
     links: 
      - postgres 
      - mongodb 
      - redis 
     environment: 
      DEBUG: 'true' 
      PORT: '8080' 
     env_file: 
      - docker.env 

    postgres: 
     image: onjin/alpine-postgres:9.5 
     restart: unless-stopped 
     ports: 
      - "5432:5432" 
     environment: 
      LC_ALL: C.UTF-8 
      POSTGRES_USER: user 
      POSTGRES_PASSWORD: pass 
      POSTGRES_DB: mydb 

    mongodb: 
     image: mvertes/alpine-mongo:3.2.3 
     restart: unless-stopped 
     ports: 
      - "27017:27017" 

    redis: 
     image: sickp/alpine-redis:3.2.2 
     restart: unless-stopped 
     ports: 
      - "6379:6379" 
0

看看一本手册:https://docs.docker.com/engine/userguide/networking/default_network/configure-dns/

之后,关于你泊坞窗,撰写文件,通过“Postgres的”在你的连接字符串替换“主机”的链接:

postgresql://user:[email protected]/mydb?sslmode=disable 

让嵌入式DNS服务器执行映射工作,因为每当您重新创建容器时,IP地址可能会更改。

此外,确保Postgres允许连接(也许仅限于本地主机)

相关问题