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 连接?”
我不知道我哪里弄错了。
- 容器"database"暴露了它的5432端口。
- 两个容器都在同一网络上,即 "web_app_default"。
- 套接字文件存在于 "web" 容器的
/var/run/postgresql
目录中。
有什么想法吗?
感谢您的回复,祝您有愉快的一天。
我认为发生的事情是,即使您将标志 depends_on
设置为 database
,这仅意味着 web
容器将在 database
容器之后启动开始。但是,对于第一次,数据库通常需要花费一些时间来设置,并且当您的 web
服务器启动时,数据库仍未准备好接受连接。
这里有 2 种解决问题的方法:
- 无需更改代码的简单方法:运行
docker-compose up -d
(detach
模式)并等待数据库完成初始化。然后再次 运行 docker-compose up -d
,您的 web
容器现在可以连接到数据库。
- 第二种方法是用
restart: always
更新 web
容器,这样 docker-compose
将继续尝试重新启动您的 web
容器,直到 运行 成功(直到数据库准备好接受连接)
version: "3"
services:
web:
depends_on:
- database
...
restart: always
...
我想要一个 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 连接?”
我不知道我哪里弄错了。
- 容器"database"暴露了它的5432端口。
- 两个容器都在同一网络上,即 "web_app_default"。
- 套接字文件存在于 "web" 容器的
/var/run/postgresql
目录中。
有什么想法吗?
感谢您的回复,祝您有愉快的一天。
我认为发生的事情是,即使您将标志 depends_on
设置为 database
,这仅意味着 web
容器将在 database
容器之后启动开始。但是,对于第一次,数据库通常需要花费一些时间来设置,并且当您的 web
服务器启动时,数据库仍未准备好接受连接。
这里有 2 种解决问题的方法:
- 无需更改代码的简单方法:运行
docker-compose up -d
(detach
模式)并等待数据库完成初始化。然后再次 运行docker-compose up -d
,您的web
容器现在可以连接到数据库。 - 第二种方法是用
restart: always
更新web
容器,这样docker-compose
将继续尝试重新启动您的web
容器,直到 运行 成功(直到数据库准备好接受连接)
version: "3"
services:
web:
depends_on:
- database
...
restart: always
...