Ich entwickle einen Dienst und verwende dort Docker Compose, um Dienste wie Postgres, Redis, Elasticsearch zu spinnen. Ich habe eine Webanwendung, die auf RubyOnRails basiert und von all diesen Diensten schreibt und liest.
Hier ist mein docker-compose.yml
version: '2'
services:
redis:
image: redis:2.8
networks:
- frontapp
elasticsearch:
image: elasticsearch:2.2
networks:
- frontapp
postgres:
image: postgres:9.5
environment:
POSTGRES_USER: elephant
POSTGRES_PASSWORD: smarty_pants
POSTGRES_DB: elephant
volumes:
- /var/lib/postgresql/data
networks:
- frontapp
networks:
frontapp:
driver: bridge
Und ich kann Container innerhalb dieses Netzwerks pingen
$ docker-compose run redis /bin/bash
root@777501e06c03:/data# ping postgres
PING postgres (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: icmp_seq=0 ttl=64 time=0.346 ms
64 bytes from 172.20.0.2: icmp_seq=1 ttl=64 time=0.047 ms
...
So weit, ist es gut. Jetzt möchte ich die Ruby on Rails-Anwendung auf meinem Host-Computer ausführen, aber auf die Postgres-Instanz mit einer URL zugreifen können, wie dies postgresql://username:password@postgres/database
derzeit nicht möglich ist
$ ping postgres
ping: unknown host postgres
Ich kann mein Netzwerk im Docker sehen
$ docker network ls
NETWORK ID NAME DRIVER
ac394b85ce09 bridge bridge
0189d7e86b33 elephant_default bridge
7e00c70bde3b elephant_frontapp bridge
a648554a72fa host host
4ad9f0f41b36 none null
Und ich kann eine Schnittstelle dazu sehen
$ ifconfig
br-0189d7e86b33 Link encap:Ethernet HWaddr 02:42:76:72:bb:c2
inet addr:172.18.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:76ff:fe72:bbc2/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:36 errors:0 dropped:0 overruns:0 frame:0
TX packets:60 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2000 (2.0 KB) TX bytes:8792 (8.7 KB)
br-7e00c70bde3b Link encap:Ethernet HWaddr 02:42:e7:d1:fe:29
inet addr:172.20.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:e7ff:fed1:fe29/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1584 errors:0 dropped:0 overruns:0 frame:0
TX packets:1597 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:407137 (407.1 KB) TX bytes:292299 (292.2 KB)
...
Aber ich bin mir nicht sicher, was ich als nächstes tun soll. Ich habe versucht, ein bisschen damit zu spielen /etc/resolv.conf
, hauptsächlich mit nameserver
Direktiven, aber das hatte keine Wirkung.
Ich würde mich über Anregungen zur korrekten Konfiguration dieses Setups freuen.
AKTUALISIEREN
Nach dem Durchsuchen der Internetressourcen gelang es mir, Boxen statische IP-Adressen zuzuweisen. Im Moment reicht es mir, mich weiterzuentwickeln. Hier ist meine aktuelledocker-compose.yml
version: '2'
services:
redis:
image: redis:2.8
networks:
frontapp:
ipv4_address: 172.25.0.11
elasticsearch:
image: elasticsearch:2.2
networks:
frontapp:
ipv4_address: 172.25.0.12
postgres:
image: postgres:9.5
environment:
POSTGRES_USER: elephant
POSTGRES_PASSWORD: smarty_pants
POSTGRES_DB: elephant
volumes:
- /var/lib/postgresql/data
networks:
frontapp:
ipv4_address: 172.25.0.10
networks:
frontapp:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.25.0.0/16
gateway: 172.25.0.1
resolv.conf
Datei wird leider nicht für die DNS-Auflösung verwendet.Wenn Sie Ihr Docker-Compose-Setup nur lokal verwenden, können Sie die Ports von Ihren Containern Ihrem Host mit zuordnen
Verwenden Sie dann localhost: 9300 (oder 9200, je nach Protokoll) aus Ihrer Web-App, um auf Elasticsearch zuzugreifen.
Eine komplexere Lösung besteht darin, eigene DNS auszuführen, die Containernamen auflösen. Ich denke, dass diese Lösung viel näher an dem ist, was Sie verlangen. Ich habe zuvor skydns verwendet, wenn ich Kubernetes lokal ausgeführt habe.
Es gibt einige Möglichkeiten. Besuchen Sie https://github.com/gliderlabs/registrator und https://github.com/jderusse/docker-dns-gen . Ich habe es nicht ausprobiert, aber Sie können den DNS-Port möglicherweise auf die gleiche Weise wie die elastischen Ports im vorherigen Beispiel Ihrem Host zuordnen und dann localhost zu Ihrer resolv.conf hinzufügen, um Ihre Containernamen aus Ihrem auflösen zu können Gastgeber.
quelle
Hier und hier werden (außer
/etc/hosts
) zwei Lösungen beschriebenIch habe meine eigene Lösung in Python geschrieben und sie als Dienst implementiert, um die Zuordnung vom Hostnamen des Containers zu seiner IP bereitzustellen. Hier ist es: https://github.com/nicolai-budico/dockerhosts
Es startet dnsmasq mit Parametern
--hostsdir=/var/run/docker-hosts
und aktualisiert die Datei/var/run/docker-hosts/hosts
jedes Mal, wenn eine Liste der ausgeführten Container geändert wurde. Sobald die Datei/var/run/docker-hosts/hosts
geändert wird, aktualisiert dnsmasq automatisch die Zuordnung und der Container wird in Sekundenschnelle nach Hostname verfügbar.Es gibt Installations- und Deinstallationsskripte. Sie müssen lediglich zulassen, dass Ihr System mit dieser dnsmasq-Instanz interagiert. Ich habe mich in systemd-aufgelöst registriert:
quelle
Der Hostname des Docker-Containers ist von außen nicht sichtbar. Sie können dem Container einen Namen zuweisen und über den Namen auf den Container zugreifen. Wenn Sie zwei Container verknüpfen, z. B. Container1 und Container2, übernimmt Docker das Schreiben der IP-Adresse und des Hostnamens von Container2 in Container1. In Ihrem Fall wird Ihre Anwendung jedoch auf der Hostmaschine ausgeführt.
ODER
Sie kennen die IP des Containers. Sie können also in / etc / hosts Ihres Host-Computers $ IP $ hostanameof container hinzufügen
quelle
Ich verwende ein Bash-Skript zum Aktualisieren
/etc/hosts
. Warum diese Lösung?docker events
jedes Mal ausgeführt, wenn ein Container gestartet oder gestoppt wird (andere hier veröffentlichte Lösungen werden jede Sekunde in einer Schleife ausgeführt, was weitaus weniger effizient ist)./etc/hosts
, kein separater DNS-Server erforderlich.bash
,mktemp
,grep
,xargs
,sed
,jq
unddocker
, von denen alle hatte ich bereits installiert.Platzieren Sie das Skript einfach irgendwo, zB
/usr/local/bin/docker-update-hosts
:Hinweis: Das Skript entfernt das
_1
von Docker-Compose hinzugefügte Suffix aus den Containernamen. Wenn Sie das nicht möchten, entfernen Sie es einfach|sub("_1$"; "")
aus dem Skript.Sie können einen systemd Dienst nutzen diese synchron mit Docker auszuführen:
/etc/systemd/system/docker-update-hosts.service
:Führen Sie zum Aktivieren Folgendes aus:
quelle
Aditya ist richtig. In Ihrem Fall ist es am einfachsten, Ihren Hostnamen / Ihre IP-Zuordnung fest zu codieren
/etc/hosts
Das Problem bei diesem Ansatz ist jedoch, dass Sie die private IP-Adresse Ihres Postgres-Computers nicht steuern. Die IP-Adresse ändert sich jedes Mal, wenn Sie einen neuen Container starten. Daher müssen Sie Ihre Datei / etc / hosts aktualisieren.
Wenn dies ein Problem ist, würde ich empfehlen, dass Sie diesen Blog-Beitrag lesen, in dem erläutert wird, wie erzwungen wird, dass ein Container eine bestimmte IP-Adresse erhält:
https://xand.es/2016/05/09/docker-with-known-ip/
quelle
Sie können die RoR-App / oder jede andere App, die Zugriff auf die Container benötigt, andocken.
Ich weiß, das ist eine triviale Lösung, aber lassen Sie mich erklären:
Ich wollte etwas Ähnliches, aber aus einem anderen Grund. Ich implementiere SSO über SAML und wollte eine Entwicklungsumgebung erstellen, in der ich die Lösung testen kann. Ursprünglich wollte ich den Browser auf dem Host-Computer ausführen, aber da ich Probleme beim Zugriff auf beliebige Ports vom Host auf Clients hatte und auch die DNS-basierte Lösung von deFreitas auf dem Mac nicht funktioniert, wurde mir klar, dass ich einen Browser docken kann:
Docker-Lauf --rm -p 8085: 8085 chadmoon / gtk3-docker
Weitere Informationen finden Sie unter: https://github.com/moondev/gtk3-docker .
quelle