Cài đặt môi trường dự án PHP cơ bản với Docker Windows

Đã nghe qua Docker từ lâu nhưng gần đây mới thấy bản thân tôi hơi "nhà quê" khi mà hiện tại vẫn chỉ đang biết xài XAMPP để làm môi trường cho các dự án web mà không nghĩ đến các phương thức tốt hơn. Thế là với một phút ngẫu hứng ấy, tôi đã lặn lội đi tìm hiểu, mày mò vọc vạch Docker và hiện tại thì đang nghiện sử dụng nó luôn, làm cái gì cũng nghĩ đến Docker, hic.

Docker hay cực.


Về khái niệm thì tôi sẽ không đề cập tới vì nó đã có quá nhiều trên mạng rồi. Ở bài này tôi sẽ hướng dẫn bạn "nô đùa" với Docker theo một tầm nhìn cơ bản nhất có thể đối với người mới tìm hiểu. Cụ thể là tôi sẽ hướng dẫn cho bạn cách cài đặt một môi trường lập trình với ANMP (Alpine, Nginx, MariaDB, PhpMyAdmin). Ở thời điểm hiện tại thì tôi đang sử dụng Laradock để xây dựng môi trường làm dự án, đây chỉ làm một bài viết hướng dẫn cơ bản để lưu lại những kiến thức tôi đã học ở những ngày đầu, nếu có nhu cầu thì bạn có thể yêu cầu tôi viết một bài hướng dẫn thêm để cai đặt môi trường làm việc trên Laradock nhé.

Các thông tin cơ bản:
  • Hệ điều hành: Windows 10
  • Images:
    • trafex/alpine-nginx-php7: đây là một image cài đặt môi trường Nginx-PHP dựa trên mã nguồn phân tán Alpine của Linux, sở dĩ tôi tìm Alpine để sử dụng thay cho Ubuntu hay CentOS là vì nó "cực kỳ nhẹ" với khoảng dưới 35Mb và hoạt động cũng khá ổn. Nói cho dễ hiểu thì đây là một image được tổng hợp từ 3 image khác là alpine, nginx và php.
    • mariadb: hệ quản trị CSDL, tương tự với MySQL
    • phpmyadmin: giao diện quản trị CSDL.

#1. Cài đặt Docker Desktop


Duh, muốn xài Docker thì phải cài Docker. Bạn có thể tải Docker Desktop tại đường link này. Tôi nghĩ việc cài đặt sẽ không quá khó khăn nếu bạn đang đọc và hiểu bài viết hiện tại. Sau khi công cuộc cài đặt hoàn tất thì chúng ta có thể bắt đầu nô đùa cùng Docker.

Vào terminal, gõ lệnh docker version để xem Docker đã được cài đặt chưa. (Terminal mà tôi đang sử dụng là cmder, bạn có thể tham khảo nó ở đây)

Kiểm tra phiên bản Docker


#2. Tải các Image cần thiết


Nếu bạn đã tìm hiểu sơ về khái niệm của Docker thì chắc hẳn bạn đã mường tượng được Image và Container là gì rồi nhỉ? Nếu vẫn chưa hiểu thì cũng không sao, bạn sẽ hiểu được bản chất và công dụng của chúng trong quá trình đọc bài viết này.

Giờ chúng ta sẽ bắt đầu tải các Image về lần lượt với các lệnh:

docker pull trafex/alpine-nginx-php7
docker pull mariadb
docker pull phpmyadmin

hoặc đơn giản hơn là:

docker pull trafex/alpine-nginx-php7 mariadb phpmyadmin

Sau khi pull xong thì xem danh sách các images đã tải về với lệnh docker images

Danh sách các image trong Docker 

#3. Khởi tạo server Nginx-PHP


Sau khi đã chuẩn bị mọi thứ mà ta cần thì công việc tiếp theo là bắt đầu thực hiện chạy môi trường dự án, chúng ta sẽ thực hiện chạy image đầu tiên với docker run

docker run -p 80:8080 --network workspace -d -v F:/projectname:/var/www/html --name nginx trafex/alpine-nginx-php7

Chúng ta sử dụng lệnh run để chạy image vào container, vì cấu hình của image này sử dụng port 8080 ở Docker và port 80 ở máy host nên ta để thông số [public port]:[private port] với tùy chọn -p.
Nếu không muốn terminal tiếp tục theo dõi sự kiện container sau khi chạy thì ta phải chạy detach mode với tùy chọn -d, tùy chọn --name được sử dụng để đặt tên cho container. Cuối cùng là tên của image để Docker biết là cần phải chạy image nào vào container.

Tùy chọn --network để kết nối container này vào một mạng nội bộ, nơi các container có thể kết nối với nhau (ví dụ phpmyadmin cần kết nối với mysql).

Còn một tùy chọn mà tôi chưa nhắc tới là -v, đây là tùy chọn để "nối" thư mục dự án ở máy của bạn với thư mục chạy web trong môi trường Docker. Bạn có thể tìm hiểu khái niệm về volume trên trang tài liệu hướng dẫn của Docker. Thay "F:/projectname" bằng đường dẫn vào thư mục dự án của bạn để những thay đổi bạn thực hiện ở folder này tác động trực tiếp đến thư mục dự án trong container đã tạo.

Sau khi chạy hãy thử truy cập http://localhost xem bạn đã khởi tạo thành công container này chưa.

#4. Khởi tạo mariadb


docker run -p 3306:3306 -d --network workspace -e MYSQL_ROOT_PASSWORD=root --name my_mariadb mariadb

Ngoài những tùy chọn quen thuộc trong câu lệnh mà tôi đã giải thích thì còn có tùy chọn -e để cài đặt các biến môi trường (environment) của mariadb, ở đây chúng ta sẽ mặc định user là root và mật khẩu cũng là root.

#5. Khởi tạo phpmyadmin


docker run -p 8080:80 -d --network workspace --link my_mariadb:db --name phpmyadmin

Có một tùy chọn mới là --link dùng để liên kết với container database hiện tại của chúng ta và trước đó chúng ta đã đặt tên nó là my_mariadb.

Sau khi chạy hãy truy cập thử http://localhost:8080 và đăng nhập với tài khoản root/root.

Hãy viết thử một đoạn script PHP để kiểm tra kết nối đến database xem mọi thứ đã thực sự hoạt động chưa. Đoạn script sẽ có 3 thông số cơ bản là host, username và password.
Để tìm được host thì bạn hãy sử dụng lệnh docker network inspect workspace và kéo xuống xem địa chỉ IP của container có tên my_mariadb, đó chính là thông số host mà bạn đang tìm kiếm.
Sau khi kiểm tra kết nối thành công thì bạn đã cấu hình xong môi trường rồi.

Muốn xem các container đang chạy bạn hãy chuột phải vào icon Docker trên thanh taskbar windows và chọn Dashboard. Ở đây bạn có thể dừng, chạy, bật terminal hoặc xóa một container nào đó.

Docker Dashboard


Lưu ý rằng đây chỉ là một môi trường PHP cơ bản với một số extension và những thông số cơ bản nên có thể sẽ bị thiếu nhiều thứ để chạy một dự án PHP phức tạp hơn. Tuy nhiên tôi sẽ bổ sung những thông tin sâu hơn nếu bạn có nhu cầu muốn hỏi, hãy comment bên dưới nhé.

Cảm ơn bạn đã đọc bài viết này.

- Thien Nguyen