{"id":7883,"date":"2021-11-11T23:42:45","date_gmt":"2021-11-11T21:42:45","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=7883"},"modified":"2022-12-12T18:26:01","modified_gmt":"2022-12-12T16:26:01","slug":"apache2-mit-php-mod_php-auf-docker-mit-compose-einrichten","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/apache2-mit-php-mod_php-auf-docker-mit-compose-einrichten\/","title":{"rendered":"Apache2 mit PHP (mod_php) auf Docker mit Compose einrichten"},"content":{"rendered":"<p>In einem vorherigen Beitrag habe ich eine einfache Apache2-Installation mit den Paketquellen vom Raspberry Pi OS gezeigt, die unter Debian auf x86 Hardware eben so umgesetzt werden kann. Webserver und PHP werden dabei direkt auf dem Pi installiert. Dies hat mehrere Nachteile:<\/p>\n<ul class=\"wp-block-list\">\n<li>Wenig Isolation gegen\u00fcber dem Hostsystem<\/li>\n<li>Wir sind auf die Paketquellen angewiesen, wo wir tendenziell eher \u00e4ltere Versionen bekommen<\/li>\n<li>Mehrere Versionen parallel zu installieren (z.B. PHP 7 und 8) ist schwierig und kann Konflikte verursachen, auch in Kombination mit anderer Software<\/li>\n<\/ul>\n<p>Daher macht es Sinn, hierf\u00fcr Docker zusammen mit Docker-Compose einzusetzen. Beides ist daher Voraussetzung. <a href=\"https:\/\/u-labs.de\/portal\/docker-auf-dem-raspberry-pi-installieren-erste-container-starten-einfach-erklaert\/\" title=\"Docker auf dem Raspberry Pi installieren &amp; erste Container starten einfach erkl\u00e4rt\">Wie ihr Docker installiert, habe ich bereits in einem vorherigen Beitrag gezeigt<\/a> . Auch die Installation von Docker-Compose, womit die Verwaltung insbesondere von mehreren Containern deutlich vereinfacht wird, war bereits in der Vergangenheit Thema.<\/p>\n<h2 class=\"wp-block-heading\">Welches Basis-Image soll ich f\u00fcr Apache2 mit PHP nehmen?<\/h2>\n<p>Wir fokussieren uns hier auf die einfachste Variante mit <strong>mod_php<\/strong>. Zwar gibt es Alternativen, die vor allem hinsichtlich der Performance besser abschneiden. Diese sind etwas komplexer und f\u00fcr kleine private Instanzen ist der Unterschied \u00fcberschaubar, dies schauen wir uns in einem eigenen Beitrag an. Gerade f\u00fcr Einsteiger ist mod_php einfacher, hier gen\u00fcgt ein einzelner Container.<\/p>\n<p>Apache2 stellt <a href=\"https:\/\/hub.docker.com\/_\/httpd\" target=\"_blank\" rel=\"nofollow\">das offizielle httpd Image bereit<\/a>. Dort ist das Modul <strong>mod_php <\/strong>jedoch nicht enthalten. Allerdings hilft uns hier PHP, dort stellt man <a href=\"https:\/\/github.com\/docker-library\/docs\/blob\/master\/php\/README.md#supported-tags-and-respective-dockerfile-links\" title=\"https:\/\/github.com\/docker-library\/docs\/blob\/master\/php\/README.md#supported-tags-and-respective-dockerfile-links\" target=\"_blank\" rel=\"nofollow\">Apache2 zusammen mit mod_php<\/a> in einem eigenen Tag bereit. Zum Erstellzeitpunkt sind Version 7 und 8 von PHP aktuell, daher machen folgende Tags am meisten Sinn:<\/p>\n<ul class=\"wp-block-list\">\n<li>7-apache und 7.4-apache<\/li>\n<li>8-apache und 8.1-apache<\/li>\n<\/ul>\n<p>Nat\u00fcrlich k\u00f6nnte man hier auch den exakten Tag nehmen, etwa derzeit <strong>8.0.12-apache<\/strong>. Gerade bei Webanwendungen macht es jedoch Sinn, nur auf die Haupt- oder Nebenversion zu gehen. So lassen sich (Sicherheits-) Updates einfacher einspielen, da ihr im Grunde nur den Tag (z.B. <strong>8.0-apache<\/strong>) pullen m\u00fcsst.<\/p>\n<h2 class=\"wp-block-heading\">Einfache Docker-Compose.yml f\u00fcr Apache2 mit PHP<\/h2>\n<p>Erstelle einen Ordner, z.B. <strong>apache2-docker<\/strong> und lege darin eine Datei namens <strong>docker-compose.yml<\/strong> an. Als Vorlage kannst du folgenden Inhalt hinein kopieren:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\nversion: &quot;2.4&quot;\n\nservices:\n    apache:\n        image: php:8-apache\n        restart: always\n        ports:\n            - 80:80\n        volumes:\n            - .\/www:\/var\/www\/html\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/u-labs.de\/portal\/einfuehrung-das-ist-docker-compose-und-so-installierst-du-es-auf-dem-raspberry-pi\/\" title=\"Einf\u00fchrung: Das ist Docker-Compose und so installierst du es auf dem Raspberry Pi!\">Den grunds\u00e4tzlichen Aufbau einer docker-compose.yml habe ich in diesem Beitrag ausf\u00fchrlicher erkl\u00e4rt<\/a>. Diese docker-compose.yml unterscheidet sich nur in drei Aspekten davon:<\/p>\n<ol class=\"wp-block-list\">\n<li>Der Dienst wurde umbenannt und hei\u00dft nun <strong>apache<\/strong> statt <strong>webserver<\/strong>, wobei dies frei w\u00e4hlbar ist.<\/li>\n<li>Wir nutzen ein PHP-Image mit entsprechend angepasstem Tag statt Nginx. Man kann PHP auch zusammen mit Nginx ausliefern lassen, allerdings ist dies etwas komplexer als mit Apache2 &#8211; dies schauen wir in einem eigenen Beitrag genauer an.<\/li>\n<li>Unseren www-Ordner als Wurzelverzeichnis f\u00fcr alle auszuliefernden Skripte und andere Dateien wird dem Container nicht in <strong>\/usr\/share\/nginx\/html<\/strong> bereitgestellt, sondern in <strong>\/var\/www\/html<\/strong>. Dies liegt einfach daran, dass Nginx einen anderen Standardpfad verwendet als Apache2.<\/li>\n<\/ol>\n<p>Nun muss nur noch der Unterordner <strong>www<\/strong> angelegt werden. Zum Test macht es Sinn, eine index.php Datei anzulegen, die eine PHPInfo ausgibt. So sehen wir Details zu unserer PHP-Installation.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nmkdir www\necho &#039;&lt;?php phpinfo();&#039; &gt; www\/index.php\n<\/pre>\n<\/div>\n<p>Das Herunterladen des Images sowie das anschlie\u00dfende Erzeugen des Containers \u00fcbernimmt Docker-Compose mit dem up-Befehl:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ndocker-compose up -d\n<\/pre>\n<\/div>\n<p>Nach Beendigung des Befehles kann man den Hostname oder die IP-Adresse des Pis im Browser gefolgt von einem Slash \/ eingeben:<\/p>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/11\/grafik-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"751\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/11\/grafik-1-1024x751.png\" alt=\"\" class=\"wp-image-7888\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/11\/grafik-1-1024x751.png 1024w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/11\/grafik-1-300x220.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/11\/grafik-1-768x563.png 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/11\/grafik-1-70x51.png 70w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/11\/grafik-1.png 1127w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<h2 class=\"wp-block-heading\">So einfach kannst du die PHP-Version wechseln<\/h2>\n<p>M\u00f6chtest du die PHP-Version wechseln, ist dies mit Docker-Compose ein Kinderspiel: <a href=\"https:\/\/github.com\/docker-library\/docs\/blob\/master\/php\/README.md#supported-tags-and-respective-dockerfile-links\" target=\"_blank\" rel=\"nofollow\">Suche dir einen passenden Tag f\u00fcr die von dir gew\u00fcnschte Version<\/a>. In diesem Szenario ben\u00f6tigen wir einen auf <strong>-apache<\/strong> endenden Tag. Beispielsweise  <strong>7-apache<\/strong>, um die derzeit aktuellste PHP 7 Version zu erhalten. In der docker-compose.yml \u00e4nderst du diesen entsprechend, hier etwa von <strong>8-apache<\/strong> auf <strong>7-apache<\/strong>. Anschlie\u00dfend l\u00e4sst du Docker-Compose den Container neu erstellen:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ndocker-compose up -d\n<\/pre>\n<\/div>\n<p>Compose erkennt deine \u00c4nderung und l\u00e4dt das Image herunter, falls n\u00f6tig. Anschlie\u00dfend wird dein Apache-Container mit der gew\u00fcnschten Version gestartet. Aktualisierst du nun im Browser die Testseite, steht dir PHP 7 zur Verf\u00fcgung:<\/p>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/11\/grafik-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"751\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/11\/grafik-2-1024x751.png\" alt=\"\" class=\"wp-image-7889\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/11\/grafik-2-1024x751.png 1024w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/11\/grafik-2-300x220.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/11\/grafik-2-768x563.png 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/11\/grafik-2-70x51.png 70w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/11\/grafik-2.png 1127w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<p>Praktisch, oder? N\u00fctzlich ist dies etwa f\u00fcr ein Update: Du hast eine Software, die noch auf PHP 7 l\u00e4uft. Mit dem PHP 8 Image kannst du testen, ob sie auch mit der neuen Version funktioniert. Und das sogar ohne Ausfallzeit: Du k\u00f6nntest einfach eine zweite docker-compose.yml erstellen und deine Anwendung so duplizieren. Hierf\u00fcr musst du den Port entsprechend Anpassen oder einen Reverse Proxy verwenden, dies erkl\u00e4ren wir an anderer Stelle ausf\u00fchrlicher. So kann in Ruhe die neue Version getestet werden. Klappt alles, wechselst du mit deiner Hauptinstanz ebenfalls nur neuen PHP-Version &#8211; oder eben erst sp\u00e4ter, falls es zu Problemen kommt.<\/p>\n<h2 class=\"wp-block-heading\">Weitere Schritte<\/h2>\n<p>Im <strong>www <\/strong>Ordner kannst du nun PHP-Anwendungen bereitstellen oder selbst mit dem Programmieren beginnen. Daf\u00fcr wirst du in den meisten F\u00e4llen MySQL oder eine andere Datenbank ben\u00f6tigen. Diese l\u00e4sst sich ebenfalls mit Docker-Compose sehr einfach bereitstellen.<\/p>\n<p>W\u00e4hrend dies f\u00fcr eine Testinstanz ausreichend ist, solltest du allerdings zus\u00e4tzliche Sicherheitsma\u00dfnahmen ergreifen, bevor du dies per Internet bereitstellst. Auch das greifen wir in einem eigenen Beitrag auf.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In einem vorherigen Beitrag habe ich eine einfache Apache2-Installation mit den Paketquellen vom Raspberry Pi OS gezeigt, die unter Debian auf x86 Hardware eben so umgesetzt werden kann. Webserver und PHP werden dabei direkt auf dem Pi installiert. Dies hat mehrere Nachteile: Daher macht es Sinn, hierf\u00fcr Docker zusammen mit Docker-Compose einzusetzen. Beides ist daher &#8230;<\/p>\n","protected":false},"author":5,"featured_media":7891,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[671],"tags":[718,55,937],"class_list":["post-7883","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-raspberry-pi","tag-apache","tag-php","tag-webserver"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7883","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=7883"}],"version-history":[{"count":4,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7883\/revisions"}],"predecessor-version":[{"id":9814,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7883\/revisions\/9814"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/7891"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=7883"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=7883"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=7883"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}