Container mit Apache2 und PHP


Ich habe nicht auf Anhieb ein Docker-Image gefunden, das Apache2 und PHP enthält, daher ( und zum Lernen) habe ich mir die Informationen zusammen gesucht, wie ich selber einen entsprechenden Container erstellen kann. Dies hat außerdem den Vorteil, dass ich genau die Pakete hinzufügen kann, die ich für das von mir gewählte CMS GRAV benötige.

Dazu erstellen wir zunächst ein Verzeichnis webcontainer, darin legen wir eine Datei docker-compose.yml und eine Datei Dockerfile an:


mkdir webcontainer

cd webcontainer

bash -c "cat > docker-compose.yml" <<EOF
services:
  apache:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8080:80
    volumes:
      - /home/jgreven/Projects/IdeaProjects/ai-telligence.info:/var/www/html
      - /home/jgreven/Projects/IdeaProjects/ai-telligence.info/logs:/var/log/apache2
      - /home/jgreven/Projects/IdeaProjects/ai-telligence.info/docker_apache2.conf:/etc/apache2/apache2.conf
EOF

bash -c "cat > Dockerfile" <<EOF
FROM ubuntu:latest

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
    apache2 \
    php8.3 \
    php8.3-curl \
    php8.3-gd \
    php8.3-imagick \
    php8.3-mbstring \
    php8.3-xml \
    php8.3-yaml \
    php8.3-zip \
    libapache2-mod-php8.3 \
    composer \
    git \
    less \
    mc \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

RUN a2enmod php8.3
RUN a2enmod rewrite

EXPOSE 80

CMD ["apache2ctl", "-D", "FOREGROUND"]
EOF

bash -c "cat > docker_apache2_conf" <<EOF
DefaultRuntimeDir ${APACHE_RUN_DIR}
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

# These need to be set in /etc/apache2/envvars
# User ${APACHE_RUN_USER}
# Group ${APACHE_RUN_GROUP}
User ubuntu
Group ubuntu

HostnameLookups Off
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn

IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf

Include ports.conf

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>

<Directory /usr/share>
    AllowOverride None
    Require all granted
</Directory>

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

AccessFileName .htaccess

<FilesMatch "^\.ht">
    Require all denied
</FilesMatch>

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf
EOF

Selbstverständlich musst Du die Pfadangaben Deinen Gegebenheiten entsprechend anpassen. Du kannst dann den Container starten mit

docker compose up --build -d

Du kannst Dir die laufenden Container anzeigen lassen mit dem Befehl:

docker ps

Du kannst den Container mit dem folgenden Befehl ‚betreten‘:

docker exec -it <CONTAINER-NAME> bash

Du musst natürlich den Namen des Containers anpassen. Dabei funktioniert übrigens die Komplettierung mit der TAB-Taste!