Docker-Compose for Laravel8,  MySQL, phpMyAdmin

Sharing is caring!

ช่วงนี้มีงานที่ต้องทำให้กลับศึกษาเรียนรู้ 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

เสร็จเรียบร้อย

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *