如何在docker-compose中将两个正在运行的容器彼此连接?

史蒂文·索卡(Steven Soekha)

因此,我有一个简单的Python Flask应用程序,其中有2个服务:应用程序和数据库。我希望应用程序(Flask应用程序)连接到数据库服务(PostgreSQL)。

现在,当我注释掉Application服务并运行时docker-compose up,它将启动端口5432上公开的Database服务。然后当我在本地运行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

config / connection.py

import psycopg2
import pandas

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

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

app.py

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不建议这样做,因为它可能会从将来的更新中删除。

非常感谢所有帮助!提前致谢。

rdas

postgres容器未在上运行localhostlocalhost应用容器是应用容器本身。

您需要使用docker网络上的postgres容器的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'
)

database撰写文件中的服务名称已通过撰写映射到容器IP。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何连接两个docker容器

docker-compose,如何检查容器是否正在运行最后一个映像?然后重新启动

如何复制正在运行的Docker容器

如何在两个 docker 容器之间建立桥接(连接被拒绝)

如何在Elixir中连接两个Docker容器的节点?

如何在单个容器中运行两个 Docker 映像?

访问正在运行的docker容器时重置连接

如何在两个不同的Docker容器中的两个Django应用之间建立连接?

如何连接在两个不同主机中运行的两个容器?

如何在docker-compose中将卷连接到docker容器

Docker 容器无法连接到我知道正在运行的另一个容器

连接两个Docker容器

连接两个Docker容器

如何在Docker中为正在运行的容器分配名称?

如何在正在运行的容器上从 docker for Windows 主机查看文件,反之亦然

如何区分Windows上两个正在运行的Java进程?

如何在运行的docker-compose容器中输入redis-server shell

如何在运行时更换 docker 容器

如何在两个docker容器(mssql和.net核心应用)之间进行通信拒绝连接127.0.0.1:1433

如何从一个Docker容器中获取正在运行的服务的列表

如何在 1 小时后从 docker compose 运行容器

如何将两个BLE模块彼此连接?

如何在docker-compose的不同文件夹中运行两个shell命令

如何在正在运行的systemd容器中运行命令

如何在gitlab-runner容器中运行的docker中的docker中运行docker-compose?

如何检查正在运行的Docker容器的fs

如何写入正在运行的Docker容器中的文件?

如何为正在运行的Docker容器禁用网络?

如何访问Nodemon登录正在运行的Docker容器