簡體   English   中英

如何在docker-compose中將2個正在運行的容器相互連接?

[英]How to connect 2 running containers to each other in docker-compose?

所以我有這個簡單的 Python Flask 應用程序,其中有 2 個服務:應用程序和數據庫。 我希望應用程序(Flask 應用程序)連接到數據庫服務(PostgreSQL)。

現在,當我注釋掉應用程序服務並運行docker-compose up ,它會啟動在端口 5432 上公開的數據庫服務。然后當我在本地運行 Flask 應用程序並嘗試連接時,它可以工作。

現在我取消注釋應用程序服務並運行docker-compose up --build 它構建並啟動這兩個服務。 但是當我訪問http://localhost:5000 時,應用程序由於連接錯誤(拒絕)而崩潰

docker-compose.yml

version: '3.7'
services:
  application:
    depends_on:
      - database
    build: ./core
    restart: always
    networks:
      - cbr-open-data
    ports:
      - 5000:5000
    environment:
      FLASK_ENV: development
    volumes:
      - ./core:/app

  database:
    image: postgres
    restart: always
    networks:
      - cbr-open-data
    environment: 
      POSTGRES_USER:      ${DATABASE_USER}
      POSTGRES_PASSWORD:  ${DATABASE_PASSWORD}
      POSTGRES_DB:        ${DATABASE_NAME}
    ports:
      - 5432:5432
    volumes:
      - ./database:/var/lib/postgresql/data

networks:
  cbr-open-data:
    driver: bridge

配置/連接.py

import psycopg2
import pandas

connection = psycopg2.connect(
    host = 'localhost',
    database = '...',
    user = '...',
    password = '...',
    port='5432'
)

users = pandas.read_sql('SELECT * FROM users', connection)

應用程序

from flask import Flask, render_template
from config.connection import users

app = Flask(__name__)

@app.route('/')
def index():
    print(users)
    return render_template('index.html')

if __name__ == '__main__':
    app.run(debug=True)

錯誤

➜  cbr-open-data git:(master) ✗ docker-compose up
Creating network "cbr-open-data_cbr-open-data" with driver "bridge"
Creating cbr-open-data_database_1 ... done
Creating cbr-open-data_application_1 ... done
Attaching to cbr-open-data_database_1, cbr-open-data_application_1
application_1  |  * Environment: development
application_1  |  * Debug mode: on
application_1  |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
application_1  |  * Restarting with stat
application_1  |  * Debugger is active!
application_1  |  * Debugger PIN: 159-218-115
database_1     | 
database_1     | PostgreSQL Database directory appears to contain a database; Skipping initialization
database_1     | 
database_1     | 2020-02-09 18:10:37.188 UTC [1] LOG:  starting PostgreSQL 12.1 (Debian 12.1-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
database_1     | 2020-02-09 18:10:37.189 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
database_1     | 2020-02-09 18:10:37.189 UTC [1] LOG:  listening on IPv6 address "::", port 5432
database_1     | 2020-02-09 18:10:37.192 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
database_1     | 2020-02-09 18:10:37.303 UTC [27] LOG:  database system was shut down at 2020-02-09 13:21:34 UTC
database_1     | 2020-02-09 18:10:37.330 UTC [1] LOG:  database system is ready to accept connections

THIS IS WHEN I VISIT THE FLASK APP ON 5000.

application_1  | 172.28.0.1 - - [09/Feb/2020 18:10:41] "GET / HTTP/1.1" 500 -
application_1  | Traceback (most recent call last):
application_1  |   File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
application_1  |     raise value
application_1  |   File "/app/app.py", line 2, in <module>
application_1  |     from config.connection import users
application_1  |   File "/app/config/connection.py", line 9, in <module>
application_1  |     port='5432'
application_1  |   File "/usr/local/lib/python3.7/site-packages/psycopg2/__init__.py", line 126, in connect
application_1  |     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
application_1  | psycopg2.OperationalError: could not connect to server: Connection refused
application_1  |        Is the server running on host "localhost" (127.0.0.1) and accepting
application_1  |        TCP/IP connections on port 5432?
application_1  | could not connect to server: Cannot assign requested address
application_1  |        Is the server running on host "localhost" (::1) and accepting
application_1  |        TCP/IP connections on port 5432?
application_1  | 172.28.0.1 - - [09/Feb/2020 18:10:41] "GET /?__debugger__=yes&cmd=resource&f=style.css HTTP/1.1" 200 -
application_1  | 172.28.0.1 - - [09/Feb/2020 18:10:41] "GET /?__debugger__=yes&cmd=resource&f=debugger.js HTTP/1.1" 200 -
application_1  | 172.28.0.1 - - [09/Feb/2020 18:10:41] "GET /?__debugger__=yes&cmd=resource&f=jquery.js HTTP/1.1" 200 -
application_1  | 172.28.0.1 - - [09/Feb/2020 18:10:42] "GET /?__debugger__=yes&cmd=resource&f=ubuntu.ttf HTTP/1.1" 200 -
application_1  | 172.28.0.1 - - [09/Feb/2020 18:10:42] "GET /?__debugger__=yes&cmd=resource&f=console.png HTTP/1.1" 200 -

有人可以解釋為什么數據庫服務拒絕來自應用程序服務的連接但在我本地運行應用程序時接受連接嗎? 我想獲得更好的理解,絕對是為了未來的實踐。

我已經嘗試過的

  • 將這兩個服務添加到自創網絡 (cbr-open-data)。 但仍然沒有解決辦法。
  • 看到該link是可能的,但 docker 不推薦它,因為它可以從未來的更新中刪除。

非常感謝所有幫助! 提前致謝。

postgres 容器未在localhost運行。 應用程序容器的localhost是應用程序容器本身。

您需要使用 docker 網絡上的 postgres 容器的 IP(您的兩個容器都屬於該 IP)。

您可以使用 docker-compose 內置 DNS 來獲取 IP。 簡單替換:

connection = psycopg2.connect(
    host = 'localhost',
    database = '...',
    user = '...',
    password = '...',
    port='5432'
)

和:

connection = psycopg2.connect(
    host = 'database',
    database = '...',
    user = '...',
    password = '...',
    port='5432'
)

compose 文件中的服務名稱database通過 compose 映射到容器 IP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM