LAMP- Docker Compose

Tác giả: 21/01/2024

Chào các bạn, ở bài viết này chúng ta sẽ tìm hiểu cách thức hoạt động của LAMP Stack  xây dựng bằng Docker Compose

  • Thiết lập Apache, MariaDB, PHP và phpMyAdmin với Docker Compose
    • Dịch vụ PHP
    • Dịch vụ Apache
    • Dịch vụ MariaDB
    • Dịch vụ phpMyAdmin
  • Bắt đầu và chạy LAMP Stack với Docker Compose

Điều kiện LAB

+ Máy chủ Linux (ở đây mình chọn Ubuntu 22.04)

+ Cài đặt Docker

Cài đặt Docker trên Ubuntu 22.04 – Nhan Hoa Knowledgebase

+ Cài đặt Docker Compose

Cài đặt docker compose trên ubuntu 22.04 – Nhan Hoa Knowledgebase

LAMP- Docker Compose

Chúng ta sẽ bắt đầu quá trình xây dựng, đầu tiên sẽ tạo thư mục LAMP, bên trong nó chứa dữ liệu Dockerfile, dữ liệu PHP

mkdir -p /var/www/LAMP

cd /var/www/

mkdir LAMP/{apache_docker,php_docker,www}
  • Thư mục “apache_docker” chứa tệp (Dockerfile) xây dựng container Apache, cũng như cấu hình bổ sung cho máy chủ Apache (“apache-vhost.conf“), cung cấp sự tích hợp của máy chủ web với PHP và thêm một máy chủ ảo.
  • Thư mục “php_docker” chứa tệp “Dockerfile“, xây dựng container PHP và thêm các mô-đun bổ sung.
  • Cuối cùng, thư mục “www” được thiết kế để lưu trữ các tập lệnh PHP.
cd LAMP

vi docker-compose.yaml

Thêm vào nội dung sau:

version: "3.8"

services:

  # PHP Service

  php:

    build: './php_docker/'

    volumes:

      - ./www/:/var/www/html/

  # Apache Service

  apache:

    build: './apache_docker/'

    depends_on:

      - php

    ports:

      - "80:80"

    volumes:

      - ./www/:/var/www/html/

  # MariaDB Service

  mariadb:

    image: mariadb:10.11

    environment:

      MYSQL_ROOT_PASSWORD: 12345678910OK
      MYSQL_DATABASE: wordpress_db

    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:


Lưu tệp và đóng lại

 

Dịch vụ PHP

Chúng ta sẽ bắt đầu với PHP, service đầu tiên trong tập tin “docker-compose.yaml” của chúng ta. Điểm mấu chốt ở đây là chỉ thị “build“, trỏ đến thư mục “php_docker“, nơi đặt “Dockerfile” mặc định.

Như các bạn thấy, không có đường dẫn nào đến một image Docker ở đây. Điều này là do chúng ta sẽ xây dựng của riêng mình, các hướng dẫn có thể được tìm thấy trong tệp “Dockerfile“.

Bạn có thể hỏi tại sao chúng ta cần xây dựng hình ảnh Docker của riêng mình cho PHP thay vì sử dụng một hình ảnh đã có sẵn trên Docker Hub. Câu trả lời rất đơn giản: image chính thức bao gồm các tiện ích mở rộng PHP được cài đặt sẵn hạn chế. Thật không may, trong hầu hết các trường hợp, chúng không đủ cho các ứng dụng mà chúng ta hướng đến để phát triển.

Do đó, chúng ta sẽ tạo một hình ảnh Docker mới dựa trên hình ảnh PHP 8.2 chính thức, nhưng ngoài ra, chúng ta sẽ biên dịch và bao gồm một số tiện ích mở rộng PHP thường được sử dụng nhất, chẳng hạn như MySQL, GD, ZIP, XML, v.v.

Vì vậy, hãy tạo một tệp có tên “Dockerfile” bên trong thư mục “php_docker” bằng trình soạn thảo văn bản ưa thích của bạn và thêm nội dung sau vào đó:

vi php_docker/Dockerfile
FROM php:8.2-fpm

# Installing dependencies for building the PHP modules

RUN apt update && \

    apt install -y zip libzip-dev libpng-dev libicu-dev libxml2-dev

# Installing additional PHP modules

RUN docker-php-ext-install mysqli pdo pdo_mysql gd zip intl xml

# Cleaning APT cache

RUN apt clean

Lưu và đóng tệp. Tất nhiên, như bạn đoán, nếu bạn cần nhiều tiện ích mở rộng PHP hơn, bạn có thể đưa chúng vào tệp.

Lệnh “volumes” từ phần dịch vụ “php” trong “docker-compose.yaml” chỉ định vị trí các tệp PHP của ứng dụng. Như bạn đã biết, các container Docker là tạm thời và mọi dữ liệu dự kiến sẽ bị mất khi container bị xóa. May mắn thay, các ổ đĩa Docker cung cấp một cơ chế để duy trì dữ liệu được tạo bên trong một container.

Vì vậy, thư mục “www” cục bộ của chúng ta trỏ đến “/var/www/html” bên trong vùng chứa PHP, nơi PHP sẽ tìm kiếm các tập lệnh PHP thực thi. Nói cách khác, chúng ta ánh xạ một thư mục trên hệ thống tập tin máy chủ (bên ngoài ngữ cảnh container) đến bên trong container đang chạy.

Tiếp theo, hãy tạo một tệp “index.php” vào đó, tệp này sẽ chỉ được sử dụng để thử nghiệm.

vi www/index.php

Thêm dòng duy nhất được hiển thị bên dưới, sau đó lưu và thoát tệp.

<?php 
phpinfo();
?>

Lệnh “depends_on” hướng dẫn bộ chứa PHP của chúng ta đợi cho đến khi dịch vụ MariaDB được khởi động. Chúng ta làm điều này bởi vì chúng ta mong đợi PHP cố gắng kết nối với cơ sở dữ liệu; Vì vậy, trước tiên nó phải hoạt động.

Dịch vụ Apache

Mọi thứ cũng tương tự ở đây. Chúng ta sử dụng hình ảnh Docker gần đây nhất và hiển thị cổng 80 của container đến cổng 80 của hệ thống Linux cục bộ của chúng ta.

Trước tiên, hãy tạo tệp “apache-vhost.conf” của chúng ta, đặt thư mục gốc chứa các tệp PHP cho ứng dụng của chúng ta là vùng chứa “/var/www/html”, như chúng ta đã biết, chúng ta đã ánh xạ đến tệp cục bộ của chúng ta “www”.

Ngoài ra, chúng ta tải các mô-đun chúng tôi cần trong Apache để máy chủ web có thể ủy quyền các yêu cầu, trong trường hợp này, vào vùng chứa PHP.

Vì vậy, bên trong thư mục “apache_docker”, hãy tạo một tệp có tên “apache-vhost.conf” và dán nội dung sau vào đó:

vi apache_docker/apache-vhost.conf

Thêm vào

ServerName localhost

LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so

LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so

LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so

<VirtualHost *:80>

    # Proxy .php requests to port 9000 of the PHP container

    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1

    DocumentRoot /var/www/html/

    <Directory /var/www/html/>

        DirectoryIndex index.php

        Options Indexes FollowSymLinks

        AllowOverride All

        Require all granted

    </Directory>

    # Send Apache logs to stdout and stderr

    CustomLog /proc/self/fd/1 common

    ErrorLog /proc/self/fd/2

</VirtualHost>

Lưu và thoát tệp.

Bây giờ, một lần nữa bên trong thư mục “apache_docker“, hãy tạo tệp “Docker” sẽ xây dựng hình ảnh Apache của chúng ta và copy vào đó tệp “apache-vhost.conf“.

vi apache_docker/Dockerfile

Thêm vào

FROM httpd:2.4-alpine

RUN apk update; apk upgrade;

# Copy Apache virtual host file to proxy .php requests to PHP container

COPY apache-vhost.conf /usr/local/apache2/conf/apache-vhost.conf

RUN echo "Include /usr/local/apache2/conf/apache-vhost.conf" \

>> /usr/local/apache2/conf/httpd.conf

Một lần nữa, lưu và thoát khỏi tệp.

Dịch vụ MariaDB

Cấu hình Docker Compose của MariaDB server của chúng ta rất đơn giản. Tất cả những gì cần làm là thay thế chỉ thị “MYSQL_ROOT_PASSWORD“, “12345678910OK”, bằng chỉ thị bạn chọn. Như tên của nó, đây là mật khẩu cho tài khoản root MariaDB.

Lệnh “volumes” đảm bảo rằng chúng ta sẽ không mất dữ liệu trong cơ sở dữ liệu của mình trong quá trình khởi động lại container. Đó là tất cả những gì chúng ta cần cho container MariaDB của chúng ta.

Dịch vụ phpMyAdmin

Container cuối cùng trong quá trình deploy Docker Compose của chúng ta là phpMyAdmin. Vì nó không bắt buộc để ngăn xếp LAMP hoạt động, nó đơn giản hóa đáng kể việc quản trị MariaDB, đó là lý do tại sao chúng tôi đưa nó vào triển khai của mình.

Chúng ta chỉ định phpMyAdmin có thể truy cập được trên cổng 8080 vì chúng ta đã tiếp xúc với cổng 80 với container Apache trên hệ thống Linux cục bộ của chúng ta.

Lệnh “PMA_HOST: mariadb” cho bộ chứa phpMyAdmin biết cơ sở dữ liệu nào sẽ kết nối đến, trong trường hợp này là vùng chứa MariaDB của chúng tôi.

Bắt đầu và chạy LAMP Stack với Docker Compose

Cuối cùng, chúng ta có thể chạy Apache, MariaDB, PHP và phpMyAdmin bằng Docker Compose. Để thực hiện việc này, hãy thực hiện lệnh dưới đây từ thư mục “LAMP” nơi chứa tệp “docker-compose.yaml“.

Khởi động và chạy các container trong nền:

docker-compose up -d

Các hình ảnh sẽ bắt đầu tải xuống và các hình ảnh PHP và Apache Docker sẽ được xây dựng trong quá trình này.

Toàn bộ quy trình sẽ mất vài phút, tùy thuộc vào tốc độ kết nối internet của bạn. Cuối cùng, bạn sẽ thấy một màn hình tương tự như màn hình bên dưới, thông báo cho bạn rằng tất cả các container đã được khởi động thành công.

Hoàn tất cài đặt

Nếu bạn yêu thích Nginx làm proxy thì quá tuyệt vời,chúng ta cần phải thay đổi port public của container apache

Sau đó chúng ta có thể đưa source code vào /var/www/LAMP/www để sử dụng.

Hẹn gặp lại các bạn tại các bài viết sau tại wiki.nhanhoa.com