2016-03-27 5 views
4

Ich praktiziere die Erstellung einer Golang Web App, die mit einer PostgreSQL Datenbank interagiert, die jeweils auf ihrem eigenen Container läuft.Wie verbinde ich den Docker Web App Container mit dem Docker PostgreSQL Container?

Ich renne die Behälter mit docker-compose up

Aber ich scheine die Postgres Behälter versagt werden richtig eingerichtet bekommen.

Der Kürze halber sind Links zu Dockerfile s und anderen Einstellungsdateien on this gist (lassen Sie mich wissen, wenn Sie es stattdessen hier wollen).

version: '2' 
services: 
    web_app: 
    build: dockerfiles/web_app 
    ports: 
     - "9000:9000" 
    volumes: 
     - .:/go/src/gitlab.com/repo/web_app 
    # links might be replaced by depends_on. 
    # links: 
    # - db 
    depends_on: 
     - db 
    # tty and stdin_open cause docker-compose to disconnect from docker-machine after 60sec. 
    # A fix is on the way. 
    # tty: true 
    # stdin_open: true 
    db: 
    build: dockerfiles/db 
    volumes: 
     - data:/var/lib/postgresql/data 
volumes: 
    data: {} 

docker-compose up funktioniert gut. Aber wenn die Anwendung versucht, eine Datenbank-Verbindung zu öffnen mit:

var pgConf string = "user=web_app dbname=web_app sslmode=verify-full password=password" 

db, err := sql.Open("postgres", pgConf) 

Ich erhalte die folgende Fehlermeldung von Docker compose:

Error creating new user: dial tcp [::1]:5432: getsockopt: connection refused 

Was kann ich tun, beiden Behälter miteinander reden zu machen?

Vielen Dank im Voraus.

+0

Der Grund dafür ist, dass '' depends_on' nicht links' ersetzen kann. Ersteres bestimmt nur die Reihenfolge des Starts, während letzteres auch den Zugriff zwischen Containern nach Namen ermöglicht. –

Antwort

7

Wenn Sie den docker-compose v2 verwenden, müssen Sie keine Verbindungen zwischen Diensten erstellen. Mit Docker 1.9 und 1.10 können Sie über ihren Namen eine Verbindung zu anderen Containern im selben (benutzerdefinierten) Netzwerk herstellen.

sollten Sie in der Lage sein, entweder oder den Namen des Container als Hostnamen den Namen des -Dienst zu verbinden. Da der Name des Containers von docker-compose generiert wird, ist dies nicht wirklich praktisch. Aus diesem Grund fügt docker-compose auch einen Alias ​​ mit dem Servicenamen für jeden Container hinzu.

Nehmen Sie dieses sehr einfache Beispiel. Ich habe einen Nginx-Container aus Bequemlichkeit verwendet, aber das sollte auch für Ihre Situation gelten;

version: '2' 
services: 
    web_app: 
    image: nginx 
    db: 
    image: nginx 

Zunächst starten Sie das Projekt (unter der Annahme,

$ docker-compose --project-name=test up -d 
Creating network "test_default" with the default driver 
Creating test_db_1 
Creating test_web_app_1 

dann die "db" Service ping aus dem Inneren des test_web_app_1 Behälter:

$ docker exec -it test_web_app_1 ping -c 2 db 
PING db (172.18.0.2): 56 data bytes 
64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.108 ms 
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.243 ms 
--- db ping statistics --- 
2 packets transmitted, 2 packets received, 0% packet loss 
round-trip min/avg/max/stddev = 0.108/0.175/0.243/0.068 ms 

Wenn Sie den test_db_1 Behälter überprüfen, können Sie sehen Sie, dass docker-compose automatisch einen "db" Alias ​​für den test_db_1 Container hinzugefügt hat:

$ docker inspect test_db_1 

Gibt: (nur die NetworkSettings.Networks Teil)

"Networks": { 
    "test_default": { 
     "IPAMConfig": null, 
     "Links": null, 
     "Aliases": [ 
      "db", 
      "002b1875e61f" 
     ], 
     "NetworkID": "0f9e2cddeca79e5a46c08294ed61dee273828607f99014f6410bda887626be70", 
     "EndpointID": "a941ab95586a8fdafc5075f9c5c44d745f974e5790ef6048b9e90115a22fb31f", 
     "Gateway": "172.18.0.1", 
     "IPAddress": "172.18.0.2", 
     "IPPrefixLen": 16, 
     "IPv6Gateway": "", 
     "GlobalIPv6Address": "", 
     "GlobalIPv6PrefixLen": 0, 
     "MacAddress": "02:42:ac:12:00:02" 
    } 
} 
+0

Vielen Dank für die erstaunlichen Einblicke. Aus deiner Antwort ändere ich meinen Verbindungscode in der 'user.go' Zeile 20 wie folgt:' var pgConf string = "Benutzer = web_app dbname = web_app sslmode = verify-full password = Passwort host = 172.18.0.2" und ich habe eine erfolgreiche Verbindung Am Ende war 'docker-compose.yaml' gut.Alles was ich brauchte, waren die zusätzlichen Informationen, die Sie mir über die interne IP, die die Container verband, gaben. – sargas

+1

Sie sollten in der Lage sein, das zu 'host = db' zu ändern, das ist die Idee des eingebetteten DNS in Docker, und ein besserer Ansatz, weil sich die IP-Adresse ändern kann – thaJeztah