簡體   English   中英

無法從另一個容器中的 web 應用程序訪問 docker 中的 postgres

[英]Unable to access postgres in docker from web app in another container

我有一個示例應用程序,我正在使用 docker-compose 在我的機器上本地運行。 web 應用程序位於一個容器中,而數據庫(postgres)位於另一個容器中。

我遇到了無法解決的連接問題。

docker-compose

version: '3.8'


services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: 'password'
      POSTGRES_DB: 'postgres'
      POSTGRES_USER: 'postgres'
    volumes:
      - ./postgres-db:/var/lib/postgresql/data
    ports:
      - '5432:5432'
  app:
    build:
      context: .
      dockerfile: app/Dockerfile
    restart: always
    environment:
      APP_FRONTEND_PORT: '8080'
      DB_PORT: '5433'
      DB_HOST: 'db'
    ports:
      - '8080:8080'
    depends_on:
      - 'db'

volumes:
    postgres-db:

Dockerfile

FROM golang:latest
WORKDIR /scratch
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build  -o /bin/frontend ./...

FROM alpine:latest

RUN apk --no-cache add ca-certificates
WORKDIR /go/bin/
COPY --from=build /bin/frontend /go/bin/frontend
ENTRYPOINT ["/go/bin/frontend"]

兩個容器都在運行,我能夠登錄到正在運行的 postgres 容器並且 postgres 我們正在運行。

當我嘗試從美國運行更新時,我收到 500 錯誤,並且 app 容器似乎無法與 db 容器通信。 我不確定我錯過了什么

嘗試調用更新日期時出現客戶端錯誤:

encountered err: failed to begin transaction: failed to connect to `host=db user=postgres database=postgres`: dial error (dial tcp 172.29.0.2:5433: connect: connection refused)

docker ps產量:

$ docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED          STATUS          PORTS                                       NAMES
19eeed869434   sample_app   "/go/bin/frontend"       48 minutes ago   Up 48 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   sample_app_1
84804f00c751   postgres            "docker-entrypoint.s…"   48 minutes ago   Up 48 minutes   0.0.0.0:5432->5432/tcp, :::5432->5432/tcp   sample_app_db_1
$ 

根據https://docs.docker.com/network/bridge/中的說明,您需要將兩個服務放入用戶定義的橋接網絡中,以便它們通過容器名稱相互引用。 以下是如何在docker-compose.yml中執行此操作:

  1. 定義自定義橋接網絡:
networks:
  some-name:
    driver: bridge
  1. 將兩種服務都放入該網絡:
services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: 'password'
      POSTGRES_DB: 'postgres'
      POSTGRES_USER: 'postgres'
    volumes:
      - ./postgres-db:/var/lib/postgresql/data
    ports:
      - '5432:5432'
    networks:
      - some-name
  app:
    build:
      context: .
      dockerfile: app/Dockerfile
    restart: always
    environment:
      APP_FRONTEND_PORT: '8080'
      DB_PORT: '5433'
      DB_HOST: 'db'
    ports:
      - '8080:8080'
    depends_on:
      - 'db'
    networks:
      - some-name
  1. 強制指定容器名稱,尤其是另一個容器名稱,否則 docker-compose 將在服務名稱中添加前綴和后綴作為容器名稱,例如sample_app_db_1
services:
  db:
    container_name: db
    image: postgres
    environment:
      POSTGRES_PASSWORD: 'password'
      POSTGRES_DB: 'postgres'
      POSTGRES_USER: 'postgres'
    volumes:
      - ./postgres-db:/var/lib/postgresql/data
    ports:
      - '5432:5432'
    networks:
      - some-name

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM