Auf Github unter Profile > Packages sind die Container zu finden.
Unter Profile > Settings > Access > Credentials > Personal Access Tokens (classic) einen Token generieren mit write_packages und read_packages Berechtigungen.
Auf dem Zielserver per SSH einloggen und docker login wie oben und das Image ziehen.
Bash
dockerpull [IMAGE_NAME]:latest
Bash
Variante 2: per Coolify
Das Repo mit einer docker-compose.yaml als normales Repository pushen. In Coolify auf Neues Projekt > Neues Repo > From Docker Image und dort die URL zum docker-compose.yaml angeben.
Docker: Apache, MySQL, PHP und PhpMyAdmin im Container-Verbund
In diesem Beitrag bauen wir einen Web Application Stack mit Docker-Containern, bestehend aus Apache, MySQL, PHP (inkl. Redis) und PhpMyAdmin. Jeder Service läuft in einem eigenen Container. Auf diese Weise ist der Stack modular mit weiteren Diensten erweiterbar. Mit wenigen Handgriffen kann z.B. MySQL gegen PostgreSQL oder PHP 7.4 gegen eine andere Version getauscht werden. SSL und XDdebug sind bereits vorkonfiguriert. Der Stack kann somit für Development oder App Deployment benutzt werden.
Damit alles schön zusammen passt und wir möglichst wenig Aufwand haben, basiert alles auf den Docker Images von Bitnami.
Für unser Projekt benötigen wir die folgende Verzeichnisstruktur:
Der Unterordner “Build” ist nur für Geräte mit Apple Silicon relevant. Dazu später mehr.
Da alle Container über Docker Compose gestartet werden, erstellen wir zuerst die docker-compose.yml-Datei im Ordner “dstack”, neben dem Unterordner “docker”:
YAML
# AMPP 1.0.9## Runs Apache, MySQL, PHP (+Redis) and PhpMyAdmin# SSL is preconfigured.# Imagemagick and XDebug are activated.## Run with # docker-compose up -d## (C)2020-2022 Harald Schneider#version:"3"services:# --- MySQL 5.7#mysql:container_name:"ampp-mysql"image:bitnami/mysql:5.7restart:unless-stoppedenvironment:-MYSQL_ROOT_PASSWORD=MYSQL_PASSWORD-MYSQL_USER=admin-MYSQL_PASSWORD=MYSQL_PASSWORDports:-'3306:3306'volumes:-./docker/mysql/data:/bitnami/mysql/data-./docker/mysql/backup:/backup# --- PHP 7.4#php:container_name:"ampp-php"image:bitnami/php-fpm:latestrestart:unless-stoppeddepends_on:-redisvolumes:#- /Users/hschneider/Work/Web:/app:delegated-./docker/www:/app:delegated-./docker/php/php.ini:/opt/bitnami/php/etc/conf.d/php.ini:ro# --- Apache 2.4#apache:container_name:"ampp-apache"image:bitnami/apache:2.4ports:-'80:8080'-'443:8443'depends_on:-phpvolumes:#- /Users/hschneider/Work/Web:/app:delegated-./docker/www:/app:delegated-./docker/apache/my_vhost.conf:/vhosts/myapp.conf:ro-./docker/apache/certs:/certs# Use this for bitnami's builtin certs:# ./docker/apache/certs:/opt/bitnami/apache2/conf/bitnami/certs # --- Redis 6.0#redis:container_name:"ampp-redis"image:bitnami/redis:6.0restart:unless-stoppedenvironment:-REDIS_PASSWORD=at15jx13# --- PhpMyAdmin latest# Acccess via# http://127.0.0.1:8180 or https://127.0.0.1:8143# Login with user root and mysql-password.#phpmyadmin:container_name:"ampp-phpmyadmin"image:bitnami/phpmyadmin:latestdepends_on:-mysqlports:-'8180:8080'-'8143:8443'environment:-DATABASE_HOST=mysqlvolumes:ampp-mysql:driver:local
YAML
Außer PhpMyAdmin benutzen alle Dienste ihre Standard-Ports. Alle wichtigen Daten werden in persistenten Ordnern ausserhalb der Container gespeichert (Volumes).
Apache
SSL Variante 1:
Mit mkcert ein neues lokales Zertifikat installieren
Bash
mkcert-install
Bash
Jetzt die Zertifikate für den Apache generieren:
Bash
mkcertlocalhost127.0.0.1::1
Bash
und speichern diese Dateien im Ordner ./docker/apache/certs. Wichtig ist, dass die Namen der Zertifikate mit denen aus der Apachekonfiguration übereinstimmen.
SSL Variante 2:
Zuerst generieren wir mit dem folgenden Befehl ein selbst signiertes SSL-Zertifikat und speichern dessen Dateien im Ordner ./docker/apache/certs:
Für unsere Website-Daten legen wir noch den Ordner ./docker/www an. In unserem Beispiel liegt hier die Datei info.php mit folgendem Inhalt:
PHP
<?phpphpinfo();?>
PHP
Damit ist Apache samt SSL komplett.
MySQL
Für MySQL benötigen wir nur einen leeren Ordner namens ./docker/mysql/data. Nach dem Start des MySQL-Containers, werden in diesem Ordner die Daten des MySQL-Servers erzeugt.
Bei Bedarf kann dieser Container noch mit einer Backup-Lösung für MySQL-Datenbanken, wie hier beschrieben, ergänzt werden.
PHP
Für die PHP-Konfiguration erzeugen wir die folgende Datei in ./docker/php/php.ini:
Unter Anderem werden hier die ImageMagick extension aktiviert und XDebug konfiguriert. PHP ist damit ebenfalls komplett.
PhpMyAdmin
PhpMyAdmin benötigt keine extra Konfiguration und ist später über die Adresse 127.0.0.1:81 oder :8143 (SSL) erreichbar. Die Anmeldung geschieht mit Benutzer “root” und dem MySQL Root User Passwort.
Alle Docker-Container auf einmal starten
Der folgende Befehlt starten nun alle Container auf einmal:
Bash
docker-composeup-d
Bash
Zum Test geben wir im Browser http://127.0.0.1/info.php ein. Wenn wir alles richtig gemacht haben, erscheint nun die PHP-Info Page.
Docker: Zugriff von PHP auf MySQL liefert “Connection refused”
Hier ist folgende Besonderheit zu beachten: Da ja alle Dienste in getrennten Docker-Containern laufen, wird ein Aufbau des DBConnects mit
Bash
'host' =>'127.0.0.1:3306'
Bash
nicht funktionieren. Statt dessen ist der Docker-Containername als Hostname zu verwenden:
Bash
'host' =>'mysql:3306'
Bash
Solltet Ihr in docker-compose.yaml Port 3306 auf eine andere Portnummer gemapped haben, bleibt es in diesem Fall trotzdem bei 3306, da aus Perspektive des Webservers der interne Port des Containers sichtbar ist.
Nur für Apps, die von außen auf MySQL zugreifen (z.B. SequelPro, Querious, Navicat etc), wäre dann der gemappte Port gültig.
Docker: Bitnami Images auf Macs mit Apple Silicon lauffähig machen
Damit unser Docker Stack auch auf Macs mit Apple Silicon läuft, sind Build Patches für die Apache und PhpMyAdmin Docker Images notwendig. Dazu gehen wir wie folgt vor:
In der docker-compose.yml ergänzen wir die beiden markierten Zeilen (build):
YAML
# --- Apache 2.4#apache:container_name:"ampp-apache"image:bitnami/apache:2.4build:./build/apache...# --- PhpMyAdmin latest# Acccess via# http://127.0.0.1:8180 or https://127.0.0.1:8143# Login with user root and mysql-password.#phpmyadmin:container_name:"ampp-phpmyadmin"image:bitnami/phpmyadmin:latestbuild:./build/phpmyadmin...
YAML
Im Ordner “build” legen wir 2 weitere Ordner an: “apache” mit einer Datei namens “Dockerfile”. Diese hat folgenden Inhalt:
YAML
FROM bitnami/apache:2.4USER 0RUN echo 'Mutex posixsem' >>/opt/bitnami/apache2/conf/httpd.confUSER 1001
YAML
Sowie den Ordner “phpmyadmin” mit ebenfalls einer Datei namens “Dockerfile” und folgenden Inhalt:
YAML
FROM bitnami/phpmyadmin:latestUSER 0RUN echo 'Mutex posixsem' >>/opt/bitnami/apache2/conf/httpd.confUSER 1001
YAML
Danach starten beide Docker Container auch auf Apple Silicon.
// Im Verzeichnis des Dockerfiles ausführen
docker build -t EIGENER_IMAGENAME .
// Container aus Image bauen und starten und nach stoppen löschen
docker run EIGENER_IMAGENAME -rm -d CONTAINER_NAME
// Benanntes Volume (wird nach löschen des Containers nicht gelöscht)
docker run EIGENER_IMAGENAME -v VOLUMENAME:PFAD_IM_CONTAINER CONTAINER_NAME
// Mount als Volume dabei wird /app/node_modules wenn schon vorhanden nicht überschrieben, weil es als anonymer Pfad aufgeführt wird
docker run -v PFAD_AUF_HOST_COMPUTER:/PFAD_IN_CONTAINER -v /app/node_modules -d CONTAINER_NAME
Code-Sprache:JavaScript(javascript)
Volume-Arten Vergleich
Cookie-Zustimmung verwalten
Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du diesen Technologien zustimmst, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn du deine Zustimmung nicht erteilst oder zurückziehst, können bestimmte Merkmale und Funktionen beeinträchtigt werden.
Funktional
Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt.Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.