อัพเดต OS package และติดตั้ง package พื้นฐานที่ต้องใช้งาน
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
ติดตั้ง docker-ce
เพิ่ม GPG key ของ Docker
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc
เพิ่ม Docker respository และทำการติดตั้ง docker-ce พร้อมเครื่องมือที่เกี่ยวข้อง
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
ตรวจสอบการติดตั้ง docker
sudo docker ps
สร้าง Environment สำหรับ frankenphp project
เราจะทำการรัน frankenphp ผ่าน Docker โดยทำการ bind mount volume ของ project เราเข้ากับ environment ต่างๆ ของ frankenphp
frankenphp เป็น Library ที่เสริมการทำงานของ Caddy http server ดังนั้นเราจะรัน web process เราผ่าน docker-compose
mkdir myproject cd myproject vi compose.yaml
ตัวอย่างเนื้อหาของ compose.yaml
name: myproject services: api: image: myproject ports: - "80:80" environment: - CADDY_GLOBAL_OPTIONS=debug - FRANKENPHP_CONFIG="worker ./public/index.php 120" - ENABLE_TELEMETRY=false volumes: - .:/app/public - ./Caddyfile:/etc/caddy/Caddyfile
Dockerfile
จากใน Compose file จะเห็นว่าเรามีการเรียกชื่อ Docker image ของเราเอง ซึ่งเราจะสร้าง image นี้ขึ้นมาจากการ build Dockerfile ที่มีลักษณะดังนี้
FROM dunglas/frankenphp:alpine
RUN apk --no-cache add \
git
RUN install-php-extensions \
bcmath \
imagick \
mongodb \
opcache \
zip
WORKDIR /app/public
# Install Composer && Assets Plugin
RUN php -r "readfile('https://getcomposer.org/installer');" | php -- --install-dir=/usr/local/bin --filename=composer \
&& rm -rf /var/cache/apk/*
COPY . .
COPY Caddyfile /etc/caddy/Caddyfile
# Project files
RUN git submodule init; git submodule update;
RUN composer update --optimize-autoloader --no-interaction --no-progress
EXPOSE 80
ส่วนของ install-php-extensions นั้นขึ้นอยู่กับว่า project ของเราต้องการ library ตัวใดบ้าง
สั่งให้ docker build image โดยระบุ tag ให้เป็น myproject ดังนี้
sudo docker build . -t myproject
ตัวอย่าง Caddyfile
{
auto_https off
frankenphp
order php_server before file_server
servers {
trusted_proxies static private_ranges
}
}
http:// {
encode zstd br gzip
php_server
log
root * "/app/public/web"
try_files {path} /index.php?{query}&p={path}
}
ในที่นี้เราจะรัน Caddy project หลัง reverse proxy ที่ทำ SSL termination มาให้แล้ว จึงจะปิดฟีเจอร์ด้าน tls จากตัว caddy server ไป และมีการกำหนด php configuration เพื่อให้รัน php source code จาก folder /app/public/web ได้