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

时间:2017-05-03 14:13:28

标签: database docker-compose connect

我有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中的数据库,但我还没有完全掌握如何将容器连接到外部服务。

1 个答案:

答案 0 :(得分:11)

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

<强>网络

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

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

您可以选择多种类型,顶部可以选择最多:

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

默认类型为网桥,因此您将拥有使用一个默认网桥的所有容器。

docker-compose.yml中,您可以从network_mode

中选择一种网络类型

由于您尚未定义任何网络并且未对network_mode进行更改,因此您可以使用默认值 - bridge

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

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

您可以按照this answerthis 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将容器作为封闭容器启动,则除了环回之外没有其他网络接口,连接将失败。只是为了说明选择网络如何影响结果。