Sis*_*cia 10 database connect docker-compose
我有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
Run Code Online (Sandbox Code Playgroud)
看起来他们无法找到运行数据库的主机.
我看到的所有示例都谈到了docker-compose中的数据库,但我还没有完全掌握如何将容器连接到外部服务.
and*_*eim 14
从您的代码中我看到您需要连接到外部PostgreSQL服务器.
网络
能够发现网络中的某些资源与正在使用的网络有关.
可以使用一组网络类型,这简化了设置,还可以选择创建自己的网络并向其添加容器.
您可以选择多种类型,顶部可以选择最多的隔离:
默认类型是bridge,因此您将使用一个默认桥接网络来容纳所有容器.
在docker-compose.yml你可以选择从网络型network_mode
因为您尚未定义任何网络且未更改network_mode,所以您可以使用默认值 - bridge.
这意味着您的容器将加入默认桥接网络,并且每个容器都可以相互访问并与主机网络相连.
因此,您的问题不在于容器网络.您应该检查PostgreSQL是否可以进行远程连接.例如,您可以默认从localhost访问PostgreSQL,但您需要配置任何其他远程连接访问规则.
检查网络
以下是一些在您的方案中可能有用的命令:
docker network lsbridge网络:docker network inspect --format "{{ json .Containers }}" bridgedocker 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 !!!';"
Run Code Online (Sandbox Code Playgroud)
然后你可以用以下方法构建图像: docker build -t test-connection .
最后你可以运行容器: docker run --rm test-connection:latest
如果您的连接成功,那么成功!将被打印.
注意:与localhostin中的连接CMD psql --host=localhost --port=5432 --username=postgres -c "SELECT 'SUCCESS !!!';"不起作用,因为容器内的localhost是容器本身,并且将与主主机不同.因此,地址必须是可发现的地址.
注意:如果您将容器作为封闭容器启动使用docker run --rm --net none test-connection:latest,则除了环回之外没有其他网络接口,连接将失败.只是为了说明选择网络如何影响结果.
| 归档时间: |
|
| 查看次数: |
18988 次 |
| 最近记录: |