ช่วงนี้มีงานที่ต้องทำให้กลับศึกษาเรียนรู้ Laravel อีกครั้ง และกำลังอยู่ในช่วงการที่จะ production release เลยที่อยากจะแบ่งปัน docker compose file เพื่อใช้ในการ deploy Laravel stack ในแบบที่เข้าใจง่าย
โดยผมมีการออกแบบใช้ docker image 3 images
- bkuhl/laravel-fpm-nginx:8 (Dockerfile)
- mariadb
- phpmyadmin/phpmyadmin
docker-compose.yml
version: "3"
services:
api:
restart: always
container_name: api
build:
context: ./
dockerfile: Dockerfile
ports:
- 8000:80
volumes:
- ./:/var/www/html
- /var/www/html/vendor/
- ./default.conf:/etc/nginx/conf.d/default.conf:ro
- ./public/uploads/:/var/www/uploads/
networks:
- app-network
depends_on:
- db
db:
container_name: db
image: mariadb
restart: always
volumes:
- ./data/db:/var/lib/mysql
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD={database_password}
- MYSQL_DATABASE={database_name}
- MYSQL_ROOT_HOST=%
- TZ=Asia/Bangkok
entrypoint:
sh -c "
echo 'CREATE DATABASE IF NOT EXISTS app;' > /docker-entrypoint-initdb.d/init.sql;
/usr/local/bin/docker-entrypoint.sh --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci"
networks:
- app-network
pma:
container_name: pma
image: phpmyadmin/phpmyadmin
ports:
- "8001:80"
links:
- db:db
networks:
- app-network
networks:
app-network:
driver: bridge
Dockerfile
FROM bkuhl/laravel-fpm-nginx:8
# Add default virtualhost
# Still needs work
COPY default.conf /etc/nginx/conf.d/default.conf
COPY upload.ini /usr/local/etc/php/conf.d/upload.ini
WORKDIR /var/www/html
# Copy the application files to the container
ADD --chown=www-data:www-data . /var/www/html
USER www-data
# install dependencies
RUN composer install --no-interaction --optimize-autoloader --prefer-dist --ignore-platform-req=ext-zip\
# keep the container light weight
&& rm -rf /home/www-data/.composer/cache
RUN composer dump-autoload
USER root
default.conf
server {
# limit file size
client_max_body_size 10M;
listen 80; ## listen for ipv4; this line is default and implied
#listen [::]:80 default ipv6only=on; ## listen for ipv6
server_name application;
access_log off;
error_log /dev/stdout;
root /var/www/html/public;
index index.php;
charset utf-8;
# this causes issues with Docker
sendfile off;
location = favicon.ico { log_not_found off; access_log off; }
location = robots.txt { access_log off; log_not_found off; }
# look for local files on the container before sending the request to fpm
location / {
try_files $uri /index.php?$query_string;
}
# nothing local, let fpm handle it
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass localhost:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
# Httpoxy exploit (https://httpoxy.org/) fix
fastcgi_param HTTP_PROXY "";
}
# Deny .htaccess file access
location ~ /\.ht {
deny all;
}
}
โดยไฟล์ทั้งหมดนี้ให้ทำการสร้างไว้ที่ root ของ project และเมื่อพร้อมก็รันคำสั่ง
docker-compose up -d --build
รอจนกว่าจะ start เสร็จ หรือลองตรวจสอบสถานะ ด้วย
docker-compose ps -a
หรือ
docker ps -a
ลองเปิดเว็บเข้าที่ลิ้ง http://localhost:8000/login
เสร็จเรียบร้อย