Connectez docker-composer à la base de données externe
J'ai un set de 4 conteneurs qui ont besoin de se parler les uns les autres, et deux de ceux qui ont besoin de se connecter à une base de données externe.
J'ai commencé à travailler avec le compositeur et lier le tout ensemble.
Les conteneurs sont en mesure de parler les uns avec les autres, sans beaucoup de problèmes, mais ils ne peuvent pas se connecter à la base de données externe.
La base de données externe est en place et fonctionne, et je peux facilement s'y connecter via le shell.
Le docker-composition de fichier ressemble à ceci:
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
Il semble qu'ils sont incapables de trouver l'hôte sur lequel la base de données est en cours d'exécution.
Tous les exemples que je vois parler d'une base de données à l'intérieur du menu fixe-composer, mais je n'ai pas bien saisi comment connecter le conteneur à un service externe.
qu'en est
extra_hosts
comme indiqué dans le docs.docker.com/compose/compose-file/#extra_hostsOriginalL'auteur Siscia | 2017-05-03
Vous devez vous connecter pour publier un commentaire.
À partir de votre code, je vois que vous avez besoin pour vous connecter à un serveur PostgreSQL.
Réseaux
Être en mesure de découvrir certains de ressources dans le réseau est liée à la réseau qui est utilisé.
Il existe un ensemble de types de réseau qui peut être utilisé, ce qui simplifie la configuration, et il y a aussi la possibilité de créer vos propres réseaux et ajouter des conteneurs.
Vous avez un certain nombre de types que vous pouvez choisir, le top a le plus possible l'isolement:
Le type par défaut est pont de sorte que vous aurez tous les contenants l'aide d'un défaut du réseau du pont.
Dans
docker-compose.yml
vous pouvez choisir un type de réseau à partir de network_modeParce que vous n'avez pas défini de n'importe quel réseau et que vous n'avez pas changé le
network_mode
, vous arrivez à utiliser la valeur par défaut -bridge
.Cela signifie que vos contenants rejoindra la valeur par défaut du réseau du pont et tous les conteneurs auront accès à chaque autre et le réseau de l'hôte.
Donc votre problème ne réside pas avec le conteneur de réseau. Et vous devriez vérifier si PostgreSQL est accessible pour les connexions à distance. Par exemple, vous pouvez accéder à PostgreSQL à partir de localhost par défaut, mais vous devez configurer toute autre connexion à distance des règles d'accès.
Vous pouvez configurer votre instance PostgreSQL par la suite cette réponse ou ce blog.
Inspecter les réseaux
Voici quelques commandes qui pourraient être utiles dans votre scénario:
docker network ls
bridge
réseau:docker network inspect --format "{{ json .Containers }}" bridge
docker inspect --format "{{ json .NetworkSettings.Networks }}" myContainer
Test de connexion
Afin de tester la connexion, vous pouvez créer un conteneur qui exécute
psql
et tente de se connecter à votre serveur PostgreSQL, isolant ainsi à un minimum l'environnement pour tester votre cas.Dockerfile peut être:
Alors vous pouvez construire l'image avec:
docker build -t test-connection .
Et enfin, vous pouvez exécuter le conteneur avec:
docker run --rm test-connection:latest
Si votre connexion réussit, alors le SUCCÈS !!! sera imprimé.
Remarque: connexion avec
localhost
comme dansCMD psql --host=localhost --port=5432 --username=postgres -c "SELECT 'SUCCESS !!!';"
ne fonctionnera pas tant que le localhost de l'intérieur du conteneur est le conteneur lui-même et sera différent de celui de l'hôte principal. Par conséquent, l'adresse doit être celle qui est détectable.Remarque: si vous commencez votre conteneur, un conteneur fermé à l'aide de
docker run --rm --net none test-connection:latest
, il n'y aura pas d'autre de l'interface réseau de bouclage et la connexion échoue. Juste pour montrer comment le choix d'un réseau d'influence sur le résultat.OriginalL'auteur andreim