Database 将docker compose连接到外部数据库
我有一套4个容器,需要相互通信,其中两个需要连接到外部数据库 我开始和作曲家合作,把一切联系在一起 这些容器能够在没有很多问题的情况下相互通信,但是它们无法连接到外部数据库 外部数据库已启动并正在运行,我可以通过shell轻松连接到它 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:
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
,见