Hôm nay mình chia sẻ với mọi người cách mà chúng ta chạy một ứng dụng web bằng PHP + Docker. Thông thường thì có một số lập trình viên chỉ cài xampp để chạy web php. Nhưng nó có một số khó khăn khi project của ta ở PHP version nó khác nhau. Thì rất là phiên phức, chính vì thế mà ta phải sử dụng Docker để có thể đem project của ta đi khắp mọi nơi, nó cũng sử dụng được
Đầu tiên bạn tạo cho mình một project trong thư mục làm việc của chính bạn. VD: /webphp
Bước 1: vào thư mục project /webphp , tạo cho mình một file index.php đơn giản thôi, ghi gì cũng được
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div class="content"> <h1>Welcome HoaDev - Docker , Phpmyadmin, Nginx, Mysql</h1> <p>https://hoanguyenit.com</p> </div> </body> </html>
Bước 2: Tạo thư mục /webphp/docker-compose , trong thư mục này tiếp tục tạo 2 thư mục (mysql,nginx)
+ /webphp/docker-compose/nginx : tạo file server.conf như code bên dưới đây. Nó giúp setup máy chủ chạy server web php của chúng ta
server { listen 80; index index.php index.html; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root /var/www/html; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location / { try_files $uri $uri/ /index.php?$query_string; gzip_static on; } }
+ /webphp/docker-compose/mysql : bạn phải copy file database của bạn vào thư mục này, để cho ứng dụng nó tự import database giúp bạn
Bước 3 : Tại thư mục /webphp hãy tạo file Dockerfile với nội dụng code bên dưới. Trong file Dockerfile này, nó sẽ cấu hình chỉ rỏ php version mà ta cần chạy, chỉ rỏ thư mục cần làm việc, cài đặt các thư viện của php, bên cạnh đó các bạn có thể cài đặt composer,....có rất là nhiều thứ để cài trong đây, bạn có thể lên mạng tìm hiểu thêm
FROM php:5.6.30-fpm-alpine RUN docker-php-ext-install mysql mysqli pdo pdo_mysql && docker-php-ext-enable mysql && docker-php-ext-enable mysqli COPY . /var/www/html WORKDIR /var/www/html
Bước 4 : Tại thư mục /webphp tạo một file docker-compose.yml , trong file này ta cần cấu hình ứng dụng mà ta cần chạy là cái gì? VD: phpmyadmin , mysql , ngnix
+ phpmyadmin/phpmyadmin:4.9 : ở đây mình dùng phiên bản 4.9 hoặc bạn có thể dùng phiên bản mới nhất phpmyadmin:latest . Ở image phpmyadmin này giúp ta quản lý database của ta có giao diện thân thiện hơn
+ mysql : trong image này để cài đặt mysql , như mình có tạo thư mục /webphp/docker-compose/mysql, và có copy file database vào, tại image mysql này ta có thể import tự động
db: image: mysql:5.6 container_name: sail-db restart: unless-stopped environment: MYSQL_DATABASE: ${DB_DATABASE} MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_USER: ${DB_USERNAME} SERVICE_TAGS: dev SERVICE_NAME: mysql volumes: - ./docker-compose/mysql:/docker-entrypoint-initdb.d networks: - php56
+ nginx : giúp chúng ta cấu hình server chạy web php của chúng ta
FullCode file docker-compose.yml
version: "3.8" services: app: build: context: ./ dockerfile: Dockerfile image: sail container_name: sail-app restart: unless-stopped working_dir: /var/www/html volumes: - ./:/var/www/html networks: - php56 db: image: mysql:5.6 container_name: sail-db restart: unless-stopped environment: MYSQL_DATABASE: ${DB_DATABASE} MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_USER: ${DB_USERNAME} SERVICE_TAGS: dev SERVICE_NAME: mysql volumes: - ./docker-compose/mysql:/docker-entrypoint-initdb.d networks: - php56 phpmyadmin: image: phpmyadmin/phpmyadmin:4.9 ports: - 8080:80 volumes: - ./uploads.ini:/usr/local/etc/php/conf.d/phpmyadmin-misc.ini environment: - PMA_ARBITRARY=1 #- PMA_HOSTS=db:localhost, db:172.23.32.1 depends_on: - db networks: - php56 nginx: image: nginx:alpine container_name: sail-nginx restart: unless-stopped ports: - 8000:80 volumes: - ./:/var/www/html - ./docker-compose/nginx:/etc/nginx/conf.d/ networks: - php56 networks: php56: driver: bridge
Okay vậy là xong, mà các bạn nhớ tạo file .env để đọc các thông tin DB_DATABASE, DB_USERNAME, DB_PASSWORD nghe
DB_HOST=db DB_USERNAME=hoadev92 DB_PASSWORD=12345678 DB_DATABASE=db_hoadev92
Tại thư mục /webphp , bạn hãy tạo file uploads.ini để setup max_size khi chúng ta cần import database một cách thủ công, mà file database của ta có dung lượng quá lớn
post_max_size=200M upload_max_filesize=200M
Bước 5 : Run file docker-compose.yml
# docker-compose up --build or # docker-compose up -d // nếu bạn muốn tắt chạy docker bên trên # docker-compose down -v
Vậy là xong hết rồi, nếu mọi thứ chạy thành công, bạn hãy gõ đường dẫn sau:
+ http://localhost:8000 đây là web chạy php
+ http://localhost:8080 đây là phpmyadmin quản lý database của chúng ta , đăng nhập bằng username, password trong file .env mà ta đã cấu hình, có một trường hợp xấu xảy ra là ta sẽ đăng nhập không được. Thì ta sẽ dùng cách sau
Mở Command line lên và chạy một số câu lệnh sau:
# docker-compose exec db bash # mysql -u root -p
Nó yêu cầu nhập username và password, thì bạn nhập giống trong file .env , nếu đúng nó sẽ trỏ vào bash của mysql
mysql> use mysql; mysql> select user,host from user;
Tiếp tục chạy lệnh sau, để chỉ rỏ username của ta và setup password lại
//câu lệnh dưới này dùng cho phiên bản mysql:5.6 SET PASSWORD FOR 'hoadev92'@'%' = PASSWORD('12345678'); //câu lệnh dưới dùng cho phiên bản mysql:latest mới nhất ALTER USER 'hoadev92'@'%' IDENTIFIED WITH mysql_native_password BY '12345678';
Chú ý : hoadev92->username , 12345678 -> nó là password, nhớ nhập đúng trong file .env mà bạn đã cấu hình
Nếu ok nó sẽ hiện thông báo Query ok , thì lúc này bạn F5 web http://localhost:8080 của phpmyadmin, đăng nhập với username và password lại
Máy chủ: db
Tài khoản: hoadev92
Mật khẩu: 12345678
Chúc các bạn thành công!