[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"btz8hO-MXSFLpybqvfjYVBre4OvrEJO1wFySe3Zmv-s":3,"9_t0YFtO844PW3-iCfPxRTbw8yv0-2zzu2bChZFenjo":39,"rJAretBh69SkMw0qh0nwlC9R7sPqk8pNFWlYC1Iwt5k":75,"C_w9uFzTf4t407Mkd4qG0a8DAzbqOxuq33VYLkEma8M":178,"_apollo:default":220},{"menu":4},{"__typename":5,"id":6,"name":7,"items":8},"Menu","footer","Fußzeile",[9,24,29,34],{"__typename":10,"id":11,"title":12,"description":13,"url":14,"langcode":15,"internal":20,"expanded":21,"attributes":22},"MenuItem","e2873307-b50a-4aab-b6b2-1950fd99c72e","Impressum",null,"/impressum",{"__typename":16,"id":17,"name":18,"direction":19},"Language","de","German","ltr",true,false,{"__typename":23,"class":13},"MenuItemAttributes",{"__typename":10,"id":25,"title":26,"description":13,"url":27,"langcode":15,"internal":20,"expanded":21,"attributes":28},"2cd9b7c9-142a-4ea3-b898-a0952c54a195","Datenschutz","/datenschutz",{"__typename":23,"class":13},{"__typename":10,"id":30,"title":31,"description":13,"url":32,"langcode":15,"internal":20,"expanded":21,"attributes":33},"a5effba3-5a8c-4125-8d78-0cdba09824db","AGB","/agb",{"__typename":23,"class":13},{"__typename":10,"id":35,"title":36,"description":13,"url":37,"langcode":15,"internal":21,"expanded":21,"attributes":38},"114bf071-bdbb-44cf-85c1-69e9d9e0777d","Newsletter","https://liechtenecker.at/newsletter-subscribe",{"__typename":23,"class":13},{"menu":40},{"__typename":5,"id":41,"name":42,"items":43},"nuxt-main-menu","Nuxt Hauptmenü",[44,50,55,60,65,70],{"__typename":10,"id":45,"title":46,"description":13,"url":47,"langcode":48,"internal":20,"expanded":21,"attributes":49},"9ffc5019-cbd8-4b2e-8eb7-9feae486d4a1","Blog","/know-how",{"__typename":16,"id":17,"name":18,"direction":19},{"__typename":23,"class":13},{"__typename":10,"id":51,"title":52,"description":13,"url":53,"langcode":48,"internal":20,"expanded":21,"attributes":54},"1c7a5430-8a42-4b24-9544-252adabc2f4c","Projekte","/projekte",{"__typename":23,"class":13},{"__typename":10,"id":56,"title":57,"description":13,"url":58,"langcode":48,"internal":20,"expanded":21,"attributes":59},"9c4feedc-79e4-4fbf-b68c-065f33ebfe4c","Sparring","/workshop-ux-sparring-fuer-unternehmen",{"__typename":23,"class":13},{"__typename":10,"id":61,"title":62,"description":13,"url":63,"langcode":48,"internal":20,"expanded":21,"attributes":64},"3b77a27b-272a-489f-843e-53e23ed07741","Trainings","/liechtenecker-ux-academy",{"__typename":23,"class":13},{"__typename":10,"id":66,"title":67,"description":13,"url":68,"langcode":48,"internal":20,"expanded":21,"attributes":69},"ce0bb82b-e1ee-4036-be95-f693a62e9f4a","Über uns","/about",{"__typename":23,"class":13},{"__typename":10,"id":71,"title":72,"description":13,"url":73,"langcode":48,"internal":20,"expanded":21,"attributes":74},"04a19381-81a9-4694-8653-182d8855d2b5","Kontakt","/kontakt",{"__typename":23,"class":13},{"route":76},{"__typename":77,"entity":78},"RouteInternal",{"__typename":79,"id":80,"title":81,"changed":82,"created":88,"langcode":89,"path":90,"promote":21,"status":20,"sticky":21,"metatag":91,"postCategory":115,"postContentElements":13,"evergreen":13,"tags":140,"postWpBody":146,"wpHeaderImage":150,"wpHeaderImageOld":13,"wpHeaderImageOldSmall":13,"wpOgImage":162,"wpPromotedTeaserImage":13,"wpShareDescription":13,"wpShareTitle":13,"wpTeaserText":149,"wpYoastHead":171,"author":172},"NodeWpPost","768","Dockerize Drupal 9",{"__typename":83,"timestamp":84,"timezone":85,"offset":86,"time":87},"DateTime",1610546406,"UTC","+00:00","2021-01-13T14:00:06+00:00",{"__typename":83,"timestamp":84,"timezone":85,"offset":86,"time":87},{"__typename":16,"id":17,"name":18,"direction":19},"/blog/dockerize-drupal-9-mit-container-applikation",[92,99,106,111],{"__typename":93,"tag":94,"attributes":95},"MetaTagValue","meta",{"__typename":96,"name":97,"content":98},"MetaTagValueAttributes","title","Dockerize Drupal 9 | Liechtenecker UX Design Studio",{"__typename":100,"tag":101,"attributes":102},"MetaTagLink","link",{"__typename":103,"href":104,"hreflang":13,"rel":105,"media":13,"sizes":13,"type":13},"MetaTagLinkAttributes","http://liechtenecker-cms.liechtenecker-cms.svc.cluster.local/blog/dockerize-drupal-9-mit-container-applikation","canonical",{"__typename":107,"tag":94,"attributes":108},"MetaTagProperty",{"__typename":109,"property":110,"content":81},"MetaTagPropertyAttributes","og:title",{"__typename":107,"tag":94,"attributes":112},{"__typename":109,"property":113,"content":114},"og:image","http://liechtenecker-cms.liechtenecker-cms.svc.cluster.local/sites/default/files/styles/meta_og_image/public/wp-migration/wordpress-media-image/2021/01/fb.jpg?h=3ecc83bb&itok=5crdejP2",{"__typename":116,"id":117,"name":118,"path":119,"status":20,"weight":120,"description":121,"langcode":125,"changed":126,"metatag":129},"TermCategories","7","Technologie","/kategorie/technologie",0,{"__typename":122,"processed":123,"format":124},"Text","Development Themen sowie zukünftige Technologien, mit denen wir uns auseinandersetzen. ","wp_html",{"__typename":16,"id":17,"name":18,"direction":19},{"__typename":83,"timestamp":127,"timezone":85,"offset":86,"time":128},1713772777,"2024-04-22T07:59:37+00:00",[130,133,137],{"__typename":93,"tag":94,"attributes":131},{"__typename":96,"name":97,"content":132},"Technologie | Liechtenecker UX Design Studio",{"__typename":93,"tag":94,"attributes":134},{"__typename":96,"name":135,"content":136},"description","Development Themen sowie zukünftige Technologien, mit denen wir uns auseinandersetzen.",{"__typename":100,"tag":101,"attributes":138},{"__typename":103,"href":139,"hreflang":13,"rel":105,"media":13,"sizes":13,"type":13},"http://liechtenecker-cms.liechtenecker-cms.svc.cluster.local/kategorie/technologie",[141],{"__typename":142,"id":143,"name":144,"path":145,"weight":120},"TermTags","376","Drupal","/tag/drupal",{"__typename":147,"processed":148,"format":124,"summary":149},"TextSummary","\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \u003Cdiv class=\"blog-drop-cap\">\n                    \u003Cdiv class=\"blog-drop-cap-background\">\nW\u003C/div>\n\u003Cp class=\"has-drop-cap\">Wozu das Ganze?&nbsp;\u003C/p>\n\u003C/div>        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Es gibt mehrere Vorteile, wenn Anwendungen in Docker-Containern laufen. Hier mal die 3, die mich überzeugt haben:&nbsp;\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3  standard-list\">\n            \n\u003Col>\u003Cli>Auf einem System können gleichzeitig mehrere Systeme mit unterschiedlichen Dependencies laufen. Ich kann also gleichzeitig eine PHP5 und eine PHP7 Applikation laufen lassen!\u003C/li>\u003Cli>Entwicklungsumgebungen können automatisiert konfiguriert und hochgefahren werden.\u003C/li>\u003Cli>Wir sind dem Hosting auf Kubernetes einen Schritt näher.\u003C/li>\u003C/ol>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Im folgenden Beitrag erkläre ich, wie du eine Drupal 9 Applikation als Docker Image bereitstellen kannst. Auf die Basics zu Docker, und was das eigentlich ist, werde ich in diesem Beitrag nicht näher eingehen. Sollten dir noch jegliche Grundlagen zu Docker fehlen, empfehle ich zuerst den Artikel&nbsp; \u003Ca href=\"/blog/lets-dockerize-everything\" target=\"_blank\" rel=\"noreferrer noopener\">“Let’s dockerize everything”\u003C/a> zu lesen, und natürlich auch die \u003Ca href=\"https://www.docker.com/\" target=\"_blank\" rel=\"noreferrer noopener\">offizielle Docker Website\u003C/a> zu durchforsten.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Auch zu Kubernetes werde ich in diesem Beitrag nichts erklären. Falls du dennoch schon neugierig bist, kannst du schon mal durch die \u003Ca href=\"https://kubernetes.io/de/docs/concepts/overview/what-is-kubernetes/\" target=\"_blank\" rel=\"noreferrer noopener\">Kubernetes Dokumentation\u003C/a> surfen, um dir einen Überblick zu verschaffen! 🙂&nbsp;\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"wide-left col-xsmall-12 col-medium-8 col-medium-offset-1 \">\n            \n\u003Ch2 data-ftf=\"true\">Docker-Image erstellen\u003C/h2>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Ein Docker-Image zu erstellen ist recht simple. Alles was man dafür benötigt ist ein Dockerfile. Meistens wird dies im Projekt-Root abgelegt.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Wie auf der \u003Ca href=\"https://docs.docker.com/engine/reference/builder/\" target=\"_blank\" rel=\"noreferrer noopener\">Dockerfile reference\u003C/a> erwähnt wird, \u003Cstrong>muss jedes Dockerfile ein FROM Statement\u003C/strong> enthalten. Dieses Statement gibt das Parent-Image an, welches als Basis verwendet wird. Das kann beispielsweise ein blankes \u003Ca href=\"https://hub.docker.com/_/debian\" target=\"_blank\" rel=\"noreferrer noopener\">Debian Betriebssystem\u003C/a> sein, oder eines mit diversen vorinstallierten Programmen. Auf Docker Hub stehen zig \u003Ca href=\"https://hub.docker.com/search?q=&amp;type=image\" target=\"_blank\" rel=\"noreferrer noopener\">Images zur Auswahl\u003C/a> (heute: 4.394.740) und man kann jedes einzelne erweitern.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Wir verwenden das \u003Ca href=\"https://hub.docker.com/_/php\" target=\"_blank\" rel=\"noreferrer noopener\">offizielle PHP Image\u003C/a> für unsere PHP Projekte. Dieses bietet eine Vielzahl an verschiedenen Tags für unterschiedliche Anwendungsbereiche an. Für unsere Drupal Projekte verwenden wir \u003Cstrong>php:7.4-apache\u003C/strong>, da in diesem Image bereits ein \u003Ca href=\"https://httpd.apache.org/\" target=\"_blank\" rel=\"noreferrer noopener\">Apache2 Webserver\u003C/a> vorinstalliert ist.&nbsp;\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Ein minimales, funktionales Dockerfile würde also folgendermaßen aussehen:\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cpre class=\"wp-block-code\">\u003Ccode>FROM php:7.4-apache\u003C/code>\u003C/pre>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>In der Praxis sieht man das so allerdings nicht, weil das Image dem parent Image exakt gleicht — das wäre natürlich sinnlos 😉\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Hier fehlen noch die projektspezifischen Dependencies! Für Drupal wird man beispielsweise weitere PHP Extensions installieren müssen.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"wide-left col-xsmall-12 col-medium-8 col-medium-offset-1 \">\n            \n\u003Ch2 data-ftf=\"true\">Drupal Base-Image\u003C/h2>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Wenn es darum geht, mehrere Drupal Projekte gleichzeitig zu verwalten, ergibt es definitiv Sinn, ein eigenes Base-Image dafür zu erstellen. Das Drupal Base-Image erweitert php:7.4-apache um weitere Dependencies, benutzerdefinierte Scripte, und alles weitere, was in Drupal-Projekten so benötigt wird. In meinem Fall ist das Folgendes:\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3  standard-list\">\n            \n\u003Cul>\u003Cli>Programme (zip, unzip, zsh, oh-my-zsh, memcached, …)\u003C/li>\u003Cli>PHP-Extensions (pdo_mysql, gd, opcache, memcached, …)&nbsp;\u003C/li>\u003Cli>Custom Scripts\u003C/li>\u003C/ul>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Hier findest du ein simplifiziertes Dockerfile (und ein paar Dateien, welche darin referenziert werden) auf Github: \u003Ca href=\"https://gist.github.com/dsteindl/bc7295c9cc6612813a538c026efa0e14\" target=\"_blank\" rel=\"noreferrer noopener\">https://gist.github.com/dsteindl/bc7295c9cc6612813a538c026efa0e14\u003C/a> \u003Cbr>Jeder Schritt ist in einem Kommentar erklärt.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Wie bereits erwähnt, handelt es sich dabei um eine vereinfachte Version eines Base-Images. Das Beispiel soll lediglich veranschaulichen, wie einfach es ist, Dependencies in ein Docker-Image zu laden. In einem tatsächlichen Projekt sollte es so nicht verwendet werden, da auf wichtige Komponenten einer Drupal Umgebung nicht eingegangen wurde:&nbsp; Filesystem Security, Konfigurationsmanagement, Multi-Environment Setup, etc.\u003Cbr>Sobald du dein eigenes Base-Image erstellt hast, muss es in eine Docker-Registry deiner Wahl gepusht werden. \u003Ca href=\"https://hub.docker.com\" target=\"_blank\" rel=\"noreferrer noopener\">Dockerhub (Docker’s hauseigene Registry)\u003C/a> ist die wohl bekannteste Alternative.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>\u003Cstrong>Achtung: \u003C/strong>zum Erstellen privater Repositories benötigt man auf Dockerhub einen Pro Account! Sollte dein Projekt heikle Business-Logik enthalten, bitte unbedingt darauf achten.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Der Einfachheit halber werde ich in diesem Artikel auch weiterhin von Dockerhub sprechen – du kannst das aber natürlich wie gesagt durch die Docker-Registry deiner Wahl ersetzen 🙂\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"wide-left col-xsmall-12 col-medium-8 col-medium-offset-1 \">\n            \n\u003Ch2 data-ftf=\"true\">Projektspezifisches Image\u003C/h2>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Da nun ein Base-Image auf Dockerhub liegt, kann pro Projekt ganz einfach ein Image erstellt werden.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Das projektspezifische Image erbt nun vom vorher erstellten Drupal Base-Image, wodurch alle Drupal Dependencies automatisch im Image geladen sind.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Hier ein Beispiel Dockerfile:\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cpre class=\"wp-block-code\">\u003Ccode># FROM &lt;your-repo&gt;/&lt;your-image&gt;:&lt;your-tag&gt;\n# example:\nFROM myrepo/drupal:php74-apache \n\n# Copy source code\nCOPY . /var/www/html\n\n# install composer dependencies dependencies\nRUN composer install --optimize-autoloader --no-dev\u003C/code>\u003C/pre>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Dieses Dockerfile lädt nun alle Drupal Dependencies vom Base-Image, kopiert das komplette Drupal Projekt in den Ordner /var/www/html und führt ein composer install aus, um die projektspezifischen Composer-Dependencies zu laden.&nbsp;\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Das war’s auch schon. Das Drupal-Image ist vorbereitet und kann gestartet werden!\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"wide-left col-xsmall-12 col-medium-8 col-medium-offset-1 \">\n            \n\u003Ch2 data-ftf=\"true\">Uploads\u003C/h2>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Ein wichtiger Punkt, um den man sich bei der Dockerisierung von Drupal kümmern muss (und das trifft auch auf viele andere Systeme zu), sind alle Daten, die permanent gespeichert bleiben sollen. Im Falle eines CMS: die Uploads.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Docker Container – und somit auch alle Daten im Container – sind grundsätzlich nicht permanent gespeichert. \u003Cstrong>Sie existieren nur solange der Container läuft!\u003C/strong>&nbsp;\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Daher müssen wir uns darum kümmern, dass Uploads, und jegliche anderen Files, die permanent gespeichert werden sollen, nicht nur im Container, sondern auch auf dem Host-System (oder einem anderen permanenten Speichermedium) gespeichert werden.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Natürlich hat Docker auch dafür eine Lösung parat: \u003Ca href=\"https://docs.docker.com/storage/volumes/\" target=\"_blank\" rel=\"noreferrer noopener\">Persistent Volumes\u003C/a>!\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Persistent Volumes werden beim Starten eines Docker-Containers in den Container gemountet. Man kann beispielsweise einen Ordner des Host-Systems als Volume bereitstellen und dieses dann in den gewünschten Pfad im Container mounten. Wenn nun Dateien innerhalb des Containers in dem gemounteten Ordner erstellt werden, werden diese auch in den Ordner am Host-System gespiegelt!\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Bei Drupal wäre das z.B. der public files Ordner: \u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cpre class=\"wp-block-code\">\u003Ccode>./web/sites/default/files\u003C/code>\u003C/pre>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Hier werden alle Uploads gespeichert.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"wide-left col-xsmall-12 col-medium-8 col-medium-offset-1 \">\n            \n\u003Ch2 data-ftf=\"true\">Die Datenbank\u003C/h2>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Wie wir wissen benötigt Drupal eine Datenbank. Dafür kann ebenfalls ein Docker Container gestartet werden. Das ist auch ganz einfach – es gibt für beinahe alle gängigen Datenbanken ein offizielles Docker-Image. Einfach auf Dockerhub nach der gewünschten Datenbank suchen (Bsp.: mariadb, postgres, mysql, …) und die offiziellen Docker-Images verwenden.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Wir verwenden für unsere lokalen Entwicklungsumgebungen meist das \u003Ca href=\"https://hub.docker.com/r/bitnami/mariadb\" target=\"_blank\" rel=\"noreferrer noopener\">Bitnami MariaDB Image\u003C/a> und sind damit sehr zufrieden.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"wide-left col-xsmall-12 col-medium-8 col-medium-offset-1 \">\n            \n\u003Ch2 data-ftf=\"true\">Compose\u003C/h2>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Wenn man einen Docker Container auf seinem Rechner starten möchte, muss man je nach Image Folgendes bedenken:&nbsp;\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3  standard-list\">\n            \n\u003Cul>\u003Cli>Ports freigeben\u003C/li>\u003Cli>Environment Variablen konfigurieren\u003C/li>\u003Cli>Volumes mounten,&nbsp;\u003C/li>\u003Cli>… weitere projektspezifische Konfigurationen\u003C/li>\u003C/ul>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Es ist natürlich möglich, all diese Parameter dem klassischen docker run Befehl zu übergeben, jedoch kann der Command schnell sehr lang werden. Sobald Kubernetes ins Spiel kommt, werden alle konfigurierbaren Werte als Environment Variablen übergeben.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp class=\"has-normal-font-size\">Das sieht dann schnell mal so aus:&nbsp;\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cpre class=\"wp-block-code\">\u003Ccode>docker run \\\n    -p 80:80 \\\n    -v ./web/sites/default/files:/var/www/html/web/sites/default/files:delegated \\\n    -v ./files/private:/var/www/html/files/private \\\n    -e DATABASE_HOST=db-host \\\n    -e DATABASE_USERNAME=db-username \\\n    -e DATABASE_PASSWORD=db-password \\\n    -e DATABASE_NAME=drupal-example \\\n    -t drupal-example \\\n    - ... \\\n     .\u003C/code>\u003C/pre>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Und hier kommt docker-compose zum Einsatz!&nbsp;\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Durch docker-compose können Docker Services ganz einfach als YAML Files konfiguriert werden. Dadurch ist die Konfiguration der Services schön strukturiert in einem File. Yeah!&nbsp;\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Ich werde hier nicht auf die Syntax der docker-compose Files eingehen. Bei Interesse findest du in der \u003Ca href=\"https://docs.docker.com/compose/compose-file/\" target=\"_blank\" rel=\"noreferrer noopener\">Docker Dokumentation\u003C/a> mehr dazu.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Beim Drupal Beispiel werden 2 Services, also 2 Container benötigt:\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3  standard-list\">\n            \n\u003Cul>\u003Cli>MariaDB\u003C/li>\u003Cli>Drupal 9\u003C/li>\u003C/ul>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Hier ein Beispiel docker-compose.yml:\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>\u003Ca href=\"https://gist.github.com/dsteindl/00b49711d6ee84d6067f8f82308736a0\" target=\"_blank\" rel=\"noreferrer noopener\">https://gist.github.com/dsteindl/00b49711d6ee84d6067f8f82308736a0\u003C/a>\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Das compose-File ist um einiges schöner zu lesen und kann deutlich einfacher konfiguriert werden im Vergleich zur Übergabe der Options im Terminal.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Will man die konfigurierten Container starten, muss man lediglich Folgendes ausführen:\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cpre class=\"wp-block-code\">\u003Ccode>docker-compose up\u003C/code>\u003C/pre>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Wenn man die Images neu builden möchte, geht das auch ganz einfach:\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cpre class=\"wp-block-code\">\u003Ccode>docker-compose build\u003C/code>\u003C/pre>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"wide-left col-xsmall-12 col-medium-8 col-medium-offset-1 \">\n            \n\u003Ch2 data-ftf=\"true\">Fazit\u003C/h2>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Das wars auch schon! Eigentlich ist’s gar nicht so kompliziert, ein Drupal 9 Docker Image zu erstellen, oder?\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Interessiert an weiteren technischen Artikeln zu Drupal 8/9?&nbsp;\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Es gäbe noch eine Menge zu erzählen – unter anderem:\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3  standard-list\">\n            \n\u003Cul>\u003Cli>Filesystem Security\u003C/li>\u003Cli>Must-have Drupal Module\u003C/li>\u003Cli>Konfigurationsmanagement\u003C/li>\u003Cli>Kubernetes Deployment\u003C/li>\u003Cli>Kubernetes Deployment automatisieren\u003C/li>\u003Cli>Multi-Environment System (dev, staging, fqa, production)\u003C/li>\u003C/ul>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n","Der heutige Blogartikel wird etwas technischer als gewöhnlich, denn heute geht’s darum, Drupal 9 als Container-Anwendung bereitzustellen. Der Artikel gilt für Drupal 9 wie auch für Drupal 8.",{"__typename":151,"id":152,"excludeFromScreenreader":13,"mediaImage":153,"name":158,"path":161,"status":20},"MediaImage","740",{"__typename":154,"url":155,"width":156,"height":157,"alt":81,"title":158,"size":159,"mime":160},"Image","http://liechtenecker-cms.liechtenecker-cms.svc.cluster.local/sites/default/files/wp-migration/wordpress-media-image/2021/01/website-neu-2880x1300-1-scaled.jpg",2560,1156,"website neu 2880x1300",710052,"image/jpeg","/media/740/edit",{"__typename":151,"id":163,"excludeFromScreenreader":13,"mediaImage":164,"name":168,"path":170,"status":20},"739",{"__typename":154,"url":165,"width":166,"height":167,"alt":13,"title":168,"size":169,"mime":160},"http://liechtenecker-cms.liechtenecker-cms.svc.cluster.local/sites/default/files/wp-migration/wordpress-media-image/2021/01/fb.jpg",1204,630,"fb",594186,"/media/739/edit","\u003C!-- This site is optimized with the Yoast SEO plugin v15.7 - https://yoast.com/wordpress/plugins/seo/ -->\n\u003Cmeta name=\"description\" content=\"In diesem Artikel erfährst du die Basics, wie du deine Drupal Instanz in einem Docker Container zum Laufen bringst!\" />\n\u003Cmeta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" />\n\u003Clink rel=\"canonical\" href=\"https://legacy.liechtenecker.dev/blog/dockerize-drupal-9-mit-container-applikation/\" />\n\u003Cmeta property=\"og:locale\" content=\"de_DE\" />\n\u003Cmeta property=\"og:type\" content=\"article\" />\n\u003Cmeta property=\"og:title\" content=\"Dockerize Drupal 9 - Drupal 9 als Container Applikation - Liechtenecker\" />\n\u003Cmeta property=\"og:description\" content=\"In diesem Artikel erfährst du die Basics, wie du deine Drupal Instanz in einem Docker Container zum Laufen bringst!\" />\n\u003Cmeta property=\"og:url\" content=\"https://legacy.liechtenecker.dev/blog/dockerize-drupal-9-mit-container-applikation/\" />\n\u003Cmeta property=\"og:site_name\" content=\"Liechtenecker\" />\n\u003Cmeta property=\"article:published_time\" content=\"2021-01-13T15:00:06+00:00\" />\n\u003Cmeta name=\"twitter:card\" content=\"summary_large_image\" />\n\u003Cmeta name=\"twitter:label1\" content=\"Geschätzte Lesezeit\">\n\t\u003Cmeta name=\"twitter:data1\" content=\"6 Minuten\">\n\u003Cscript type=\"application/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https://legacy.liechtenecker.dev/#website\",\"url\":\"https://legacy.liechtenecker.dev/\",\"name\":\"Liechtenecker\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https://legacy.liechtenecker.dev/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de-DE\"},{\"@type\":\"WebPage\",\"@id\":\"https://legacy.liechtenecker.dev/blog/dockerize-drupal-9-mit-container-applikation/#webpage\",\"url\":\"https://legacy.liechtenecker.dev/blog/dockerize-drupal-9-mit-container-applikation/\",\"name\":\"Dockerize Drupal 9 - Drupal 9 als Container Applikation - Liechtenecker\",\"isPartOf\":{\"@id\":\"https://legacy.liechtenecker.dev/#website\"},\"datePublished\":\"2021-01-13T15:00:06+00:00\",\"dateModified\":\"2021-01-13T15:00:06+00:00\",\"author\":{\"@id\":\"https://legacy.liechtenecker.dev/#/schema/person/d8b80cc046b867225321ea8b7a2a6de7\"},\"description\":\"In diesem Artikel erf\\u00e4hrst du die Basics, wie du deine Drupal Instanz in einem Docker Container zum Laufen bringst!\",\"inLanguage\":\"de-DE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https://legacy.liechtenecker.dev/blog/dockerize-drupal-9-mit-container-applikation/\"]}]},{\"@type\":\"Person\",\"@id\":\"https://legacy.liechtenecker.dev/#/schema/person/d8b80cc046b867225321ea8b7a2a6de7\",\"name\":\"Daniel\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https://legacy.liechtenecker.dev/#personlogo\",\"inLanguage\":\"de-DE\",\"url\":\"https://secure.gravatar.com/avatar/5708f7599c8e99528411ef29bef1ee34?s=96&d=mm&r=g\",\"caption\":\"Daniel\"}}]}\u003C/script>\n\u003C!-- / Yoast SEO plugin. -->",{"__typename":173,"id":174,"myRole":175,"name":176,"nickname":177},"User","5","Backend Development🤓","d-steindl","Daniel",{"latestKnowhow":179},[180,195,208],{"__typename":79,"id":181,"title":182,"path":183,"wpTeaserText":184,"wpPromotedTeaserImage":13,"wpHeaderImage":185},"1619","Behind the scenes: Ein Barrierefreiheits-Audit","/blog/behind-scenes-ein-barrierefreiheits-audit","”Entspricht unsere Website den gesetzlichen Anforderungen und wenn nicht, was genau müssen wir ändern?”\r\nDiese Frage lieben wir. Echt! Und so sieht unsere Antwort aus.",{"__typename":151,"id":186,"excludeFromScreenreader":13,"mediaImage":187,"name":193,"path":194,"status":20},"3364",{"__typename":154,"url":188,"width":189,"height":190,"alt":191,"title":13,"size":192,"mime":160},"http://liechtenecker-cms.liechtenecker-cms.svc.cluster.local/sites/default/files/2026-04/Headerbilder%20Blogartikel%20Behind%20the%20scene%20Accessibility%20Audit.jpg",2880,1300,"Headline mit Sujet: Tastatur mit Symbolen für Barrierefreiheit im Fokus auf hellem  Hintergrund",838204,"Headerbilder Blogartikel Behind the scene Accessibility Audit.jpg","/media/3364/edit",{"__typename":79,"id":196,"title":197,"path":198,"wpTeaserText":199,"wpPromotedTeaserImage":13,"wpHeaderImage":200},"1616","Agentic KI trifft Design-System: Wie unser Presentation Maker entstand.","/blog/agentic-ki-trifft-design-system-wie-unser-presentation-maker-entstand","Nein, wir wollen euch jetzt nicht erzählen, was KI alles kann. Aber wir möchten euch zeigen, wie wir mit KI umgehen. \r\n",{"__typename":151,"id":201,"excludeFromScreenreader":13,"mediaImage":202,"name":206,"path":207,"status":20},"3355",{"__typename":154,"url":203,"width":189,"height":190,"alt":204,"title":13,"size":205,"mime":160},"http://liechtenecker-cms.liechtenecker-cms.svc.cluster.local/sites/default/files/2026-03/BLOG_Presentation%20Tool_TITEL-2880x1300px_1.jpg","Lukas und Daniel  arbeiten an Computern im Büro.",2621988,"BLOG_Presentation Tool_TITEL-2880x1300px.jpg","/media/3355/edit",{"__typename":79,"id":209,"title":210,"path":211,"wpTeaserText":13,"wpPromotedTeaserImage":13,"wpHeaderImage":212},"1606","UI Trends 2026","/blog/ui-trends-2026",{"__typename":151,"id":213,"excludeFromScreenreader":21,"mediaImage":214,"name":218,"path":219,"status":20},"3303",{"__typename":154,"url":215,"width":189,"height":190,"alt":216,"title":13,"size":217,"mime":160},"http://liechtenecker-cms.liechtenecker-cms.svc.cluster.local/sites/default/files/2026-01/BLOG_Trendbericht%202026.jpg","UI Trends 2026, gelber Hintergrund, schwarze Schrift.",4700748,"BLOG_Trendbericht 2026.jpg","/media/3303/edit",{"Language:de":221,"MenuItem:e2873307-b50a-4aab-b6b2-1950fd99c72e":222,"MenuItem:2cd9b7c9-142a-4ea3-b898-a0952c54a195":226,"MenuItem:a5effba3-5a8c-4125-8d78-0cdba09824db":229,"MenuItem:114bf071-bdbb-44cf-85c1-69e9d9e0777d":232,"Menu:footer":235,"ROOT_QUERY":245,"MenuItem:9ffc5019-cbd8-4b2e-8eb7-9feae486d4a1":261,"MenuItem:1c7a5430-8a42-4b24-9544-252adabc2f4c":264,"MenuItem:9c4feedc-79e4-4fbf-b68c-065f33ebfe4c":267,"MenuItem:3b77a27b-272a-489f-843e-53e23ed07741":270,"MenuItem:ce0bb82b-e1ee-4036-be95-f693a62e9f4a":273,"MenuItem:04a19381-81a9-4694-8653-182d8855d2b5":276,"Menu:nuxt-main-menu":279,"TermCategories:7":293,"TermTags:376":304,"MediaImage:740":305,"MediaImage:739":307,"User:5":309,"NodeWpPost:768":310,"MediaImage:3364":335,"NodeWpPost:1619":337,"MediaImage:3355":340,"NodeWpPost:1616":342,"MediaImage:3303":345,"NodeWpPost:1606":347},["null","__typename",16,"id",17,"name",18,"direction",19],["null","__typename",10,"id",11,"title",12,"description",13,"url",14,"langcode",223,"internal",20,"expanded",21,"attributes",225],{"__ref":224},"Language:de",["null","__typename",23,"class",13],["null","__typename",10,"id",25,"title",26,"description",13,"url",27,"langcode",227,"internal",20,"expanded",21,"attributes",228],{"__ref":224},["null","__typename",23,"class",13],["null","__typename",10,"id",30,"title",31,"description",13,"url",32,"langcode",230,"internal",20,"expanded",21,"attributes",231],{"__ref":224},["null","__typename",23,"class",13],["null","__typename",10,"id",35,"title",36,"description",13,"url",37,"langcode",233,"internal",21,"expanded",21,"attributes",234],{"__ref":224},["null","__typename",23,"class",13],["null","__typename",5,"id",6,"name",7,"items",236],[237,239,241,243],{"__ref":238},"MenuItem:e2873307-b50a-4aab-b6b2-1950fd99c72e",{"__ref":240},"MenuItem:2cd9b7c9-142a-4ea3-b898-a0952c54a195",{"__ref":242},"MenuItem:a5effba3-5a8c-4125-8d78-0cdba09824db",{"__ref":244},"MenuItem:114bf071-bdbb-44cf-85c1-69e9d9e0777d",["null","__typename",246,"menu({\"name\":\"FOOTER\"})",247,"menu({\"name\":\"NUXT_MAIN_MENU\"})",249,"route({\"path\":\"/blog/dockerize-drupal-9-mit-container-applikation\"})",251,"latestKnowhow({\"excludeId\":\"768\",\"limit\":3})",254],"Query",{"__ref":248},"Menu:footer",{"__ref":250},"Menu:nuxt-main-menu",["null","__typename",77,"entity",252],{"__ref":253},"NodeWpPost:768",[255,257,259],{"__ref":256},"NodeWpPost:1619",{"__ref":258},"NodeWpPost:1616",{"__ref":260},"NodeWpPost:1606",["null","__typename",10,"id",45,"title",46,"description",13,"url",47,"langcode",262,"internal",20,"expanded",21,"attributes",263],{"__ref":224},["null","__typename",23,"class",13],["null","__typename",10,"id",51,"title",52,"description",13,"url",53,"langcode",265,"internal",20,"expanded",21,"attributes",266],{"__ref":224},["null","__typename",23,"class",13],["null","__typename",10,"id",56,"title",57,"description",13,"url",58,"langcode",268,"internal",20,"expanded",21,"attributes",269],{"__ref":224},["null","__typename",23,"class",13],["null","__typename",10,"id",61,"title",62,"description",13,"url",63,"langcode",271,"internal",20,"expanded",21,"attributes",272],{"__ref":224},["null","__typename",23,"class",13],["null","__typename",10,"id",66,"title",67,"description",13,"url",68,"langcode",274,"internal",20,"expanded",21,"attributes",275],{"__ref":224},["null","__typename",23,"class",13],["null","__typename",10,"id",71,"title",72,"description",13,"url",73,"langcode",277,"internal",20,"expanded",21,"attributes",278],{"__ref":224},["null","__typename",23,"class",13],["null","__typename",5,"id",41,"name",42,"items",280],[281,283,285,287,289,291],{"__ref":282},"MenuItem:9ffc5019-cbd8-4b2e-8eb7-9feae486d4a1",{"__ref":284},"MenuItem:1c7a5430-8a42-4b24-9544-252adabc2f4c",{"__ref":286},"MenuItem:9c4feedc-79e4-4fbf-b68c-065f33ebfe4c",{"__ref":288},"MenuItem:3b77a27b-272a-489f-843e-53e23ed07741",{"__ref":290},"MenuItem:ce0bb82b-e1ee-4036-be95-f693a62e9f4a",{"__ref":292},"MenuItem:04a19381-81a9-4694-8653-182d8855d2b5",["null","__typename",116,"id",117,"name",118,"path",119,"status",20,"weight",120,"description",294,"langcode",295,"changed",296,"metatag",297],["null","__typename",122,"processed",123,"format",124],{"__ref":224},["null","__typename",83,"timestamp",127,"timezone",85,"offset",86,"time",128],[298,300,302],["null","__typename",93,"tag",94,"attributes",299],["null","__typename",96,"name",97,"content",132],["null","__typename",93,"tag",94,"attributes",301],["null","__typename",96,"name",135,"content",136],["null","__typename",100,"tag",101,"attributes",303],["null","__typename",103,"href",139,"hreflang",13,"rel",105,"media",13,"sizes",13,"type",13],["null","__typename",142,"id",143,"name",144,"path",145,"weight",120],["null","__typename",151,"id",152,"excludeFromScreenreader",13,"mediaImage",306,"name",158,"path",161,"status",20],["null","__typename",154,"url",155,"width",156,"height",157,"alt",81,"title",158,"size",159,"mime",160],["null","__typename",151,"id",163,"excludeFromScreenreader",13,"mediaImage",308,"name",168,"path",170,"status",20],["null","__typename",154,"url",165,"width",166,"height",167,"alt",13,"title",168,"size",169,"mime",160],["null","__typename",173,"id",174,"myRole",175,"name",176,"nickname",177],["null","__typename",79,"id",80,"title",81,"changed",311,"created",312,"langcode",313,"path",90,"promote",21,"status",20,"sticky",21,"metatag",314,"category",323,"contentElements",13,"evergreen",13,"tags",325,"wpBody",328,"wpHeaderImage",329,"wpHeaderImageOld",13,"wpHeaderImageOldSmall",13,"wpOgImage",331,"wpPromotedTeaserImage",13,"wpShareDescription",13,"wpShareTitle",13,"wpTeaserText",149,"wpYoastHead",171,"author",333],["null","__typename",83,"timestamp",84,"timezone",85,"offset",86,"time",87],["null","__typename",83,"timestamp",84,"timezone",85,"offset",86,"time",87],{"__ref":224},[315,317,319,321],["null","__typename",93,"tag",94,"attributes",316],["null","__typename",96,"name",97,"content",98],["null","__typename",100,"tag",101,"attributes",318],["null","__typename",103,"href",104,"hreflang",13,"rel",105,"media",13,"sizes",13,"type",13],["null","__typename",107,"tag",94,"attributes",320],["null","__typename",109,"property",110,"content",81],["null","__typename",107,"tag",94,"attributes",322],["null","__typename",109,"property",113,"content",114],{"__ref":324},"TermCategories:7",[326],{"__ref":327},"TermTags:376",["null","__typename",147,"processed",148,"format",124,"summary",149],{"__ref":330},"MediaImage:740",{"__ref":332},"MediaImage:739",{"__ref":334},"User:5",["null","__typename",151,"id",186,"excludeFromScreenreader",13,"mediaImage",336,"name",193,"path",194,"status",20],["null","__typename",154,"url",188,"width",189,"height",190,"alt",191,"title",13,"size",192,"mime",160],["null","__typename",79,"id",181,"title",182,"path",183,"wpTeaserText",184,"wpPromotedTeaserImage",13,"wpHeaderImage",338],{"__ref":339},"MediaImage:3364",["null","__typename",151,"id",201,"excludeFromScreenreader",13,"mediaImage",341,"name",206,"path",207,"status",20],["null","__typename",154,"url",203,"width",189,"height",190,"alt",204,"title",13,"size",205,"mime",160],["null","__typename",79,"id",196,"title",197,"path",198,"wpTeaserText",199,"wpPromotedTeaserImage",13,"wpHeaderImage",343],{"__ref":344},"MediaImage:3355",["null","__typename",151,"id",213,"excludeFromScreenreader",21,"mediaImage",346,"name",218,"path",219,"status",20],["null","__typename",154,"url",215,"width",189,"height",190,"alt",216,"title",13,"size",217,"mime",160],["null","__typename",79,"id",209,"title",210,"path",211,"wpTeaserText",13,"wpPromotedTeaserImage",13,"wpHeaderImage",348],{"__ref":349},"MediaImage:3303"]