Công ty tôi có một máy chủ cũ chạy Ubuntu 18 - tỉ số ngoại hạng anh

/imgposts/ute5ddhj.jpg

Theo quan điểm của tôi, Docker vẫn còn khá phức tạp. Có lẽ do tôi sử dụng nó không đủ thường xuyên hoặc các trường hợp ứng dụng cũng tương đối đơn giản. Khi gặp phải những cấu hình phức tạp hơn, tôi thường cảm thấy thiếu tự tin. Tuy nhiên, nhờ vào việc tham khảo vài tài liệu chính thức về hình ảnh Docker và các tệp cấu cá độ bóng đá hình Docker Composer được chia sẻ trên GitHub trong hai ngày qua, tôi đã có thêm một chút hiểu biết.

Thực hành chính là con đường ngắn nhất để nắm bắt Docker. Chỉ đọc sách thôi thì chưa đủ. Tôi đã cố gắng đọc hai cuốn sách trên WeChat Reading nhưng không thể tiếp tục vì chúng quá khó hiểu, ví dụ không thực tế và thiếu giá trị thực tiễn. Nhiều bài viết về Docker trên các trang công khai cũng chỉ là sự sao chép từ người này sang người khác, trông như thể chúng sẽ không hoạt động. Điều này không bằng việc thử nghiệm theo hướng dẫn từ các tệp cấu hình Docker mở nguồn trên GitHub và áp dụng trực tiếp trên máy chủ. (Do các trang tải hình ảnh Docker trong nước gần đây bị chặn, độ khó trong việc thực hành trên máy cục bộ đã tăng lên đáng kể.)

Công ty tôi có một máy chủ cũ chạy Ubuntu 18.04, phiên bản này xa phía sau so với Ubuntu 24.04 LTS mới nhất. Tuy nhiên, trên đó đang chứa rất nhiều hệ thống, nên tôi không dám di chuyển dữ liệu. Nhưng hầu hết các dịch vụ đang chạy đều được viết bằng Golang, do đó, dù hệ điều hành có cũ đến đâu cũng không thành vấn đề, bởi khả năng đóng gói của Golang là vô địch. Tuy nhiên, khi triển khai dự án PHP lại là một nỗi đau đầu lớn. Phiên bản PHP mới nhất không thể cài đặt trên hệ thống Ubuntu 18.04 này, vì vậy giải pháp duy nhất là sử dụng Docker. Hiện nay, hầu hết các dự án PHP phổ biến đều phụ thuộc vào Composer để cài đặt, chẳng hạn như Laravel và Magento2.

Composer là công cụ quản lý gói của PHP. Nó chỉ dùng để cài đặt các gói PHP bên thứ ba. Để cài đặt Composer, hệ thống cần có môi trường PHP CLI. Do đó, việc cài đặt Composer vào hình ảnh Docker PHP là điều tất yếu.

Ví dụ, để tạo một dự án Laravel mới, bạn có thể sử dụng lệnh Composer sau:

composer create-project laravel/laravel:^10.0 example-app

Tạo một tệp cấu hình Docker Compose:

1services:
2  phpfpm:
3    build: ./php8.3
4    ports:
5      - "9000:9000"
6    volumes:
7      - /var/www/html:/var/www/html

Trong thư mục php8.3, tạo một tệp Dockerfile, sử dụng hình ảnh chính thức của Docker PHP FPM. Thêm lệnh cài đặt Composer vào file này.

1FROM php:8.3-fpm
2RUN curl -sS  | \
3    php -- --version=2.7.7 --install-dir=/usr/local/bin --filename=composer
4WORKDIR /var/www/html

Lưu ý rằng phiên bản Composer phải được xác định chính xác đến phần thứ ba, ví dụ 2.7.7, không thể chỉ ghi 2.7. Nếu không, khi xây dựng hình ảnh, sẽ xuất hiện lỗi sau:

The defined install version (2.7) does not match release pattern.
failed to solve: process "xxx" did not complete successfully: exit code: 1

Phiên bản cụ thể của Composer có thể tìm thấy tại địa chỉ .

Để đảm bảo Composer đã được cài đặt thành công, bạn tỉ số ngoại hạng anh có thể sử dụng lệnh sau để kiểm tra phiên bản của Composer:

$ docker compose exec phpfpm composer --version
Composer version 2.7.7 2024-06-10 22:11:12
PHP version 8.3.8 (/usr/local/bin/php)
Run the "diagnose" command to get more detailed diagnostics output.

Cách sử dụng này tương tự như khi cài đặt MySQL trong Docker và sử dụng lệnh client MySQL thông qua exec:

$ docker compose exec mysql /bin/bash

Ví dụ, sử dụng Composer để tạo một dự án Magento2 (phiên bản cộng đồng):

$ docker compose exec phpfpm composer create-project --repository-url= magento/project-community-edition <tên-thư-mục-cài-đặt>

Composer sẽ tự động tải xuống phiên bản Magento2 mới nhất, ví dụ như 2.4.7-p1 ở đây.

Lưu ý: install-directory-name ở đây là địa chỉ thư mục bên trong container Docker, không phải tên thư mục trên máy chủ chính.

Lần đầu tiên tôi sử dụng Composer trong Docker để cài đặt Magento, sau khi cài xong, tôi không thể tìm thấy vị trí của thư mục cài đặt...

Mặc dù đã chỉ định install-directory-name, nhưng thực tế, đây là địa chỉ thư mục bên trong container Docker, không phải địa chỉ trên máy chủ chính. Điều này thực sự đi ngược lại trực giác. Tuy nhiên, khi suy nghĩ kỹ, điều này hoàn toàn hợp lý, vì PHP trong Docker chỉ có thể truy cập vào các tệp cùng nằm trong container đó.

Bạn có thể đăng nhập vào container chứa Composer để xem thư mục này:

docker compose exec phpfpm /bin/bash

Chỉ cần lưu ý rằng tốt nhất nên ánh xạ thư mục này đến một thư mục trên máy chủ chính thông qua Docker Compose. Vì tôi thường cài đặt Nginx trên máy chủ chính, điều này giúp Nginx xử lý các tập tin tài nguyên tĩnh một cách hiệu quả hơn.