Wie verbinde ich Docker-Container?

Sep 23 2020

In "Was ist ein Container?" Die dockerDokumente zeigen das folgende raffinierte Bild:

Für mein Szenario habe ich nur App A und App B; Nennen wir sie Alice und Bob. Wie kommunizieren Alice und Bob allgemein und spezifisch? Konkret verwende ich nach dem KISS-Prinzip MySQLund BaseXvom Docker-Hub.

Der Begriff bezieht sich auf eine xqueryDatei auf dem Host, die dann BaseXzur Ausführung an den Container gesendet wird . Diese spezielle Abfrage ist tatsächlich SQL, daher muss der MySQLContainer nach dem Ergebnis abgefragt werden.

Erfordert dies eine Portweiterleitung oder andere Netzwerkansätze ? Bände? Benötigt dies eine zusätzliche Compose- Datei, die wiederum aus MySQLund besteht BaseX?

Zweifellos gibt es viele mögliche Ansätze. Was ist aus Lernperspektive am pragmatischsten? Konzeptionell leicht, mit einer allmählichen Lernkurve.

Ein Ansatz scheint das Bridge-Networking zu nutzen:

Ausnutzen, dass sich die Container sehen können.

Dies gilt nicht , scheint mir im Zusammenhang zu RESTful Web - Services.


Bei verwandten Fragen kann dies einen Reverse-Proxy betreffen.

Antworten

1 K8sN0v1c3 Sep 23 2020 at 10:01

Ich bin auch noch ziemlich neu im Docker-Spiel, aber ich habe ein paar kleine Projekte, bei denen ich genau das mache, wonach Sie fragen. Aufgrund meiner eigenen Erfahrung mit Versuch und Irrtum (meistens Fehler ...) würde ich vorschlagen, eine docker-compose.yml zu verwenden, bei der Ihr Netzwerk auf statische interne IPs eingestellt ist, damit jeder Container vorhersehbare, wiederholbare Ergebnisse und IPs hat, mit denen Sie Ihre Container konfigurieren können über kommunizieren.

Ich bin nicht vertraut mit, BaseXaber ich habe hier eine Beispielsituation mit Docker-Compose version: "3.7", in der leicht mehrere Apps ausgeführt und / oder hinzugefügt oder neu verwendet werden können, um Ihrer Hypothese zu entsprechen.

Dieses Beispiel für Docker-Compose hat Folgendes:

  • Ein separater Container zum Auffüllen meines app-volumeVolumes mit dem Inhalt eines öffentlichen GitHub-Repos.

  • Ein Apache-Webserver-Container mit aktiviertem PHP-FPM für ein "selektives Backend", das aus einer Docker-Datei im Verzeichnis ~ / dockerbuild erstellt wird.

  • Ein Nginx-Webserver-Container, der als Reverse-Proxy für alles verwendet wird, was PHP an Apache übergeben soll (aber so ziemlich alles andere bedient und zwischenspeichert).

  • Ein MariaDB-Container im Mix für die App-Datenbank, den ich nach dem Erstellen der App mit einer mysqldump-Datei fülle.

Dies ist eine abgespeckte Version meiner Docker-compose.yml, so beachten Sie, dass Sie eine Vielzahl von Dingen wie hinzufügen können healthcheck:und an command:Ihre Bedürfnisse anzupassen.

Sie führen mit aus docker-compose up -d --build, um Ihre App in einem Befehl zu erstellen und zu starten (aber Sie möchten wahrscheinlich Ihre eigene ba (.sh) -Datei erstellen, die Sie anschließend auch für diese wichtigen Feinarbeiten ausführen).

Beachten Sie static-network. Und während ich im Beispiel benannte Volumes verwende, ist das nur eine meiner Vorlieben.

version: "3.7"

services:

  github_repo_clone:
    image: debian:latest
    container_name: github_repo_clone
    networks: 
      static-network:
        ipv4_address: 172.20.0.254

    command: bash -c "
        apt-get update && 
        apt-get install git -y &&
        rm -rf examplerepo &&
        git clone https://github.com/exampleuser/examplerepo.git &&
        rm -rf /var/www/vhosts/exampleuser/examplerepo &&
        mkdir -p /var/www/vhosts/exampleuser/examplerepo &&
        cp -rapv examplerepo/* /var/www/vhosts/exampleuser/examplerepo &&
        rm -rf examplerepo &&
        tail -f /dev/null
      "
    volumes:
     - app-volume:/var/www/vhosts

  apache_php-fpm_backend:
    container_name: debian-build-demo0
    build: ~/dockerbuild
    ports:
     - "8080:8080"
    networks:
      static-network:
        ipv4_address: 172.20.0.2
    volumes:
     - app-volume:/var/www/vhosts


  nginx_rp:
    image: nginx:latest
    container_name: nginx-build-demo0
    ports:
     - "80:80"
     - "443:443"
    networks:
      static-network:
        ipv4_address: 172.20.0.3
    volumes:
     - app-volume:/var/www/vhosts

  mariadb:
    restart: always
    image: mariadb:latest
    container_name: mariadb-build-demo0
    ports:
     - "3306:3306"
    networks:
      static-network:
        ipv4_address: 172.20.0.10
    environment:
     - MYSQL_ROOT_PASSWORD=4007p@$$w04d - MYSQL_USER=dbusernamegoeshere - MYSQL_PASSWORD=@p@$$w04d
     - MYSQL_DATABASE=dbnamegoeshere
    volumes:
     - app-volume:/var/www/vhosts
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      timeout: 10s
      retries: 5

volumes:
  app-volume:
#    external: true

networks:
  static-network:
    driver: bridge
    ipam:
      driver: default
      config:
       - subnet: 172.20.0.0/16

Mein Bereinigungsbefehl, wenn ich die App herunterfahre, ist etwas hässlich, aber nicht besonders schwer zu lesen und sieht ungefähr so ​​aus: docker-compose down -v ; docker rmi -f dockerbuild_apache_php-fpm_backend:latest mariadb:latest nginx:latest debian:latest ; docker rmi -f $(docker images -q --filter "dangling=true") ; docker rmi -f $(docker images -q --filter label=stage=intermediate) ; docker volume prune -f;

Ich denke, jede "unabhängige App" könnte (und sollte wahrscheinlich) ihre eigenen Docker-Compose- und / oder Docker-Dateien haben, aber Sie können Synergien mit bestimmten Docker-Dateien finden, für die Sie benutzerdefinierte command:Anweisungen erstellen können (wie das Beispiel git_repo_clone), die verwendet werden sollen & über mehrere "Apps" geteilt.