Forum: PC Hard- und Software 2 Docker-Container "richtig" verbinden


von Wehc (Gast)


Lesenswert?

Ich habe gelesen, dass man --link nicht mehr verwenden soll, um 
Docker-Container zu "verbinden" - vielleicht brauche ich das auch nicht, 
aber wie mache ich das:

Ich habe schon einen funktionierenden mysql-Container, der Port 3306 
publiziert, da kann ich mich vom Host aus auch mit mysql hin verbinden.

Jetzt baue ich einen zweiten Container (node.js), und aus diesem heraus 
möchte ich auch in die Datenbank vom mysql-Container greifen können - 
möglichst auch noch nach einem Neustart der beiden Container.

Wie macht man das jetzt? Nur weil der Host Zugriff hat, hat man das vom 
Container innerhalb ja nicht, oder?

von Εrnst B. (ernst)


Lesenswert?

ist "docker-compose" o.Ä. eine Option?

von Wehc (Gast)


Lesenswert?

Na wenn es sein muss, wie geht das da? Ich habe den Container sonst 
immer mit einem Kommando in einer Batch-datei gestartet.

von Rolf M. (rmagnus)


Lesenswert?

Wehc schrieb:
> Na wenn es sein muss, wie geht das da? Ich habe den Container sonst
> immer mit einem Kommando in einer Batch-datei gestartet.

Du schreibst eine docker-compose.yml, die die beiden Container und deren 
Verbindungen und abhängigkeiten beschreibt, und dann startest du deinen 
Container-Verbund einfach per "docker-compose up". Das ist genau für 
solche Anwendungsfälle gedacht.

https://docs.docker.com/compose/

: Bearbeitet durch User
von Wehc (Gast)


Lesenswert?

Jetzt bin ich weiter, und teilweise funktioniert es schon - meine 
docker-compose.yml sieht so aus:
1
version: "3.7"
2
services:
3
  s_node:
4
    image: "node"
5
    depends_on:
6
      - s_db
7
    networks: 
8
      - the-shared-network
9
    user: "node"
10
    working_dir: /home/node/app
11
    environment:
12
      - NODE_ENV=production
13
    volumes:
14
      - ./:/home/node/app
15
    expose:
16
      - "8081"
17
    command: "node server.js"
18
19
  s_db:
20
    image: mariadb
21
    ports:
22
      - "3306:3306"
23
    networks: 
24
      - the-shared-network
25
    volumes: 
26
      - mysql-storage:/var/lib/mysql
27
    environment:
28
      MARIADB_ROOT_PASSWORD: XXXXXX
29
      
30
volumes:
31
  mysql-storage:
32
    external: true
33
34
networks:
35
  the-shared-network: {}

Im gleichen loklaen Verzeichnis wie die docker-compose.yml Verzeichnis 
(was als volume gemountet wird nach /home/node/app im container) liegt 
eine Datei server.js, die das modul express benutzt. Dieses wird aber 
nicht gefunden, obwohl ich der Meinung war, es ist im node-image 
enthalten. Was fehlt?

die Fehlerzeile lautet:

s_node_1  | Error: Cannot find module 'express'

von Εrnst B. (ernst)


Lesenswert?

Wehc schrieb:
> Dieses wird aber
> nicht gefunden, obwohl ich der Meinung war, es ist im node-image
> enthalten. Was fehlt?

Dann wird es wohl nicht enthalten sein. Hast du im Ordner, der da nach 
/home/node/app reingezogen wird, einen "node_modules" Unterordner incl. 
express?

Falls nicht, fehlt ein npm install. Quick-n-dirty:
command: "node server.js"
durch
command: "npm install"
ersetzen, einmal docker-compose up, und dann wieder zurückstellen.

von Moskito (Gast)


Lesenswert?

Geht auch zuverlässig ohne compose:

Option 1: Zugriff über die Gateway IP. Wenn du die Default Bridge 
verwendest, ist das 172.17.0.1. der entsprechende Port muss forwarded 
werden (-p 3306:3306).

Option 2: beide Container dem gleichen Network zuweisen (Bridge, aber 
nicht die Default bridge).
Dann kann der name des MySQL Containers verwendet werden, um sich aus 
anderen Containern damit zu verbinden. Kein portforwarding erforderlich.

von Rolf M. (rmagnus)


Lesenswert?

Εrnst B. schrieb:
> Falls nicht, fehlt ein npm install. Quick-n-dirty:
> command: "node server.js"
> durch
> command: "npm install"
> ersetzen, einmal docker-compose up, und dann wieder zurückstellen.

Besser wäre es aber, das "npm install" ins Dockerfile per RUN 
einzutragen.

Moskito schrieb:
> Geht auch zuverlässig ohne compose:

Klar geht's auch ohne, nur eben umständlicher.

von Sheeva P. (sheevaplug)


Lesenswert?

Εrnst B. schrieb:
> Falls nicht, fehlt ein npm install. Quick-n-dirty:
> command: "node server.js"
> durch
> command: "npm install"
> ersetzen, einmal docker-compose up, und dann wieder zurückstellen.

Was ist eigentlich ein Dockerfile? Genau: eine Vorschrift, um Images zu 
bauen. Womöglich könnte man "npm install" beim Bauen des Image...? Oder 
zur Not im Entrypoint?

von Εrnst B. (ernst)


Lesenswert?

Sheeva P. schrieb:
> Was ist eigentlich ein Dockerfile? Genau: eine Vorschrift, um Images zu
> bauen. Womöglich könnte man "npm install" beim Bauen des Image...?

Natürlich ist das die schönere Lösung.
Er verwendet aber direkt das "node"-Image, und baut kein eigenes. Und er 
mountet direkt seinen gesamten Source-Tree als volume in den container.
d.H.: nur einen eigenen Container "FROM: node" mit "npm install" bauen 
reicht nicht, sein volume-mount macht die ganzen dadurch installierten 
Module wieder unsichtbar.

"von außen" einmal npm install laufen lassen könnte reichen, aber: Dafür 
muss auch außerhalb vom Docker ein nodejs installiert sein, in einer 
kompatiblen Version.

Der vorgeschlagene "Quick&Dirty"-Hack mit dem einmaligen "command: npm 
install" installiert die Packages ja nicht (nur) in den container, 
sondern in das volume. d.H: Das übersteht auch ein "recreate" und in 
gewissen Grenzen auch pull/updates.

Solange man noch am entwickeln ist und sich der Sourcecode oft ändert, 
halte ich das für eine durchaus brauchbare Lösung, weil man mit einem 
einfachen&schnellem restart statt einem langwierigerem build auskommt.

von Rolf M. (rmagnus)


Lesenswert?

Εrnst B. schrieb:
> Sheeva P. schrieb:
>> Was ist eigentlich ein Dockerfile? Genau: eine Vorschrift, um Images zu
>> bauen. Womöglich könnte man "npm install" beim Bauen des Image...?
>
> Natürlich ist das die schönere Lösung.
> Er verwendet aber direkt das "node"-Image, und baut kein eigenes.

Was aber sehr einfach wäre.

> Und er mountet direkt seinen gesamten Source-Tree als volume in den
> container.

Was nicht nötig wäre.

> d.H.: nur einen eigenen Container "FROM: node" mit "npm install" bauen
> reicht nicht, sein volume-mount macht die ganzen dadurch installierten
> Module wieder unsichtbar.
>
> "von außen" einmal npm install laufen lassen könnte reichen, aber: Dafür
> muss auch außerhalb vom Docker ein nodejs installiert sein, in einer
> kompatiblen Version.

Was dann den Sinn von Docker irgendwie über den Haufen wirft.

von Sheeva P. (sheevaplug)


Lesenswert?

Εrnst B. schrieb:
> Sheeva P. schrieb:
>> Was ist eigentlich ein Dockerfile? Genau: eine Vorschrift, um Images zu
>> bauen. Womöglich könnte man "npm install" beim Bauen des Image...?
>
> Natürlich ist das die schönere Lösung.

Ich wäre froh, wenn es "die schönere Lösung" wäre.

> Er verwendet aber direkt das "node"-Image, und baut kein eigenes. Und er
> mountet direkt seinen gesamten Source-Tree als volume in den container.

How to shoot yourself in the foot: Container nicht verstanden. ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.