Entwicklungsumgebung für einen modified Shop auf Docker

Ziel war es, eine Docker Umgbung zu bauen die es mir ermöglicht schnell eine Testumgebung für die PHP basierende modified eCommerce Shopsoftware zu erstellen.

Voraussetzung für die weitere Beschreibung sind:

  • Docker und Docker-Compose sind installiert
  • Die Shopsoftware liegt in einem Verzeichnis auf dem Docker Server (hier ./devserver)
  • Ein Backup der Shopdatenbank liegt vor (hier ./anon-shop-datenbanken.sql)
  • Ein Mailgateway ist bekannt (hier mail.intranet.lcl)

Ausgangspunkt war diese Beschreibung.

Die Verzeichnisstruktur ist die folgende:

  ├── anon-shop-datenbanken.sql
  ├── devserver
  ├── docker-compose.yml
  ├── php.ini
  ├── php-shop/
      └── Dockerfile
  └── ssmtp.conf

Basis für die Docker Images bilden die Standard Images

  • mariadb
  • php:7.2.1-apache

Fangen wir “von oben an”. In der Datei docker-compose.yml werden die Komponenten meiner Umgebung festgelegt.

   version: "2"
   services:
       web:
           build:
              context: ./php-shop
           volumes:
               - ./devserver:/var/www/html
               - ./php.ini:/usr/local/etc/php/conf.d/php.ini
               - ./ssmtp.conf:/etc/ssmtp/ssmtp.conf:ro
           environment:
               - ALLOW_OVERRIDE=true
           networks:
               shop-network:
                 ipv4_address: 172.221.199.2
       mariadb:
               image: mariadb:10.1
               volumes:
                   - ./shopdb:/var/lib/mysql
                   - ./anon-shop-datenbanken.sql:/docker-entrypoint-initdb.d/dump.sql
               environment:
                   TZ: "Europe/Rome"
                   MYSQL_ALLOW_EMPTY_PASSWORD: "no"
                   MYSQL_ROOT_PASSWORD: geheim
                   MYSQL_USER: shop_admin
                   MYSQL_PASSWORD: geheimshop
                   MYSQL_DATABASE: shop
               networks:
                 shop-network:
                   ipv4_address: 172.221.199.3

   networks:
     shop-network:
       driver: bridge
       ipam:
        config:
          - subnet: 172.221.199.0/24

Ich habe damit einen Container für die Datenbank und einen für Apache mit PHP.

Im Datenbank Container wird die Shopdatenbank mit den Anmeldedaten angelegt. Der Ablageort ist auf meinem Host im Unterverzeichnis ./shop-db. Wenn der Container erstellt wird erfolgt automatische ein Import meiner anonymisierten Backupdaten des Livesystems.

Der “Applikationscontainer” erhält

  • die Stelle an welcher das Container Images definiert wird
  • mein lokales Verzeichnis devserver mit den Shop PHP Dateien
  • einer eigenen PHP ini (wahrscheinlich nicht unbedingt notwendig)
  • die Konfiguration für den den Mail (kann man auch drauf verzichten)

Da wir noch zusätzliche PHP Module brauchen und den Mailer installieren wollen erweitern wird das Standard PHP Image in einer eigenen Dockerfile Konfiguration im Verzeichnis ./php-shop

   more ./php-shop/Dockerfile
   FROM php:7.2.1-apache
   MAINTAINER Hagen Bauer
   # diese Bibliothek brauche ich fuer php-gd
   RUN apt update && apt-get install -y libpng-dev
   # Damit wir mailen koennen.
   RUN apt-get install -q -y ssmtp mailutils
   # PHP Module die fuer modified noch fehlen
   RUN docker-php-ext-install pdo pdo_mysql mysqli gd
   # Sonst geht gar nichts.
   RUN a2enmod rewrite

In der configure.php des Webshops muss man dann noch die Anpassungen vornehmen. Insbesondere der Verweis auf die Datenbank ist zu ändern und die IP Adresse wenn kein DNS vorhanden ist.

    define('DB_SERVER', 'mariadb'); // eg, localhost - should not be empty for productive servers
    define('DB_SERVER_USERNAME', 'shop_admin');
    define('DB_SERVER_PASSWORD', 'geheimshop');

Und dann kann es losgehen.

  docker-compose up

  sudo docker-compose up
  Creating network "docker_shop-network" with driver "bridge"
  Creating docker_mariadb_1
  Creating docker_web_1
  Attaching to docker_web_1, docker_mariadb_1
  web_1      | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.24.0.3. Set the 'ServerName' directive globally to suppress this message
  web_1      | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.24.0.3. Set the 'ServerName' directive globally to suppress this message
  .....
  .....
  mariadb_1  | Initializing database
  mariadb_1  | 2019-01-12  8:44:01 139939452352512 [Note] /usr/sbin/mysqld (mysqld 10.1.37-MariaDB-1~bionic) starting as process 66 ...
  mariadb_1  | 2019-01-12  8:44:01 139939452352512 [Note] InnoDB: Using mutexes to ref count buffer pool pages
  mariadb_1  | 2019-01-12  8:44:01 139939452352512 [Note] InnoDB: The InnoDB memory heap is disabled
  mariadb_1  | 2019-01-12  8:44:01 139939452352512 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
  .....
  .....
  mariadb_1  | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/dump.sql
  .....
  .....
  mariadb_1  | 2019-01-12  8:44:17 139873975470080 [Warning] 'proxies_priv' entry '@% root@3271e27acf02' ignored in --skip-name-resolve mode.
  mariadb_1  | 2019-01-12  8:44:17 139873975470080 [Note] mysqld: ready for connections.
  mariadb_1  | Version: '10.1.37-MariaDB-1~bionic'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution

Möchte man in der Datenbank etwas prüfen geht das mit

  sudo docker exec -it docker_mariadb_1 /bin/bash

Dort kann man sich dann normal an der Datenbank anmelden und die DB prüfen.

Eigentlich sollte man sich jetzt mit

http://172.221.199.2/

An dem Server anmelden können.

Damit die Mails versendet werden muss man die Mail Einstellungen noch anpassen wenn der Mailversand in der Entwicklungsumgebung anders geregelt ist als in der Produktivumgebung.