python - 使用 docker 时运行 postgres 容器

标签 python django docker cookiecutter-django

我在我的 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 容器。在那里,我尝试运行 psqlpsql -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/

相关文章:

python - Django中多个数据库的路由和中间件

python - 从 django 查看脚本运行 linux 命令

docker - 无法在部署在Docker上的应用程序上打开页面

docker - 在docker-compose中添加默认外部网络

Python: AttributeError: 'builtin_function_or_method' 对象没有属性 'sleep'

python - 需要 RDD 实例但返回类 'pyspark.rdd.PipelinedRDD'

python - 如何将图像保存到磁盘

python - 连接 Pandas 中同一索引的行值

django - 如何在 django 中创建自定义登录装饰器

docker - docker build 后如何测试容器或镜像?