我在我的 django 项目中使用了 cookiecutter-django
。我正在使用 docker 在本地运行该项目。该项目运行良好。但是,我在使用 docker 时无法探索 postgres。
这是我运行该项目所遵循的步骤
docker-compose -f local.yml build
docker-compose -f local.yml up -d
docker-compose run django python manage.py makemigrations
docker-compose run django python manage.py migrate
local.yml 如下所示
version: '3'
volumes:
local_postgres_data: {}
local_postgres_data_backups: {}
services:
django: &django
build:
context: .
dockerfile: ./compose/local/django/Dockerfile
image: travel_local_django
depends_on:
- postgres
- mailhog
volumes:
- .:/app
env_file:
- ./.envs/.local/.django
- ./.envs/.local/.postgres
ports:
- "8000:8000"
command: /start
postgres:
build:
context: .
dockerfile: ./compose/production/postgres/Dockerfile
image: travel_production_postgres
volumes:
- local_postgres_data:/var/lib/postgresql/data
- local_postgres_data_backups:/backups
env_file:
- ./.envs/.local/.postgres
compose/production/postgres/Dockerfile
FROM postgres:11.3
COPY ./compose/production/postgres/maintenance /usr/local/bin/maintenance
RUN chmod +x /usr/local/bin/maintenance/*
RUN mv /usr/local/bin/maintenance/* /usr/local/bin \
&& rmdir /usr/local/bin/maintenance
.envs/.local/.postgres
# PostgreSQL
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
POSTGRES_DB=simplifytour
POSTGRES_USER=debug
POSTGRES_PASSWORD=debug
当我执行docker-compose -f local.yml ps
时,我得到了与该项目相关的容器。然后,我使用命令 docker exec -it Travel_postgres_1 sh 执行 postgres 容器。在那里,我尝试运行 psql
、psql -U postgres
这样的命令,但对我来说没有任何作用。我想探索 postgres,比如列出表、连接到数据库等。
我错过了什么步骤吗?如何使用 postgres 容器?
最佳答案
TL;DR
如果您想访问容器式 postgres 安装,您必须将端口映射添加到您的配置中:
postgres:
build:
context: .
dockerfile: ./compose/production/postgres/Dockerfile
image: travel_production_postgres
volumes:
- local_postgres_data:/var/lib/postgresql/data
- local_postgres_data_backups:/backups
env_file:
- ./.envs/.local/.postgres
ports:
- "5432:5432"
请注意最后两行中如何添加端口映射。
如果您有本地 postgres 安装,您可能需要使用不同的主机端口(例如 "8001:5432"
)。更多详细信息请参见下文。
更改将在容器重新启动后生效:docker-compose -f local.yml up
。无需单独启动 postgres 容器(由于 django 服务中的 depends_on: -postgres
设置,每当 django 服务启动时,docker 都会启动该容器)。
说明:
对 ports 部分的更改允许您连接到端口 5432 并访问容器中绑定(bind)到同一端口的服务。端口的顺序是 "HOST_PORT:CONTAINER_PORT"
,这使得将不同的端口相互映射成为可能。如果例如您已经在本地安装并运行了 postgres(因此在您的主机上),这可能是必要的。当您的本地 postgres 安装已经使用端口 5432 时,您可以将容器公开到不同的端口,这样仍然可以区分和访问两个 postgres 实例。
为什么默认情况下 postgres 不可用?
如果只是为了 django,由于 docker compose 的工作方式,转发这些端口是不必要的:
"By default Compose sets up a single network for your app. Each container for a service joins the default network and is both reachable by other containers on that network, and discoverable by them at a hostname identical to the container name."
来自 docker 文档:Networking in Compose
因此,由于 docker compose 完成的网络处理,django 容器无需任何端口转发即可到达 postgres 容器。为了使主机能够访问端口,必须显式转发该端口(例如使用 django 服务本身完成的操作,以允许在端口 8080 下访问开发服务器)。
旁注:虽然您可以安全地更改本地配置,但要小心对生产配置的更改。您使用的每个额外端口也可能被滥用。因此,如果您了解(安全)后果,请仅在此处添加端口。
关于python - 使用 docker 时运行 postgres 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57293321/