【问题标题】:How to connect 2 docker compontens within the same docker-compose.yaml如何在同一个 docker-compose.yml 中连接 2 个 docker 组件
【发布时间】:2022-01-06 19:18:39
【问题描述】:

我是 docker 世界的新手,我在如何连接 2 个 docker 服务方面遇到了一些问题。

我使用https://memgraph.com/ 作为我的数据库,当我在本地运行它时,我会像这样运行它

docker run -it -p 7687:7687 -p 3000:3000 memgraph/memgraph-platform

我编写了我的程序,该程序将使用 mgclient 连接到数据库,当我在本地运行它时,一切正常。

现在我正在尝试放入 docker 容器并使用 docker-compose.yaml 运行它

我的 docker-compose.yaml 是:

version: "3.5"
services:
  memgraph:
    image: memgraph/memgraph-platform:2.1.0
    container_name: memgraph_container
    restart: unless-stopped
    ports:
      - "7687:7687"
      - "3000:3000"
  my_app:
    image: memgraph_docker
    container_name: something
    restart: unless-stopped
    command: python main.py

当我尝试使用此命令运行它时:

码头工人组成

我收到与服务器连接有关的错误。谁能告诉我关于 docker-compose.yaml 我缺少什么?

【问题讨论】:

  • 根据 docker-compose 没有错
  • 看起来不错; container_name: 设置是不必要的,您可能不需要覆盖应用程序的 command:,但在网络方面并没有什么特别的问题。实际的错误是什么?应用程序如何连接到数据库?您是否阅读过 Docker 文档中的 Networking in Compose 等背景资料?

标签: python python-3.x docker docker-compose dockerfile


【解决方案1】:

你的my_app如何连接数据库?

您是否使用localhost:7687(或者localhost:3000)形式的连接字符串?这将在本地工作,因为您将容器的端口 76873000 发布(--publish=7687:7687 --publish=3000:3000)到主机端口(使用相同的端口)。

注意您可以在docker run 时重新映射端口。例如,您可以--publish=9999:7686,然后您需要使用本地主机上的端口9999 来访问容器的端口7687

当您使用 Docker Compose 组合这 2 个容器时,会为每个容器指定一个与服务名称相匹配的名称。在这种情况下,您的 Memgraph 数据库称为 memgraph(与 service 名称匹配)。

使用 Docker Compose,localhost 具有不同的含义。从my_applocalhostmy_app。因此,在 Docker Compose 下使用 localhostmy_app 将尝试连接到自己而不是数据库。

在 Docker Compose 下,对于 my_app(您的应用程序的名称),您需要通过其服务名称 (memgraph) 引用 Memgraph。 76873000 的端口将保持不变(以正确者为准)。

注意您的 Docker Compose 配置中的 ports 语句可能是多余的 *除非您希望能够从您的(本地)主机(其中您可以进行调试)。从最佳实践的角度来看,一旦my_app 能够正确访问数据库,您就不需要将数据库的端口暴露给主机。

更新

最好将配置(从您的应用程序)外部化。这样您就可以动态配置您的应用程序。一个简单的方法是使用环境变量。

例如:

main.py:

import os


conn = connect(
    host=os.getenv("HOST"),
    port=os.getenv("PORT"),
)

然后,当您在例如Docker,你需要设置这些值:

docker run ... --env=HOST="localhost" --env=PORT="7687" ...

在 Docker Compose 下,您可以:

version: "3.5"
services:
  memgraph:
    image: memgraph/memgraph-platform:2.1.0
    container_name: memgraph_container
    restart: unless-stopped

  my_app:
    image: memgraph_docker
    container_name: something
    restart: unless-stopped
    command: python main.py
    environment:
      HOST: memgraph
      PORT: 7687

【讨论】:

  • 好吧,所以我有点困惑,因为我是 docker 新手,但是当你说 Under Docker Compose, for my_app (the name for your app), you need to refer to Memgraph by its service name (memgraph). The ports will be unchanged as both 7687 and 3000 (whichever is correct). 时,据我所知,这基本上意味着在 my_app 下写 hostname: "memgraph"?因为如果是这样,它仍然无法正常工作
  • 当你的应用在你的主机上正常工作时,它是如何连接到 Memgraph 的?必须有某种形式的所谓连接字符串,我假设它当前设置为localhostlocalhost:7687127.0.0.1:7687
  • 如果我需要使用其他本地主机,当我从 docker 调用我的脚本时,我需要编写一些自定义的东西吗?我的意思是我在猜测当我写 'docker-compose up' 时我会开始执行我的应用程序,或者我是否需要这样做只是为了启动一切,然后我必须执行 'docker run MY_APP -h SOMETHING -p SOME_PORT'?
  • 关于连接conn = connect(host=host, port=port),其中主机为127.0.0.1,端口为7687
  • 我想我已经回答了您的问题,并且您将从阅读 Docker 的文档中受益。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 2021-08-18
相关资源
最近更新 更多