连接到Docker容器上的PostgreSQL数据库

我想在不同的Docker容器上运行一个PostgreSQL数据库和一个由Django支持的REST API的应用程序。 到目前为止,API已经在连接到SQLite数据库的Docker上运行,但是现在我遇到了麻烦,我想连接到PostgreSQL数据库。

Docker的docker-compose.yml文件:

 version: '2' services: postgres: image: postgres api: build: . command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:1337" volumes: - .:/usr/src/app ports: - "1337:1337" depends_on: - postgres 

Django的settings.py (根据文档使用基本postgres映像的默认设置):

 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'wgomanager', 'USER': 'postgres', 'PASSWORD': 'mysecretpassword', 'HOST': 'localhost', 'PORT': '5432', } } 

当我用docker-compose up启动应用程序docker-compose up最终引发这个错误:

 api_1 | connection = Database.connect(**conn_params) api_1 | File "/usr/local/lib/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect api_1 | conn = _connect(dsn, connection_factory=connection_factory, **kwasync) api_1 | django.db.utils.OperationalError: could not connect to server: Connection refused api_1 | Is the server running on host "localhost" (::1) and accepting api_1 | TCP/IP connections on port 5432? api_1 | could not connect to server: Connection refused api_1 | Is the server running on host "localhost" (127.0.0.1) and accepting api_1 | TCP/IP connections on port 5432? api_1 | orchestrator_api_1 exited with code 1 

我究竟做错了什么?

当使用docker-compose时,通过主机名“发现”服务。 您的数据库服务使用标签postgres定义。 将其用作应用程序configuration中的主机名。

密码和数据库名称也必须与您的应用程序configuration同步。 这是通过postgres服务的环境variables完成的:

 services: postgres: environment: - POSTGRES_PASSWORD: "mysecretpassword" - POSTGRES_DB: "wgomanager" # rest of docker-compose.yml 

请参考关于各种环境的文档 。 variables影响服务configuration。