- หัดทำ wordpress ใน docker container
- โดยไม่ใช้ image ของ wordpress
- แต่ใช้ php7.4+apache และ mysql image ใช้ 2 container
- คือจะเอา wordpress site ซึ่ง อยู่ใน physical server พาธจริง LAMP (PHP7.4) Ubuntu ย้ายเข้าไปใน container
- โดยจะใช้ apache reverse proxy https domain จริง เข้ามาใน localhost:port ที่กำหนดใน container
- เพื่อลดความเสื่ยงและจำกัดความเสียหายให้น้อยที่สุด ต่อภาพรวม เมื่อโดนเล่นงาน
Env
- Ubuntu 18.04
- Host จริง enable mod_rewrite
Step
- ติดตั้ง docker ให้เรียบร้อย
- คอนฟิก apache host https จริง ให้ /etc/apache2/sites-available/www.site.com-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin admin@site.com
ServerName www.site.com
...
ProxyPreserveHost on
ProxyPass / http://localhost:8080/
ProxyReverse / http://localhost:8080/
RequestHeader set X-Forwarded-Proto "https"
Include /etc/.../ssl-apache.conf
SSLCertificateFile...
SSLCertificateKeyFile...
...
</VirtualHost>
</IfModule>
- คอนฟิก apache host http จริง ให้ /etc/apache2/sites-available/www.site.com.conf
<VirtualHost *:80>
ServerAdmin admin@site.com
ServerName www.site.com
...
ProxyPreserveHost on
ProxyPass / http://localhost:8080/
ProxyReverse / http://localhost:8080/
RequestHeader set X-Forwarded-Proto "https"
</VirtualHost>
- จากนั้น enable site ทั้ง 2
$ sudo a2ensite www.site.com.conf
$ sudo a2ensite www.site.com.le-ssl.conf
$ systemctl restart apache2
- ที่นี้มาสร้าง container กัน
$ mkdir -p /home/myuser/public_html/mysql_data
$ mkdir -p /home/myuser/public_htmlapp
$ cd app
- ให้เราเอา wordpress site folder มาวางใน app ได้เลย
$ cp -rf th /home/myuser/public_html/app/th
$ cd /home/myuser/public_html
$ nano php.ini
; Set the maximum upload file size
upload_max_filesize = 64M
; Set the maximum POST size
post_max_size = 64M
memory_limit = 512M
$ nano Dockerfile
# load image php:<version>-apache
FROM php:7.4-apache
# Install PHP extensions
RUN docker-php-ext-install pdo pdo_mysql mysqli
# Use the official PHP-Apache image from Docker Hub
#FROM php:8.1-apache
# Install dependencies if needed
#RUN apt-get update && apt-get install -y \
# libpng-dev \
# libjpeg-dev \
# libfreetype6-dev \
# && docker-php-ext-configure gd --with-freetype --with-jpeg \
# && docker-php-ext-install gd
- สร้างไฟล์ docker-compose.yml
$ cd /home/myuser/public_html
$ nano docker-compose.yml
version: '3.3'
services:
apache:
build: .
# image: webdevops/php-apache:8.2
container_name: apache
ports:
- "8080:80"
command: bash -c "a2enmod rewrite && apache2-foreground"
restart: always
volumes:
- ./app:/var/www/html
- ./php.ini:/usr/local/etc/php/php.ini
# depends_on:
# - mysql
networks:
- lamp-network
mysql:
image: mysql:latest
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress_site
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpresspassword
#ports:
# - "3306:3306"
volumes:
- ./mysql_data:/var/lib/mysql
networks:
- lamp-network
## optional สำหรับเพิ่มตัวจัดการ database
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
container_name: phpmyadmin
environment:
PMA_HOST: db
MYSQL_ROOT_PASSWORD: rootpassword
ports:
- "8081:80"
# depends_on:
# - mysql
networks:
- lamp-network
networks:
lamp-network:
driver: bridge
- จากนั้นสั่ง สร้าง container ด้วยคำสั่ง
$ docker-compose up -d
- สร้างเสร็จตรวจสอบ จะได้ container 2 อัน
$ docker ps
- จากนั้นให้เราใช้นำเข้า file.sql ที่เรา dump ออกมาจากระบบเดิม นำเข้า wordpress_site ใน container ด้วยคำสั่ง
$ docker exec -i <container_id|name> mysql -u<username> -p<password> <database_name> < /path/file.sql
- หรืออีกวิธีคือคัดลอกไฟล์จาก host เข้าไปใน child ก่อนโดย
$ docker cp /path/file.sql <container_id|name>:/tmp/file.sql
$ docker exec -it <container_id|name> bash
container$ cd /tmp
container$ mysql -u <username> -p <database_name> < file.sql
- คอนฟิก wordpress นิดหน่อย wp-config.php (ถ้ายังไม่มีก็ cp จาก sample ได้เลย)
- ตั้งค่า db host เป็น mysql (ชื่อ server db ของ container mysql เรา ซึ่งเราใช้ชื่อ service แบบใหนก็ได้ตามใจชอบโดยไม่ต้องเป็น mysql ก็ได้)
- ตั้งค่า db name, user, pass ตามที่ตั้งค่าเริ่มต้นใน compose file นั่นแหละ
- จากนั้นเพิ่มคอนฟิกแบบนี้ ก่อน คำสั่งสุดท้าย
...
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
...
/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');
- table wp_options column siteurl, home ก็ใช้ค่าเดิม https://www.mysite.com/th ใช้แบบ url ตาม domain หลักก่อน reverse เข้ามาเหมือนเดิม นั่นแหละ
- stop และ remove container โดย
$ docker-compose down
- หรือกรณีเราแก้ไข docker-compose จะให้ใช้ คอนฟิกใหม่ก็สั่ง (ทั่วไปใช้แบบนี้ กรณีแก้ไข docker-compose.yml ใช้ -d ก็พอ เร็วดี)
$ docker-compose up -d
- หรือเพิ่ม --build แต่จะใช้เวลานาน (ในกรณีที่มีการแก้ไข Dockerfile ควรใช้ --build ใหม่)
$ docker-compose up --build
- กรณีเราไม่ใส่ networks ให้ service แต่ละตัวก็ได้ มันจะสร้าง network default interface ให้อัตโนมัติเอง ใช้ depends_on แทนได้เช่นกันเอาไว้ผูก service
- https reverse proxy wordpress ทำไมมันทำเยอะจังกว่าจะรันได้ปกติ เหลือ เรื่อง permission folder upload อีก ปรับให้ถูกต้องด้วย
- สังเกต restart: always เราใส่ไว้เผื่อเราเข้าไป อัพเดทคอนฟิก
- $ docker exec -it apache bash
- container$ a2enmod rewrite && service apache2 restart
- แล้ว ทำให้ container หยุดทำงาน ถ้าเราไม่ใส่ค่านี้ เราต้องสั่ง $ docker start apache เสมอ
- สุดท้ายเรื่อง permission ใน wp-content/uploads เราจะสามารถจัดการ permission ได้จาก parent host หรือ child. ก็ได้ permission มันเปลี่ยนตามได้หมดเลยแฮะ
Related
- https://juuier.blogspot.com/2024/09/reverse-proxy-direct-apache-ubuntu-2204.html
- https://juuier.blogspot.com/2023/05/reverse-proxy-to-multi-endpoint-nginx.html
Ref
- https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04