我有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
好像他们无法找到运行数据库的主机。
我看到的所有示例都谈到了docker-compose中的数据库,但我还没有完全掌握如何将容器连接到外部服务。
答案 0 :(得分:11)
从您的代码中我发现您需要连接到外部PostgreSQL服务器。
<强>网络强>
能够发现网络中的某些资源与正在使用的网络有关。
可以使用一组网络类型,这可以简化设置,还可以选择创建自己的网络并向其添加容器。
您可以选择多种类型,顶部可以选择最多:
默认类型为网桥,因此您将拥有使用一个默认网桥的所有容器。
在docker-compose.yml
中,您可以从network_mode
由于您尚未定义任何网络并且未对network_mode
进行更改,因此您可以使用默认值 - bridge
。
这意味着您的容器将加入默认的网桥,每个容器都可以互相访问,也可以访问主机网络。
因此,您的问题不在于容器网络。您应该检查PostgreSQL是否可以进行远程连接。例如,您可以默认从localhost访问PostgreSQL,但您需要配置任何其他远程连接访问规则。
您可以按照this answer或this blog post配置PostgreSQL实例。
检查网络
以下是一些在您的方案中可能有用的命令:
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 !!!';"
连接将无法正常工作,因为容器内的localhost是容器本身,并且与主要主机不同。因此,地址必须是可发现的地址。
注意:如果您使用docker run --rm --net none test-connection:latest
将容器作为封闭容器启动,则除了环回之外没有其他网络接口,连接将失败。只是为了说明选择网络如何影响结果。