1.上wordpress docker 找到要的版本
2.把Dockerfile下方下載wordpress tar功能拿掉
# # NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" # # PLEASE DO NOT EDIT IT DIRECTLY. # FROM php:7.4-fpm # persistent dependencies RUN set -eux; \ apt-get update; \ apt-get install -y --no-install-recommends \ # Ghostscript is required for rendering PDF previews ghostscript \ ; \ rm -rf /var/lib/apt/lists/* # install the PHP extensions we need (https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions) RUN set -ex; \ \ savedAptMark="$(apt-mark showmanual)"; \ \ apt-get update; \ apt-get install -y --no-install-recommends \ libfreetype6-dev \ libjpeg-dev \ libmagickwand-dev \ libpng-dev \ libzip-dev \ ; \ \ docker-php-ext-configure gd \ --with-freetype \ --with-jpeg \ ; \ docker-php-ext-install -j "$(nproc)" \ bcmath \ exif \ gd \ mysqli \ zip \ ; \ pecl install imagick-3.4.4; \ docker-php-ext-enable imagick; \ rm -r /tmp/pear; \ \ # 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/* # set recommended PHP.ini settings # 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 # 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 COPY docker-entrypoint.sh /usr/local/bin/ ENTRYPOINT ["docker-entrypoint.sh"] CMD ["php-fpm"]
3.倒數第三行加上執行權限
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
4.最上方把www-data uid 跟gid都變成48
(host的apache user權限)(可用id -u apache)
FROM php:7.4-fpm RUN usermod -u 48 www-data RUN groupmod -g 48 www-data
5.把docker-entrypoint.sh只留執行php-fpm部份
#!/usr/bin/env bash set -Eeuo pipefail if [[ "$1" == apache2* ]] || [ "$1" = 'php-fpm' ]; then uid="$(id -u)" gid="$(id -g)" if [ "$uid" = '0' ]; then case "$1" in apache2*) user="${APACHE_RUN_USER:-www-data}" group="${APACHE_RUN_GROUP:-www-data}" # strip off any '#' symbol ('#1000' is valid sy$ pound='#' user="${user#$pound}" group="${group#$pound}" ;; *) # php-fpm user='www-data' group='www-data' ;; esac else user="$uid" group="$gid" fi fi exec "$@"
全部Dockerfile如下
# # NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" # # PLEASE DO NOT EDIT IT DIRECTLY. # FROM php:7.4-fpm RUN usermod -u 48 www-data RUN groupmod -g 48 www-data # persistent dependencies RUN set -eux; \ apt-get update; \ apt-get install -y --no-install-recommends \ # Ghostscript is required for rendering PDF previews ghostscript \ ; \ rm -rf /var/lib/apt/lists/* # install the PHP extensions we need (https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions) RUN set -ex; \ \ savedAptMark="$(apt-mark showmanual)"; \ \ apt-get update; \ apt-get install -y --no-install-recommends \ libfreetype6-dev \ libjpeg-dev \ libmagickwand-dev \ libpng-dev \ libzip-dev \ ; \ \ docker-php-ext-configure gd \ --with-freetype \ --with-jpeg \ ; \ docker-php-ext-install -j "$(nproc)" \ bcmath \ exif \ gd \ mysqli \ zip \ ; \ pecl install imagick-3.4.4; \ docker-php-ext-enable imagick; \ rm -r /tmp/pear; \ \ # 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/* # set recommended PHP.ini settings # 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 # 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 COPY docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh ENTRYPOINT ["docker-entrypoint.sh"] CMD ["php-fpm"]
6.建立docker-compose.yml
version: "3.5" services: #localhost:5050 phpfpm: container_name: phpfpm7.4 build: ./fpm environment: TZ: Asia/Taipei networks: phpfpm: ipv4_address: 162.17.239.2 ports: - "127.0.0.1:9001:9000" restart: unless-stopped volumes: - /var/www:/var/www logging: options: max-size: 3G networks: phpfpm: driver: bridge ipam: driver: default config: - subnet: 162.17.239.0/24
這裡設定一個docker network 讓php可以連的到host的mariadb database
這是一個test的php source
<?php $server = "162.17.239.1"; # Host MySQL/MariaDB 伺服器 $dbuser = "root"; # 使用者帳號 $dbpassword = "byebye123"; # 使用者密碼 $dbname = "wordpress"; # 資料庫名稱 # 連接 MySQL/MariaDB 資料庫 $connection = new mysqli($server, $dbuser, $dbpassword, $dbname); # 檢查連線是否成功 if ($connection->connect_error) { die("連線失敗:" . $connection->connect_error); } # MySQL/MariaDB 指令 $sqlQuery = "select 1+1 as s from dual"; # 執行 MySQL/MariaDB 指令 if ($connection->query($sqlQuery) === TRUE) { echo "查詢成功"; } else { echo "執行失敗:" . $connection->error; } # 關閉 MySQL/MariaDB 連線 $connection->close(); ?>
ps.可以使用netcat來檢查連線是否有通
sudo docker exec -ti phpfpm7.4 bash apt update apt install -y netcat nc -zvw3 162.17.239.1 3306
ps.記得把mariadb的帳號開啟可以讓“`162.17.239.%“`連入
7.修改wordpress/wp-config.php
DB_HOST為162.17.239.1
8.修改virtualhost設定
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9001/var/www/mywordpress/$1