LEMP Docker Compose
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