Docker 公开容器之间的端口

Docker expose ports between containers

我想要一个 python 带有 postgresql 数据库 (psycopg2) 的烧瓶应用程序 运行。所以我制作了这个 docker-compose 文件:

version: "3"
services:
  web:
    depends_on:
      - database
    container_name: web
    build:
      context: "."
      dockerfile: "docker/Dockerfile.web"
    ports:
      - 5000:5000
    volumes:
      - database:/var/run/postgresql
  database:
    container_name: database
    environment:
      POSTGRES_PASSWORD: "password"
      POSTGRES_USER: "user"
      POSTGRES_DB: "products"
    image: postgres
    expose:
    - 5432
    volumes:
    - database:/var/run/postgresql
volumes:
  database:

在我的 app.py 中,我尝试像这样连接到 postgres:

conn = psycopg2.connect(database="products", user="user", password="password", host="database", port="5432")

当我 运行 docker-compose up 我得到以下错误:
服务器 运行 是否在主机 "database" (172.21.0.2) 上并在端口 5432 上接受 TCP/IP 连接?

我不知道我哪里弄错了。

有什么想法吗?

感谢您的回复,祝您有愉快的一天。

我认为发生的事情是,即使您将标志 depends_on 设置为 database,这仅意味着 web 容器将在 database 容器之后启动开始。但是,对于第一次,数据库通常需要花费一些时间来设置,并且当您的 web 服务器启动时,数据库仍未准备好接受连接。

这里有 2 种解决问题的方法:

  1. 无需更改代码的简单方法:运行 docker-compose up -ddetach 模式)并等待数据库完成初始化。然后再次 运行 docker-compose up -d,您的 web 容器现在可以连接到数据库。
  2. 第二种方法是用 restart: always 更新 web 容器,这样 docker-compose 将继续尝试重新启动您的 web 容器,直到 运行 成功(直到数据库准备好接受连接)
version: "3"
services:
  web:
    depends_on:
      - database
    ...
    restart: always
    ...