LEMP Docker Compose

Tác giả: 23/01/2024

Chào các bạn, hôm nay chúng ta sẽ tìm hiểu về LEMP Stack sử dụng Docker Compose nhé.

Các điều kiện để thực hành bài Lab là

+ Hệ điều hành Linux(ở đây mình dùng ubuntu 22.04)

+ Máy chủ đã cài đặt docker

+ Máy chủ đã cài đặt Docker Compose

Không dài dòng nữa, chúng ta sẽ tiến hành tạo file yaml ngay bây giờ

mkdir -p /var/www/lemp

cd /var/www/

mkdir lemp/{nginx-conf,php-files}

vi docker-compose.yml

Thêm vào

version: '3.8'

# Services

services:

    # PHP Service

    php:

        build: './php-files/'

        volumes:

            - './php-files:/var/www/html'

        depends_on:

            - mariadb

    # Nginx Service

    nginx:

        image: nginx:latest

        ports:

            - 80:80

        links:

            - 'php'

        volumes:

            - './php-files:/var/www/html'

            - './nginx-conf:/etc/nginx/conf.d'

        depends_on:

            - php

    # MariaDB Service

    mariadb:

        image: mariadb:10.9

        environment:

            MYSQL_ROOT_PASSWORD: your_password

        volumes:

            - mysqldata:/var/lib/mysql

    # phpMyAdmin Service

    phpmyadmin:

        image: phpmyadmin/phpmyadmin:latest

        ports:

            - 8080:80

        environment:

            PMA_HOST: mariadb

        depends_on:

            - mariadb

# Volumes

volumes:

  mysqldata:

Sau đó chúng ta tạo file Dockerfile luôn nhé:

vi php-files/Dockerfile

Thêm vào

FROM php:8.1-fpm-alpine
WORKDIR /var/www
RUN apk update
RUN apk update && apk add zlib-dev libzip-dev unzip

## Install PHP extensions
RUN docker-php-ext-install bcmath
RUN docker-php-ext-install zip
RUN docker-php-ext-install opcache
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
RUN apk --no-cache add \
    mysql-client \
    libzip-dev \
    && docker-php-ext-install pdo_mysql zip

Thực ra là có nhiều extension, ở đây mình để vài extension cho source code của mình.

Và thêm file default.conf trong .nginx-conf

vi nginx-conf/default.conf

Thêm vào

server {

    listen 80 default_server;

    listen [::]:80 default_server;

    server_name localhost;

    root /var/www/html;

    index index.php index.html;

    location / {

        try_files $uri $uri/ /index.php?$args;

    }

    location ~* \.php$ {

        fastcgi_pass php:9000;

        include fastcgi_params;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_param SCRIPT_NAME $fastcgi_script_name;

    }

}

Cuối cùng là build

docker compose up -d

 

Thử thêm file check php, ở đây dữ liệu mã nguồn nằm trong /var/www/lemp/php-files

<?php
phpinfo();
?>

Quan trọng: Nếu như container có thể đã được cài thêm các phần mềm cần thiết, để dịch vụ chạy lại mà không reset các thiết lập đã cài thêm, chắc hẳn bạn cần đóng gói lại các container thành images và đẩy lên github, ở đây mình đã đẩy các images ngược lên github của mình,nếu như di chuyển dịch vụ sang máy chủ khác thì máy chủ đó cũng có thể connect lại github và pull images đã chỉnh sửa về.

Sau đó chỉnh sửa lại docker-compose.yml

Mình đã xóa sạch images cũng như container đang chạy

 

docker-compose up -d

 

 

Nếu như mình sử dụng bind mount cho mariadb tại /var/www/lemp/ thì khi gặp sự cố hay cần backup dữ liệu, chúng ta chỉ cần nén /var/www/lemp/ và cho sang máy chủ và chạy lại docker compose, sự cố sẽ được khắc phục nhanh chóng hơn nhiều lần so với LEMP stack cổ điển cài dịch vụ trên máy chủ.

Vấn đề xảy ra khi reboot máy chủ, nếu muốn start lại toàn bộ container khi máy chủ reboot, hãy tạo một service tên startmyweb.service trong /etc/systemd/system , khi máy chủ khởi động sẽ gọi đến một script /var/www/lemp/startmyweb.sh có nội dung như sau

cd /var/www/lemp

docker compose up -d

Thêm quyền thực thi cho /var/www/lemp/startmyweb.sh

chmod a+x /var/www/lemp/startmyweb.sh

systemctl enable startmyweb.service

Bài hướng dẫn là làm quen với LEMP stack, hẹn gặp lại các bạn tại các bài viết sau tại wiki.nhanhoa.com