WordPress + docker + redis + memcached?

Efter att ha börjat mixtra med Docker och Portainer så börjar jag ana så smått fördelarna med Dockerformatet. Snabbt och enkelt så länge man håller sig till färdiga images, saknar man vissa funktioner i docker-avbildningen är det en viss utmaning att lägga till dessa i efterhand. Detta är anledningen till att den här guiden blev till. För att ha läst och gått igenom åtskilliga varianter på hur man går tillväga för att lägga till exempels php-redis eller php-memcached. Med det sagt så får du ta guiden som ett exempel som ger en fungerade uppsättning med WordPress, Redis, Memcached, och Apache (databasen är extern). Har du förslag på förändringar eller andra tillägg så får du gärna lämna en kommentar med förslag, likaså om du vet om ett ännu enklare sätt.

Men i alla fall, i mina egna försök med Docker så har jag använt Nginx proxy manager som proxy mot internet. Den ansvarar för alla webbsidor samt terminerar anslutningar med SSL-certificat från Let’s-Encrypt. Guide för installation hittar du här på Uluntu.

Guiden förutsätter följande:

  1. Linux (guiden är testad på Ubuntu 20.04 och Ubuntu 18.04).
  2. Docker och docker-compose med en fungerande installation.
  3. jq är installerat (sudo apt update && sudo apt install jq)
  4. Konfigurerad MySql-server eller MariaDB som nås via ip.

Då börjar vi:

1: Logga in på din server via SSH eller öppna terminalfönstret
2: Skriv: cd ~ (om du är osäker på om du är i din hemkatalog eller inte)
3: Skriv: mkdir docker-project (skapar en katalog för dina kommande Docker-projekt
4: Skriv cd docker-project (för att komma in i projektkatalogen)
4: Skriv: git clone https://github.com/docker-library/wordpress (för att göra en kopia av filer som behövs från WordPress Dockerbibliotek)
5: Skriv: cd wordpress
6: Skriv: cp dockerfile.template dockerfile.template.bak (vi kommer byta ut denna fil)
7: Skriv: nano dockerfile.template (du kan också använda vi eller vim eller någon annan texteditor), det är denna fil som kommer att ange hur du vill att din Docker-image ska bli
7: Klistra in följande kod och spara filen:

{{
	def is_alpine:
		env.variant | index("alpine")
-}}
FROM php:{{ env.phpVersion }}-{{ env.variant }}

{{ if env.version != "cli" then ( -}}
# persistent dependencies
{{ if is_alpine then ( -}}
RUN set -eux; \
	apk add --no-cache \
# in theory, docker-entrypoint.sh is POSIX-compliant, but priority is a working, consistent image
		bash \
# Ghostscript is required for rendering PDF previews
		ghostscript \
# tillägg för memcached           
        libmemcached-dev \
# Alpine package for "imagemagick" contains ~120 .so files, see: https://github.com/docker-library/wordpress/pull/497
		imagemagick \
	;
{{ ) else ( -}}
RUN set -eux; \
	apt-get update; \
	apt-get install -y --no-install-recommends \
# Ghostscript is required for rendering PDF previews
		ghostscript \
# tillägg för memcached        
        libmemcached-dev \
	; \
	rm -rf /var/lib/apt/lists/*
{{ ) end -}}
{{ ) else ( -}}
# install wp-cli dependencies
RUN apk add --no-cache \
# bash is needed for 'wp shell': https://github.com/wp-cli/shell-command/blob/b8dafcc2a2eba5732fdee70be077675a302848e9/src/WP_CLI/REPL.php#L104
		bash \
		less \
		mysql-client

RUN set -ex; \
	mkdir -p /var/www/html; \
	chown -R www-data:www-data /var/www/html
WORKDIR /var/www/html
{{ ) end -}}

# install the PHP extensions we need (https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions)
RUN set -ex; \
	\
{{ if is_alpine then ( -}}
	apk add --no-cache --virtual .build-deps \
		$PHPIZE_DEPS \
		freetype-dev \
		imagemagick-dev \
		libjpeg-turbo-dev \
		libpng-dev \
		libzip-dev \
	; \
# Installation av Redis och Memcached
# https://pecl.php.net/package/redis
	pecl install redis; \
	docker-php-ext-enable redis; \
	rm -r /tmp/pear; \
	\
 # https://pecl.php.net/package/memcached
	pecl install memcached; \
	docker-php-ext-enable memcached; \
	rm -r /tmp/pear; \
	\     
{{ ) else ( -}}
	savedAptMark="$(apt-mark showmanual)"; \
	\
	apt-get update; \
	apt-get install -y --no-install-recommends \
		libfreetype6-dev \
		libjpeg-dev \
		libmagickwand-dev \
		libpng-dev \
		libzip-dev \
	; \
# Installation av Redis och Memcached
# https://pecl.php.net/package/redis
	pecl install redis; \
	docker-php-ext-enable redis; \
	rm -r /tmp/pear; \
	\
 # https://pecl.php.net/package/memcached
	pecl install memcached; \
	docker-php-ext-enable memcached; \
	rm -r /tmp/pear; \
	\     
{{ ) end -}}
	\
	docker-php-ext-configure gd \
{{ if env.phpVersion == "7.3" then ( -}}
		--with-freetype-dir=/usr \
		--with-jpeg-dir=/usr \
		--with-png-dir=/usr \
{{ ) else ( -}}
		--with-freetype \
		--with-jpeg \
{{ ) end -}}
	; \
	docker-php-ext-install -j "$(nproc)" \
		bcmath \
		exif \
		gd \
		mysqli \
		zip \
	; \
{{ if is_alpine then ( -}}
# WARNING: imagick is likely not supported on Alpine: https://github.com/Imagick/imagick/issues/328
{{ ) else "" end -}}
# https://pecl.php.net/package/imagick
	pecl install imagick-3.5.0; \
	docker-php-ext-enable imagick; \
	rm -r /tmp/pear; \
	\
{{ if is_alpine then ( -}}
	runDeps="$( \
		scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \
			| tr ',' '\n' \
			| sort -u \
			| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
	)"; \
	apk add --no-network --virtual .wordpress-phpexts-rundeps $runDeps; \
	apk del --no-network .build-deps
{{ ) else ( -}}
# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
	apt-mark auto '.*' > /dev/null; \
	apt-mark manual $savedAptMark; \
	ldd "$(php -r 'echo ini_get("extension_dir");')"/*.so \
		| awk '/=>/ { print $3 }' \
		| sort -u \
		| xargs -r dpkg-query -S \
		| cut -d: -f1 \
		| sort -u \
		| xargs -rt apt-mark manual; \
	\
	apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
	rm -rf /var/lib/apt/lists/*
{{ ) end -}}

# set recommended PHP.ini settings
{{ if env.version != "cli" then ( -}}
# see https://secure.php.net/manual/en/opcache.installation.php
RUN set -eux; \
	docker-php-ext-enable opcache; \
	{ \
		echo 'opcache.memory_consumption=128'; \
		echo 'opcache.interned_strings_buffer=8'; \
		echo 'opcache.max_accelerated_files=4000'; \
		echo 'opcache.revalidate_freq=2'; \
		echo 'opcache.fast_shutdown=1'; \
	} > /usr/local/etc/php/conf.d/opcache-recommended.ini
{{ ) else ( -}}
# excluding opcache due https://github.com/docker-library/wordpress/issues/407
{{ ) end -}}
# https://wordpress.org/support/article/editing-wp-config-php/#configure-error-logging
RUN { \
# https://www.php.net/manual/en/errorfunc.constants.php
# https://github.com/docker-library/wordpress/issues/420#issuecomment-517839670
		echo 'error_reporting = E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_RECOVERABLE_ERROR'; \
		echo 'display_errors = Off'; \
		echo 'display_startup_errors = Off'; \
		echo 'log_errors = On'; \
		echo 'error_log = /dev/stderr'; \
		echo 'log_errors_max_len = 1024'; \
		echo 'ignore_repeated_errors = On'; \
		echo 'ignore_repeated_source = Off'; \
		echo 'html_errors = Off'; \
	} > /usr/local/etc/php/conf.d/error-logging.ini
{{ if env.variant == "apache" then ( -}}

RUN set -eux; \
	a2enmod rewrite expires; \
	\
# https://httpd.apache.org/docs/2.4/mod/mod_remoteip.html
	a2enmod remoteip; \
	{ \
		echo 'RemoteIPHeader X-Forwarded-For'; \
# these IP ranges are reserved for "private" use and should thus *usually* be safe inside Docker
		echo 'RemoteIPTrustedProxy 10.0.0.0/8'; \
		echo 'RemoteIPTrustedProxy 172.16.0.0/12'; \
		echo 'RemoteIPTrustedProxy 192.168.0.0/16'; \
		echo 'RemoteIPTrustedProxy 169.254.0.0/16'; \
		echo 'RemoteIPTrustedProxy 127.0.0.0/8'; \
	} > /etc/apache2/conf-available/remoteip.conf; \
	a2enconf remoteip; \
# https://github.com/docker-library/wordpress/issues/383#issuecomment-507886512
# (replace all instances of "%h" with "%a" in LogFormat)
	find /etc/apache2 -type f -name '*.conf' -exec sed -ri 's/([[:space:]]*LogFormat[[:space:]]+"[^"]*)%h([^"]*")/\1%a\2/g' '{}' +
{{ ) else "" end -}}

{{ if env.version != "cli" then ( -}}
RUN set -eux; \
	version={{ .upstream | @sh }}; \
	sha1={{ .sha1 | @sh }}; \
	\
	curl -o wordpress.tar.gz -fL "https://wordpress.org/wordpress-$version.tar.gz"; \
	echo "$sha1 *wordpress.tar.gz" | sha1sum -c -; \
	\
# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
	tar -xzf wordpress.tar.gz -C /usr/src/; \
	rm wordpress.tar.gz; \
	\
# https://wordpress.org/support/article/htaccess/
	[ ! -e /usr/src/wordpress/.htaccess ]; \
	{ \
		echo '# BEGIN WordPress'; \
		echo ''; \
		echo 'RewriteEngine On'; \
		echo 'RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]'; \
		echo 'RewriteBase /'; \
		echo 'RewriteRule ^index\.php$ - [L]'; \
		echo 'RewriteCond %{REQUEST_FILENAME} !-f'; \
		echo 'RewriteCond %{REQUEST_FILENAME} !-d'; \
		echo 'RewriteRule . /index.php [L]'; \
		echo ''; \
		echo '# END WordPress'; \
	} > /usr/src/wordpress/.htaccess; \
	\
	chown -R www-data:www-data /usr/src/wordpress; \
# pre-create wp-content (and single-level children) for folks who want to bind-mount themes, etc so permissions are pre-created properly instead of root:root
# wp-content/cache: https://github.com/docker-library/wordpress/issues/534#issuecomment-705733507
	mkdir wp-content; \
	for dir in /usr/src/wordpress/wp-content/*/ cache; do \
		dir="$(basename "${dir%/}")"; \
		mkdir "wp-content/$dir"; \
	done; \
	chown -R www-data:www-data wp-content; \
	chmod -R 777 wp-content
{{ ) else ( -}}
# https://make.wordpress.org/cli/2018/05/31/gpg-signature-change/
# pub   rsa2048 2018-05-31 [SC]
#       63AF 7AA1 5067 C056 16FD  DD88 A3A2 E8F2 26F0 BC06
# uid           [ unknown] WP-CLI Releases <releases@wp-cli.org>
# sub   rsa2048 2018-05-31 [E]
ENV WORDPRESS_CLI_GPG_KEY 63AF7AA15067C05616FDDD88A3A2E8F226F0BC06

ENV WORDPRESS_CLI_VERSION {{ .version }}
ENV WORDPRESS_CLI_SHA512 {{ .sha512 }}

RUN set -ex; \
	\
	apk add --no-cache --virtual .fetch-deps \
		gnupg \
	; \
	\
	curl -o /usr/local/bin/wp.gpg -fL "https://github.com/wp-cli/wp-cli/releases/download/v${WORDPRESS_CLI_VERSION}/wp-cli-${WORDPRESS_CLI_VERSION}.phar.gpg"; \
	\
	GNUPGHOME="$(mktemp -d)"; export GNUPGHOME; \
	gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$WORDPRESS_CLI_GPG_KEY"; \
	gpg --batch --decrypt --output /usr/local/bin/wp /usr/local/bin/wp.gpg; \
	gpgconf --kill all; \
	rm -rf "$GNUPGHOME" /usr/local/bin/wp.gpg; unset GNUPGHOME; \
	\
	echo "$WORDPRESS_CLI_SHA512 */usr/local/bin/wp" | sha512sum -c -; \
	chmod +x /usr/local/bin/wp; \
	\
	apk del --no-network .fetch-deps; \
	\
	wp --allow-root --version
{{ ) end -}}

VOLUME /var/www/html

{{ if env.version != "cli" then ( -}}
COPY --chown=www-data:www-data wp-config-docker.php /usr/src/wordpress/
{{ ) else "" end -}}
COPY docker-entrypoint.sh /usr/local/bin/

ENTRYPOINT ["docker-entrypoint.sh"]
{{ if env.version != "cli" then ( -}}
CMD {{ [ if env.variant == "apache" then "apache2-foreground" else "php-fpm" end ] | @json }}
{{ ) else ( -}}
USER www-data
CMD ["wp", "shell"]
{{ ) end -}}

8: Skriv: ./update.sh (detta kommer att lägga till våra php-moduler i alla varianter på wordpress)
9: Skriv: docker build -t <vad du nu vill kalla din version>/wordpress:<ditt versionsnr> latest/php8.0/apache (det bygger vår egna image med Apache)

Förhoppnings bör du nu se något i den här stilen flimra förbi på skärmen.

När du ser följande beroende på vad du kallar din version för:
Successfully built f40f1625b1d5
Successfully tagged uluntu/wordpress:v1.1


Då är imagen klar och det är dags för nästa steg!

10: Logga in i portainer (på den adress du har det installerat)
11: Klicka på Stacks
12: Add stacks
13: Ange namnet på vad instansen kommer heta.
14: Välj ”Web editor” och klistra in nedanstående (skriv in de uppgifter som gäller för dig):

version: '3.1'

services:

  wordpress:
    image: <vad du valt>/wordpress:<vad du valt>
    restart: always
    ports:
      - 8082:80
    environment:
      WORDPRESS_DB_HOST: 123.45.67.8:3306
      WORDPRESS_DB_USER: användare
      WORDPRESS_DB_PASSWORD: lösenord
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - <valfri mapp i systemet>/wordpress:/var/www/html

  redis:
    image: redis:latest
    command: redis-server 
  
  memcached:
    image: bitnami/memcached:latest
    restart: always
    ports:
      - 11211:11211
    environment:
      - MEMCACHED_CACHE_SIZE=128

volumes:
  wordpress:

15: Klicka på ”deploy the stack”
16: Öppna din webbläsare och gå in på antingen http://localhost:8082 eller http://din servers ip-nummer:8082 och slutför installationen.
17: Då var det färdigt klart!

Kommentera

Denna webbplats använder Akismet för att minska skräppost. Lär dig hur din kommentardata bearbetas.

%d bloggare gillar detta: