gpt4 book ai didi

database - 将 docker-compose 连接到外部数据库

转载 作者:太空狗 更新时间:2023-10-30 01:43:56 25 4
gpt4 key购买 nike

我设置了 4 个需要相互通信的容器,其中两个需要连接到外部数据库。

我开始使用 composer 并将所有内容链接在一起。

容器之间可以毫无问题地相互通信,但是它们无法连接到外部数据库。

外部数据库已启动并正在运行,我可以通过 shell 轻松连接到它。

docker-compose 文件如下所示:

version: "3"

services:

bridge:
# version => 2.1.4
build: ./lora-gateway-bridge
ports:
- "1680/udp:1700/udp"
links:
- emqtt
- redis
environment:
- MQTT_SERVER=tcp://emqtt:1883
networks:
- external
restart: unless-stopped

loraserver:
# version => 0.16.1
build: ./loraserver
links:
- redis
- emqtt
- lora-app-server
environment:
- NET_ID=010203
- REDIS_URL=redis://redis:6379
- DB_AUTOMIGRATE=true
- POSTGRES_DSN=${SQL_STRING} ###<- connection string
- BAND=EU_863_870
ports:
- "8000:8000"
restart: unless-stopped

lora-app-server:
build: ./lora-app-server
# version => 0.8.0
links:
- emqtt
- redis
volumes:
- "/opt/lora-app-server/certs:/opt/lora-app-server/certs"
environment:
- POSTGRES_DSN=${SQL_STRING} ### <- connection string
- REDIS_URL=redis://redis:6379
- NS_SERVER=loraserver:8000
- MQTT_SERVER=tcp://emqtt:1883
ports:
- "8001:8001"
- "443:8080"
restart: unless-stopped

redis:
image: redis:3.0.7-alpine
restart: unless-stopped

emqtt:
image: erlio/docker-vernemq:latest
volumes:
- ./emqttd/usernames/vmq.passwd:/etc/vernemq/vmq.passwd
ports:
- "1883:1883"
- "18083:18083"
restart: unless-stopped

他们似乎无法找到运行数据库的主机。

我看到的所有示例都在谈论 docker-compose 中的数据库,但我还不太了解如何将容器连接到外部服务。

最佳答案

从您的代码中我看到您需要连接到外部 PostgreSQL 服务器。

网络

能否发现网络中的某些资源与正在使用的网络有关。

有一组可以使用的网络类型,可以简化设置,还可以选择创建自己的网络并向其中添加容器。

您有多种类型可供选择,顶部的隔离度最高:

  • 封闭的容器 = 您只有容器内的环回,但没有与容器虚拟网络的交互,也没有与主机网络的交互
  • 桥接容器 = 您的容器通过默认桥接网络连接,最终连接到主机网络
  • 已加入容器 = 您的容器网络是相同的并且该级别没有隔离 (),也连接到主机网络
  • 打开容器 = 完全访问主机网络

默认类型是网桥,因此您将让所有容器使用一个默认网桥网络。

docker-compose.yml 中,您可以从 network_mode 中选择网络类型

因为您没有定义任何网络,也没有更改 network_mode,所以您可以使用默认设置 - bridge

这意味着您的容器将加入默认的桥接网络,并且每个容器都可以相互访问并访问主机网络。

因此,您的问题不在于容器网络。并且您应该检查 PostgreSQL 是否可用于远程连接。例如,您可以默认从本地主机访问 PostgreSQL,但您需要配置任何其他远程连接访问规则。

您可以按照 this answer 配置您的 PostgreSQL 实例或 this blog post .

检查网络

以下是一些可能对您的场景有用的命令:

  • 列出可用网络:docker network ls
  • 检查哪个容器使用 bridge 网络:docker network inspect --format "{{ json .Containers }}"bridge
  • 检查容器网络:docker inspect --format "{{ json .NetworkSettings.Networks }}"myContainer

测试连接

为了测试连接,您可以创建一个容器来运行 psql 并尝试连接到您的远程 PostgreSQL 服务器,从而隔离到最小环境来测试您的案例。

Dockerfile 可以是:

FROM ubuntu
RUN apt-get update
RUN apt-get install -y postgresql-client
ENV PGPASSWORD myPassword
CMD psql --host=10.100.100.123 --port=5432 --username=postgres -c "SELECT 'SUCCESS !!!';"

然后您可以使用以下命令构建镜像:docker build -t test-connection 。

最后你可以运行容器:docker run --rm test-connection:latest

如果您的连接成功,那么就成功了!!!将被打印出来。

注意:localhost 连接,如 CMD psql --host=localhost --port=5432 --username=postgres -c "SELECT 'SUCCESS !!!';" 将不起作用,因为容器内的本地主机是容器本身,并且与主要主机不同。因此地址必须是可发现的。

注意:如果您使用 docker run --rm --net none test-connection:latest 将容器作为封闭容器启动,则不会有其他网络接口(interface)比环回和连接将失败。只是为了说明选择网络可能会如何影响结果。

关于database - 将 docker-compose 连接到外部数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43762537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com