Ngày nay, mọi thứ hoạt động tốt hơn khi sử dụng Docker để thiết lập môi trường cục bộ thay vì cài đặt cục bộ PHP và các phụ thuộc khác. Khi bắt đầu các dự án PHP mới, Dockerfiles được sao chép từ cơ sở mã này sang cơ sở mã khác vì mỗi dự án yêu cầu các phụ thuộc cơ bản tương tự để chạy. Điều đó gây khó khăn cho việc duy trì các thay đổi đối với vùng chứa
Để tránh điều này tại TeleSoftas, chúng tôi đã nảy ra ý tưởng có một hình ảnh cơ sở đơn giản, giúp đơn giản hóa việc phát triển và bảo trì các dự án của chúng tôi. Hình ảnh này được xuất bản trên DockerHub, giúp bắt đầu một dự án mới dễ dàng bằng cách giảm số lượng mã cần thiết
Giải phápChúng ta hãy xem Dockerfile hình ảnh PHP cơ bản cần thiết để chạy một ứng dụng Symfony
FROM php:8.1-fpm-alpine
RUN addgroup -g 1000 -S app && \
adduser -u 1000 -S app -G app
RUN apk add \
autoconf \
build-base \
git
RUN docker-php-ext-install pdo_mysql
RUN pecl install apcu-5.1.21
RUN docker-php-ext-enable apcu opcache
COPY --from=composer:2.1 /usr/bin/composer /usr/local/bin/composer
Không chỉ vậy, cấu hình đơn giản này còn hoạt động cho các dự án PHP đơn giản cũng như Laravel. Sao chép cùng một Dockerfile và duy trì nó thông qua tất cả các dự án trở nên hơi khó khăn và lộn xộn, vậy tại sao không làm cho nó đơn giản hơn?
Để tránh tạo Dockerfile mới cho từng dự án, bạn có thể xuất bản nó lên DockerHub và kéo nó qua docker-compose. yml trực tiếp từ nó. Và việc xây dựng hình ảnh đơn giản chỉ bằng một vài lệnh — đăng nhập vào tài khoản DockerHub của bạn, xây dựng hình ảnh và đẩy nó lên
docker login -u -p docker.iodocker build -t index.docker.io//php:8.1 .docker push index.docker.io//php:8.1Sử dụng hình ảnh mới được tạo
Đầu tiên, tạo một docker-compose. yml với cấu hình dịch vụ sau
version: '3.7'
services:
php:
image: /php:8.1user: app
volumes:
- ./app:/srv/app
Giờ đây, bạn có thể bỏ qua việc xây dựng hình ảnh cục bộ và nó sẽ được lấy từ DockerHub. Bằng cách này, bạn tránh được sự trùng lặp Dockerfile giữa các dự án và giúp dễ dàng bảo trì
Điều này hữu ích khi tạo một dự án Symfony/Laravel mới từ đầu hoặc, ví dụ, thực thi một số mã PHP cục bộ, bởi vì Docker ngày nay phổ biến hơn so với việc có tất cả các thư viện trên máy chủ của bạn
Đôi khi bạn cần một số phụ thuộc trong một dự án và không cần chúng trong một dự án khác. Điều đó cũng dễ thực hiện bằng cách sử dụng hình ảnh mới được xuất bản. Ví dụ: trên một số dự án, bạn có thể cần XDebug hoặc một số thư viện bổ sung khác khi phát triển cục bộ. Để giải quyết vấn đề này, bạn có thể tạo một Dockerfile nhỏ, tệp này sẽ kéo hình ảnh cơ sở và thêm các thư viện cần thiết lên trên nó
FROM /php:8.1RUN pecl install xdebug-3.1.1RUN docker-php-ext-enable xdebug
Tiếp theo, mở rộng docker-compose của bạn. cấu hình yml
version: '3.7'
services:
php:
build: .
user: app
volumes:
- ./app:/srv/app
Và nó đơn giản như thế này. Không có mã trùng lặp và các phụ thuộc cơ bản dễ bảo trì trên tất cả các dự án. Bạn có thể thêm nhiều hoặc ít tùy chỉnh vào Dockerfile cục bộ này nếu cần
Tự động xuất bản lên DockerhubGiả sử bạn cần nâng Trình soạn thảo lên phiên bản mới hơn trong hình ảnh cơ sở của mình. Để làm điều này, bạn phải cập nhật Dockerfile của chúng tôi, đăng nhập vào DockerHub, xây dựng hình ảnh và xuất bản nó. Bạn có thể đơn giản hóa điều này bằng cách tự động hóa các giai đoạn xây dựng và xuất bản quy trình của bạn
Đối với hướng dẫn này, tôi đã chọn GitLab làm kho lưu trữ mã nguồn và tạo một. gitlab-ci. yml với cấu hình sau để tự động hóa toàn bộ quá trình
stages:
- build
variables:
IMAGE_VERSION: '8.1'
build:
stage: build
image: docker:latest
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
script:
- docker build --pull -t $CI_REGISTRY_IMAGE:$IMAGE_VERSION .
- docker push $CI_REGISTRY_IMAGE:$IMAGE_VERSION
Chỉ còn một bước nữa — xác định các biến trong cài đặt CI/CD của dự án
CI_REGISTRY=docker.io
CI_REGISTRY_IMAGE=index.docker.io//phpCI_REGISTRY_USER=
CI_REGISTRY_PASSWORD=
Khi bạn đẩy hình ảnh đã cập nhật lên GitLab, hình ảnh sẽ được tạo và đẩy lên DockerHub sau khi quy trình kết thúc. Cấu hình này có thể dễ dàng thích ứng với Bitbucket hoặc Github bằng cách làm theo hướng dẫn thiết lập đường dẫn của họ
Tóm lượcChỉ có một bước quan trọng cần thực hiện — quyết định những gì được yêu cầu trong hình ảnh cơ sở của bạn, xây dựng nó và xuất bản nó lên DockerHub. Và đó là những gì có thể được thực hiện
- Tạo hai kho lưu trữ cho PHP 8. 0 và 8. 1 hình ảnh docker
- Tạo Dockerfile và thêm cấu hình CI để tự động hóa toàn bộ quy trình
- Gắn thẻ hình ảnh và đẩy nó vào sổ đăng ký hình ảnh DockerHub sau khi quy trình kết thúc. Và đó là nó. Đó là cách bạn có thể đơn giản hóa quá trình phát triển của mình một chút
Điều này không chỉ mang lại lợi ích cho các dự án hiện có mà cả những dự án mới. Nó giúp dễ dàng duy trì tất cả các ứng dụng — nếu cần có thư viện hoặc gói mới để phiên bản Symfony mới nhất hoạt động, chỉ cần cập nhật hình ảnh cơ sở một lần và nó đã có sẵn trong tất cả các dự án
Đi xa hơnNgoài những cải tiến đã đề cập trước đó, có thể đơn giản hóa toàn bộ cấu hình ngăn xếp phát triển hơn nữa. Ví dụ này dành cho PHP, nhưng quy trình tương tự có thể được điều chỉnh cho các vùng chứa khác, chẳng hạn như Nginx. Ví dụ: có thể có yêu cầu giảm đăng nhập trong hầu hết các dự án. Để thực hiện điều này, bạn có thể tạo một hình ảnh cơ sở Nginx mới với loại trừ nhật ký và sử dụng lại nó