A bejegyzés egy több részből álló konfiguráció első eleme. Most docker technológiával fogunk beüzemelni egy Apache webservert, mindezt alpine linux alapokon.
Előkészületek
Adjuk hozzá a docker repo-t a csomaglistánkhoz:
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
Majd telepítsük fel a docker aktuális stabil verzióját:
sudo apt update sudo apt install docker-ce docker-compose
Webserver Konfiguráció
A tervem az, hogy olyan alpine linux alapon működő image-t készítsek, mely egyedileg konfigurálható. Virtual hostokat nem tartalmaz. Az webes tartalmak kiszolgálása az alábbiak szerint fog működni:
- 1. A beérkező kéréseket a gazdagép Apache webservere fogadja, majd a domain névnek megfelelően átproxy-a a kérést az illetékes – konténerben futó – webserver felé
- 2. A konténerben futó Apache, ha php kóddal találkozik, átküldi a szintén konténerben futó php motornak.
- 3. A php motor feldolgozást követően visszaküldni a választ a konténer apache rendszernek, majd az továbbitja a fő kiszolgáló felé. A PHP motor kapcsolatban áll egy rendis szerverrel, illetve egy mariadb adatbázis kezelővel
Első lépésben hozzuk létre a munkakönyvtárunkat és lépjünk bele:
mkdir -p ~/apache && cd ~/apache
Ahhoz, hogy az image-ből készült konténerben lévő apache-t az indításkor megfelelően tudjuk konfigurálni szükségünk van egy script-re, mely induláskor lefut és elvégzi a beállításokat. Nyissuk meg az állományt:
nano apachestart.sh
Ennek tartalma a következő:
#!/bin/sh : "${SERVERNAME:?SERVERNAME needs to be set}" : "${SERVERADMIN:?SERVERADMIN needs to be set}" : "${HTTPPORT:?HTTPPORT needs to be set}" : "${DOCROOT:?DOCROOT needs to be set}" if [ ! -d $DOCROOT ]; then echo "The DOCROOT=$DOCROOT doesn't exists!" exit 1 fi mkdir -p /run/apache2 cat <<EOF >/etc/apache2/conf.d/01main.conf Listen $HTTPPORT ServerAdmin $SERVERADMIN ServerName $SERVERNAME:$HTTPPORT DocumentRoot "$DOCROOT" <Directory "$DOCROOT"> Options Indexes FollowSymlinks AllowOverride All Require all granted </Directory> EOF if [ x$FCGI != "x" ]; then cat <<EOF> /etc/apache2/conf.d/fcgi.conf LoadModule proxy_module /usr/lib/apache2/mod_proxy.so LoadModule proxy_fcgi_module /usr/lib/apache2/mod_proxy_fcgi.so <IfModule mod_proxy_fcgi.c> ProxyPassMatch "^/(.*\\.php(/.*)?)$" "fcgi://$FCGI$DOCROOT/\$1" DirectoryIndex /index.php index.php </IfModule> EOF fi exec /usr/sbin/httpd -DFOREGROUND
A konténert öt környezeti változóval tudjuk indítani, ezek sorrendben a következőek:
- SERVERNAME: weboldal domain neve
- SERVERADMIN: A weboldal üzemeltetőjének email címe
- DOCROOT: A weboldal adatainak elérési útja
- HTTPPORT: A port, melyen a konténerben futó apache figyel
- FCGI: :
A script úgy lett megírva, hogy amennyiben az FCGI környezeti változó nem kerül megadásra, az erre vonatkozó beállítások nem futnak le.
Dockerfile
Készítsük el a dockerfile-t az alábbi tartalommal:
FROM alpine MAINTAINER Albert Ványi <albert@vanyi.eu> RUN apk update && apk add apache2 apache2-utils apache2-proxy \ && rm -f /etc/apache2/conf.d/info.conf \ && rm -r /etc/apache2/conf.d/userdir.conf \ && rm -r /etc/apache2/conf.d/proxy.conf COPY apache/ /etc/apache2/ COPY apachestart.sh /usr/local/bin/ WORKDIR /var/www CMD ["/usr/local/bin/apachestart.sh"]
Az apache2-proxy telepítése automatikusan létrehozza a proxy.conf állományt. Erre nincs szükségünk, ezért eltávolítjuk. Ha az FCGI környezeti változó értéket kap, legeneráljuk a megfelelő tartalommal az állományt, de alap esetben erre nincs szükség telepítés után.
Konfigurálás
Amint látható az apache könyvtárat fogjuk becsatolni az konténer /etc/apache2 könyvtárába. Ebben lesznek az egyedi konfigurációink. Először hozzuk létre a könyvtár szerkezetet:
mkdir -p apache/conf.d && cd apache
Készítsük el a httpd.conf állományt:
nano httpd.conf
IncludeOptional /etc/apache2/conf.d/*.conf
Az utasításból látszik, hogy minden konfigurációt a conf.d könyvtárba helyezünk el. Most lépjünk a conf.d könyvtárba és készítsük el ezeket is:
cd conf.d && nano 00modules.conf
# Example: # LoadModule foo_module /usr/lib/apache2/mod_foo.so # LoadModule authn_file_module /usr/lib/apache2/mod_authn_file.so #LoadModule authn_dbm_module /usr/lib/apache2/mod_authn_dbm.so #LoadModule authn_anon_module /usr/lib/apache2/mod_authn_anon.so #LoadModule authn_dbd_module /usr/lib/apache2/mod_authn_dbd.so #LoadModule authn_socache_module /usr/lib/apache2/mod_authn_socache.so LoadModule authn_core_module /usr/lib/apache2/mod_authn_core.so LoadModule authz_host_module /usr/lib/apache2/mod_authz_host.so LoadModule authz_groupfile_module /usr/lib/apache2/mod_authz_groupfile.so LoadModule authz_user_module /usr/lib/apache2/mod_authz_user.so #LoadModule authz_dbm_module /usr/lib/apache2/mod_authz_dbm.so #LoadModule authz_owner_module /usr/lib/apache2/mod_authz_owner.so #LoadModule authz_dbd_module /usr/lib/apache2/mod_authz_dbd.so LoadModule authz_core_module /usr/lib/apache2/mod_authz_core.so LoadModule access_compat_module /usr/lib/apache2/mod_access_compat.so LoadModule auth_basic_module /usr/lib/apache2/mod_auth_basic.so #LoadModule auth_form_module /usr/lib/apache2/mod_auth_form.so #LoadModule auth_digest_module /usr/lib/apache2/mod_auth_digest.so #LoadModule allowmethods_module /usr/lib/apache2/mod_allowmethods.so #LoadModule file_cache_module /usr/lib/apache2/mod_file_cache.so #LoadModule cache_module /usr/lib/apache2/mod_cache.so #LoadModule cache_disk_module /usr/lib/apache2/mod_cache_disk.so #LoadModule cache_socache_module /usr/lib/apache2/mod_cache_socache.so #LoadModule socache_shmcb_module /usr/lib/apache2/mod_socache_shmcb.so #LoadModule socache_dbm_module /usr/lib/apache2/mod_socache_dbm.so #LoadModule socache_memcache_module /usr/lib/apache2/mod_socache_memcache.so #LoadModule socache_redis_module /usr/lib/apache2/mod_socache_redis.so #LoadModule watchdog_module /usr/lib/apache2/mod_watchdog.so #LoadModule macro_module /usr/lib/apache2/mod_macro.so #LoadModule dbd_module /usr/lib/apache2/mod_dbd.so #LoadModule dumpio_module /usr/lib/apache2/mod_dumpio.so #LoadModule echo_module /usr/lib/apache2/mod_echo.so #LoadModule buffer_module /usr/lib/apache2/mod_buffer.so #LoadModule data_module /usr/lib/apache2/mod_data.so LoadModule ratelimit_module /usr/lib/apache2/mod_ratelimit.so LoadModule reqtimeout_module /usr/lib/apache2/mod_reqtimeout.so #LoadModule ext_filter_module /usr/lib/apache2/mod_ext_filter.so #LoadModule request_module /usr/lib/apache2/mod_request.so #LoadModule include_module /usr/lib/apache2/mod_include.so LoadModule filter_module /usr/lib/apache2/mod_filter.so #LoadModule reflector_module /usr/lib/apache2/mod_reflector.so #LoadModule substitute_module /usr/lib/apache2/mod_substitute.so #LoadModule sed_module /usr/lib/apache2/mod_sed.so #LoadModule charset_lite_module /usr/lib/apache2/mod_charset_lite.so #LoadModule deflate_module /usr/lib/apache2/mod_deflate.so LoadModule mime_module /usr/lib/apache2/mod_mime.so LoadModule log_config_module /usr/lib/apache2/mod_log_config.so #LoadModule log_debug_module /usr/lib/apache2/mod_log_debug.so #LoadModule log_forensic_module /usr/lib/apache2/mod_log_forensic.so LoadModule logio_module /usr/lib/apache2/mod_logio.so LoadModule env_module /usr/lib/apache2/mod_env.so #LoadModule mime_magic_module /usr/lib/apache2/mod_mime_magic.so #LoadModule expires_module /usr/lib/apache2/mod_expires.so LoadModule headers_module /usr/lib/apache2/mod_headers.so #LoadModule usertrack_module /usr/lib/apache2/mod_usertrack.so #LoadModule unique_id_module /usr/lib/apache2/mod_unique_id.so LoadModule setenvif_module /usr/lib/apache2/mod_setenvif.so LoadModule version_module /usr/lib/apache2/mod_version.so #LoadModule remoteip_module /usr/lib/apache2/mod_remoteip.so #LoadModule session_module /usr/lib/apache2/mod_session.so #LoadModule session_cookie_module /usr/lib/apache2/mod_session_cookie.so #LoadModule session_crypto_module /usr/lib/apache2/mod_session_crypto.so #LoadModule session_dbd_module /usr/lib/apache2/mod_session_dbd.so #LoadModule slotmem_shm_module /usr/lib/apache2/mod_slotmem_shm.so #LoadModule slotmem_plain_module /usr/lib/apache2/mod_slotmem_plain.so #LoadModule dialup_module /usr/lib/apache2/mod_dialup.so #LoadModule http2_module /usr/lib/apache2/mod_http2.so LoadModule unixd_module /usr/lib/apache2/mod_unixd.so #LoadModule heartbeat_module /usr/lib/apache2/mod_heartbeat.so #LoadModule heartmonitor_module /usr/lib/apache2/mod_heartmonitor.so #LoadModule status_module /usr/lib/apache2/mod_status.so #LoadModule autoindex_module /usr/lib/apache2/mod_autoindex.so #LoadModule asis_module /usr/lib/apache2/mod_asis.so #LoadModule info_module /usr/lib/apache2/mod_info.so #LoadModule suexec_module /usr/lib/apache2/mod_suexec.so <IfModule !mpm_prefork_module> #LoadModule cgid_module /usr/lib/apache2/mod_cgid.so </IfModule> <IfModule mpm_prefork_module> #LoadModule cgi_module /usr/lib/apache2/mod_cgi.so </IfModule> #LoadModule vhost_alias_module /usr/lib/apache2/mod_vhost_alias.so #LoadModule negotiation_module /usr/lib/apache2/mod_negotiation.so LoadModule dir_module /usr/lib/apache2/mod_dir.so #LoadModule actions_module /usr/lib/apache2/mod_actions.so #LoadModule speling_module /usr/lib/apache2/mod_speling.so #LoadModule userdir_module /usr/lib/apache2/mod_userdir.so LoadModule alias_module /usr/lib/apache2/mod_alias.so LoadModule rewrite_module /usr/lib/apache2/mod_rewrite.so LoadModule negotiation_module /usr/lib/apache2/mod_negotiation.so
nano default.conf
<IfModule unixd_module> User apache Group apache </IfModule> ServerTokens Prod ServerRoot /var/www ServerSignature Off <Directory /> AllowOverride none Require all denied </Directory> <IfModule dir_module> DirectoryIndex index.html index.php </IfModule> <Files ".ht*"> Require all denied </Files> ErrorLog /dev/stderr LogLevel warn <IfModule log_config_module> LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common <IfModule logio_module> LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio CustomLog /dev/stderr combinedio </IfModule> <IfModule !logio_module> CustomLog /dev/stderr combined </IfModule> </IfModule> <IfModule mime_module> TypesConfig /etc/apache2/mime.types AddType application/x-compress .Z AddType application/x-gzip .gz .tgz </IfModule> <IfModule mime_magic_module> MIMEMagicFile /etc/apache2/magic </IfModule> #EnableMMAP off #EnableSendfile on Timeout 60 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 5 UseCanonicalName Off AccessFileName .htaccess HostnameLookups Off <IfModule reqtimeout_module> RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500 </IfModule>
nano mpm.conf
LoadModule mpm_event_module /usr/lib/apache2/mod_mpm_event.so #LoadModule mpm_prefork_module /usr/lib/apache2/mod_mpm_prefork.so #LoadModule mpm_worker_module /usr/lib/apache2/mod_mpm_worker.so <IfModule mpm_event_module> StartServers 3 MinSpareThreads 5 MaxSpareThreads 45 ThreadsPerChild 15 MaxRequestWorkers 25 MaxConnectionsPerChild 0 </IfModule> <IfModule !mpm_netware_module> MaxMemFree 512 </IfModule>
Tesztelés
Hozzuk létre az image-nket és készítsünk- és futtassunk egy konténert:
cd ~apache && \ docker build -t slapic/apache . && \ docker run -it --rm -p 80:80 -e SERVERNAME=test.example.com -e SERVERADMIN=user@example.com -e HTTPPORT=80 -e DOCROOT=/var/www/localhost/htdocs --tmpfs /run:rw,noexec,nosuid,size=65536k slapic/apache
Konklúzió
Előkészítettük a webservert a működésre, a következő bejegyzésben elkészítjük a php-fpm-t biztosító image-t.