- vừa được xem lúc

PHP websites sử dụng Docker Containers với PHP, Apache2 và MySQL

0 0 63

Người đăng: Nguyễn Quang Huy

Theo Viblo Asia

Xem lại series về các lệnh cơ bản trong docker: PHẦN 1, PHẦN 2, PHẦN 3

Docker là một nền tảng để cung cấp cách để building, deploying và running ứng dụng dễ dàng hơn bằng cách sử dụng các containers. Trong bài viết này, mình sẽ nói lại việc mình build một website viết bằng PHP thuần của mình sử dụng apache2 và mysql bằng docker compose, mọi nguời cùng theo dõi và nếu thấy hay thì có thể cho mình 1 star trên repo github nha.

Mình có một project selling-computer được viết bằng PHP thuần, chạy trên máy chủ apache2 và sử dụng cơ sở dữ liệu là MySQL. Bây giờ mà một người nào đó muốn chạy project này của mình mà máy họ chưa có sẵn môi trường, cơ sở dữ liệu thì họ sẽ phải làm hàng tá việc trước khi project có thể chạy được. Vậy nên mình quyết định thử sức build toàn bộ project này để chúng chạy trên được docker, bạn có thể xem toàn bộ project tại đây selling-computer-V2, giờ thì việc chạy trở lên đơn giản hơn, bạn chỉ cần clone project về và chạy lệnh docker-compose up, sau đó truy cập vào cổng 8000 và xem kết quả.

Tiếp theo mình sẽ đi chi tiết từng bước mình làm để có được phiên bản selling-computer-V2.

Cấu trúc thư mục

Mình sẽ đi từ phần tổng quan trước sau đó đi tới từng phần cụ thể, về cấu trúc của project sẽ gồm các thư mục và các file như sau:

- php-apache2 - Dockerfile - my-apache2.conf
- sources
- README.md
- docker-compose.yml

Thư mục chứa project

Thư mục sources sẽ là nơi chứa toàn bộ project của mình, đơn giản là mình sẽ copy toàn bộ file trong selling-computer vào trong thư mục sources này.

Cấu hình docker

docker-compose.yml là file cấu hình mà từ đó docker compose sinh ra và quản lý các service.

File docker-compose.yml chứa những cấu hình như sau:

version: '3.8'
services: php-apache-environment: container_name: php-apache build: context: ./php-apache2 dockerfile: Dockerfile depends_on: - db volumes: - ./sources/:/var/www/html/ ports: - 8000:80 db: container_name: db image: mysql restart: always environment: MYSQL_ROOT_PASSWORD: mysql12345 MYSQL_DATABASE: selling_computer MYSQL_USER: trannguyenhan MYSQL_PASSWORD: mysql12345 ports: - "9906:3306" volumes: - ./sources/database/selling_computer.sql:/docker-entrypoint-initdb.d/dump.sql
  • version: là khai báo phiên bản docker sẽ sử dụng
  • service: khai báo lần lượt các service sẽ sử dụng trong project này.

Mysql service

Khai báo mysql service với container mysql sử dụng trực tiếp từ official images của docker, do chúng ta không cần chỉnh sửa gì vì thế không cần phải tạo thư mục riêng để chứa các cấu hình thay đổi như image php-apache.

Với container này chúng ta khai báo một số biến môi trường như MYSQL_ROOT_PASSWORD, MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD và thay đổi trong file sources/config/db_config.php như sau để phù hợp với cấu hình:

<?php define('DB_NAME', 'selling_computer');
define('DB_USER', 'trannguyenhan');
define('DB_PASSWORD', 'mysql12345');
define('DB_HOST', 'db');
define('DB_PORT', "3306");

Phần volumes để ánh xạ file selling_computer.sql vào trong thư mục docker-entrypoint-initdb.d của container mysql, sở dĩ phải làm như vậy là vì tất cả những file đặt trong docker-entrypoint-initdb.d sẽ được thực thi và nhập dữ liệu vào trong cơ sở dữ liệu và mình muốn nhập sẵn cơ sở dữ liệu của mình vào đây.

Ánh xạ port của mysql mặc định là 3306 từ container trong docker ra ngoài máy gốc là 9906, điều này giúp bạn có thể truy cập vào cơ sở dữ liệu của project từ ngoài máy gốc thông qua cổng 9906.

Php-Apache2 service

Nếu sử dụng apache2 trong image mặc định thì project sẽ không chạy được vì một số lý do như apache2 không đọc được file .htaccess vì thế chúng ta cần phải thay đổi một số cấu hình của container php-apache.

Đầu tiên chúng ta sửa lại file /etc/apache2/apach2.conf, thế nên mình copy file apache2.conf của mình thành một file đặt tên là my-apache2.conf và ánh xạ nó vào vị trí của file apache2.conf trong container với lệnh như sau:

COPY my-apache2.conf /etc/apache2/apach2.conf

Sau đó là chạy a2enmod rewrite và cài đặt một số thư viện cần thiết, cuối cùng chúng ta có một file Dockerfile như sau:

FROM php:7.4-apache COPY my-apache2.conf /etc/apache2/apach2.conf
RUN a2enmod rewrite RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
RUN apt-get update && apt-get upgrade -y

Chạy project

Chạy project với lệnh:

docker-compose up

Sau đó truy cập vào cổng 8000 để xem kết quả:

Như vừa mình đã viết ở phần trên, để truy cập vào cơ sở dữ liệu bạn vào thông qua máy gốc tại cổng 9906 với Mysql Workbench như sau:

Bình luận

Bài viết tương tự

- vừa được xem lúc

Docker: Chưa biết gì đến biết dùng (Phần 1- Lịch sử)

1. Vì sao nên sử dụng. . .

0 0 104

- vừa được xem lúc

Docker: Chưa biết gì đến biết dùng (Phần 2 - Dockerfile)

1. Mở đầu.

0 0 67

- vừa được xem lúc

Docker: Chưa biết gì đến biết dùng (Phần 3: Docker-compose)

1. Mở đầu. . .

0 0 121

- vừa được xem lúc

Set up private docker registry

Bài toán: Mình cần 1 repository để lưu trữ Docker Images của mỗi lần build. -> Docker hub chỉ cho duy nhất 1 private repos, còn lại sẽ mất phí hoặc phải để public. tham khảo ở đây ([Docker Hub])(https://www.docker.

0 0 66

- vừa được xem lúc

Spring boot Kotlin Auto Build on Docker Compose Runtime

Trong khi phát triển một ứng dụng Spring boot sử dụng ngôn ngữ Kotlin với docker phải thông qua quá trình build mới có thể start được server cho nên khi phát triển sẽ sửa code liên tục cần nó tự động nhận code mới. Vậy trong bài viết này sẽ giới thiệu qua về giải pháp tận dụng một công cụ entr để lắ

0 0 32

- vừa được xem lúc

Tìm hiểu về Docker Compose CLI

Ở bài trước, chúng ta đã cùng nhau tìm hiểu về Docker Compose và cách config 1 docker compose file. . . Docker Compose là một công cụ giúp định nghĩa và run mutil-docker-container.

0 0 38