Database 将docker compose连接到外部数据库

Database 将docker compose连接到外部数据库,database,docker-compose,connect,Database,Docker Compose,Connect,我有一套4个容器,需要相互通信,其中两个需要连接到外部数据库 我开始和作曲家合作,把一切联系在一起 这些容器能够在没有很多问题的情况下相互通信,但是它们无法连接到外部数据库 外部数据库已启动并正在运行,我可以通过shell轻松连接到它 docker compose文件如下所示: version: "3" services: bridge: # version => 2.1.4 build: ./lora-gateway-bridge ports:

我有一套4个容器,需要相互通信,其中两个需要连接到外部数据库

我开始和作曲家合作,把一切联系在一起

这些容器能够在没有很多问题的情况下相互通信,但是它们无法连接到外部数据库

外部数据库已启动并正在运行,我可以通过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
版本:“3”
服务:
桥:
#版本=>2.1.4
建造:./lora网关桥
端口:
-“1680/udp:1700/udp”
链接:
-emqtt
-雷迪斯
环境:
-MQTT_服务器=tcp://emqtt:1883
网络:
-外部的
重新启动:除非停止
服务器:
#版本=>0.16.1
内部版本:./s服务器
链接:
-雷迪斯
-emqtt
-劳拉应用服务器
环境:
-净ID=010203
-REDIS_URL=redis://redis:6379
-DB_AUTOMIGRATE=true
-POSTGRES_DSN=${SQL_STRING}###0.8.0
链接:
-emqtt
-雷迪斯
卷数:
-“/opt/lora应用服务器/certs:/opt/lora应用服务器/certs”
环境:

-POSTGRES_DSN=${SQL_STRING}####从您的代码中,我看到您需要连接到外部PostgreSQL服务器

网络

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

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

您有多种类型可供选择,顶部具有尽可能多的隔离:

  • 封闭容器=您只有容器内部的环回,但没有与容器虚拟网络的交互,也没有与主机网络的交互
  • 桥接容器=您的容器通过默认的桥接网络连接,最终连接到主机网络
  • 连接的容器=您的容器网络是相同的,并且在该级别()上不存在隔离,还具有到主机网络的连接
  • 开放容器=完全访问主机网络
默认类型为网桥,因此所有容器都将使用一个默认网桥网络

docker compose.yml
中,您可以从

因为您没有定义任何网络,也没有更改
网络模式
,所以可以使用默认的-
网桥

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

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

您可以按照或配置PostgreSQL实例

检查网络

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

  • 列出可用的网络:
    docker network ls
  • 检查哪个容器使用
    bridge
    network:
    docker network inspect--format“{{json.Containers}}”bridge
  • 检查容器网络:
    docker inspect--format“{{json.NetworkSettings.networks}}”myContainer
测试连接

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

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“选择“SUCCESS!!!”;“
将不起作用,因为容器中的localhost是容器本身,并且与主主机不同。因此,地址必须是可发现的地址


注意:如果使用
docker run--rm--net none test connection:latest
,将容器作为封闭容器启动,则除了环回之外,没有其他网络接口,连接将失败。只是为了说明选择人际网络会如何影响结果。

你是如何得到下面的回答的,西西娅?这似乎相当可观。关于
extra_hosts
,见