Chạy docker-php-ext-install pdo_mysql mbstring zip exif pcntl

Mặc dù ngày càng nhận được nhiều lời gièm pha và đối thủ cạnh tranh, PHP vẫn chống lại cái chết. Theo thống kê của W3, gần 78,1% trang web sử dụng PHP làm ngôn ngữ máy chủ

Do đó, với tư cách là DevOps, rất có thể chúng ta sẽ thấy mình đang “dockerizing” một ứng dụng bằng ngôn ngữ này vào lúc này hay lúc khác

Trong mục này, chúng ta sẽ khám phá cách PHP hoạt động và các bước cần thiết để triển khai kiến ​​trúc microservice. Chúng tôi đang lấy ví dụ về một ứng dụng đơn giản sử dụng Laravel framework

Chúng ta sẽ bắt đầu với phần tổng quan về kiến ​​trúc mà chúng ta muốn cập bến, tiếp theo là đánh giá cấu trúc thư mục của một dự án Laravel. Cuối cùng, chúng tôi sẽ thiết lập dockerfile và dockercompose để đánh giá cao kết quả

điều kiện tiên quyết

Vừa học vừa làm là tốt nhất. Vì vậy, trong trường hợp bạn không thiết lập dockerization PHP, bạn nên cài đặt các tài nguyên sau khi đọc bài đăng này

#Docker

#Docker soạn

#lặn

#mã ứng dụng

Cấu trúc

Trước khi tìm hiểu các đặc điểm riêng của dự án của chúng ta, điều quan trọng là phải hiểu cấu trúc tiêu chuẩn của các dự án Laravel

Để cập nhật ứng dụng của chúng tôi, hiện tại không cần thiết phải đi vào chi tiết, vì vậy tôi sẽ chỉ đề cập đến các thư mục và tệp mà chúng tôi sẽ sử dụng nhiều nhất

  • ứng dụng. Thư mục chứa mã nguồn của ứng dụng
  • khởi động. Đây là các tập lệnh bootstraps bắt đầu chạy ngay khi ứng dụng bắt đầu chuẩn bị môi trường để thực thi
  • cấu hình. tệp và tham số cấu hình
  • cơ sở dữ liệu. Trong thư mục này, chúng tôi sẽ tìm thấy các tệp cần thiết để cơ sở dữ liệu hoạt động chính xác. Điều quan trọng là phải ghi nhớ nó do hai thư mục con của nó.
    • Hạt giống. chứa các tệp sẽ được sử dụng để điền vào cơ sở dữ liệu
    • di cư. chứa các tệp cần thiết để tạo di chuyển. Các hạt giống cũng như các đợt di cư sẽ thường xuyên hoạt động trong các giai đoạn phát triển
  • công khai. Nội dung của nó bao gồm một chỉ mục. cần có tệp php để khởi động ứng dụng
  • tài nguyên. Trọng tâm chính của thư mục này là thư mục con dạng xem, nơi có thể tìm thấy HTML tương tác với người dùng
  • nhà cung cấp. Thư mục này sẽ rất quan trọng. Laravel sử dụng Composer làm quản trị viên phụ thuộc của nó. Mỗi phụ thuộc được cài đặt với Trình soạn thảo sẽ được lưu trong thư mục này. Chúng đóng một vai trò khi chúng tôi sử dụng các bản dựng nhiều giai đoạn.

CÁC BIẾN SỐ MÔI TRƯỜNG

Các ứng dụng phát triển các cấu hình cụ thể bắt đầu từ các biến môi trường được giữ trong một. tập tin env

Do chúng có thể chứa thông tin nhạy cảm và để tránh sự cố trong cấu hình giữa các thiết bị, tệp này phải được đưa vào tệp. gitignore. Mỗi nhà phát triển phải có một. env. tệp ví dụ với các giá trị mặc định. Đây là tệp thường được chia sẻ trong kho lưu trữ

Một. tệp env có thể có các biến khác nhau tùy thuộc vào các thành phần được sử dụng, trong blogpost này, chúng tôi sẽ đặc biệt làm việc với các trường sau

APP_ENV = 
APP_DEBUG = 
APP_KEY = 
APP_URL = 
#Parametros para conexion con base de datos MySQL
DB_CONNECTION = 
DB_HOST = 
DB_PORT = 
DB_DATABASE = 
DB_USERNAME = 
DB_PASSWORD = 
#Parametros para conexion con Redis
REDIS_HOST = 
REDIS_PASSWORD = 
REDIS_PORT = 

Khi chúng tôi tiếp tục với quá trình cập cảng, các giá trị tương ứng sẽ được hoàn thành

Ngành kiến ​​​​trúc

Khi chúng tôi neo đậu, điều cơ bản là xác định các dịch vụ siêu nhỏ và cách chúng sẽ liên kết với nhau

cân nhắc

  • Mỗi ứng dụng Laravel sẽ được phục vụ bởi một phiên bản NginX thích hợp làm máy chủ, được liên kết thông qua một mạng nội bộ-app-x
  • Cơ sở dữ liệu và bộ đệm Redis được chia sẻ bởi cả hai ứng dụng
  • Có một dự án-mạng bên ngoài mà tất cả các dịch vụ sẽ có thể kết nối
  • Laravel container hiển thị cổng 9000, là cổng mặc định của PHP-FPM
  • Phiên bản NginX ánh xạ cổng HTTP 80 thành 808x. Chúng tôi ánh xạ tới các số cổng tương đối cao để tránh các cổng dành riêng

Giới thiệu về PHP, máy chủ và CGI

Trước khi tiếp tục, tôi sẽ sử dụng không gian này để làm rõ một số chủ đề thường gây nhầm lẫn

  • PHP là ngôn ngữ có mục đích chung tập trung vào viết kịch bản cùng với máy chủ. . Các tệp php không tĩnh, chúng không thể phân phối mà không được xử lý trước đó. Do đó, máy chủ web sẽ gửi yêu cầu tới bộ phân tích PHP cho tác vụ này
  • CGI là giao thức chuẩn hóa nội dung sẽ được gửi đến bộ phân tích để xử lý yêu cầu. Nó thực chất là một giao thức để giao tiếp giữa các máy chủ web với phần mềm
  • FastCGI là một triển khai CGI giúp cải thiện hiệu suất tránh lặp lại các tác vụ không cần thiết
  • PHP-FPM [FastCGI Process Manager] là chương trình CGI chính thức được PHP chấp nhận, phân tích các yêu cầu, gọi trình thông dịch PHP và chuyển tiếp câu trả lời trở lại

Vì các máy chủ [NginX, Apache, v.v.] không thể thực thi mã PHP một cách tự nhiên, nên nó nhận được các yêu cầu HTTP sau đó chuyển đến PHP-FPM để được thực thi và cuối cùng truyền đạt kết quả

Tại sao chúng ta sử dụng NginX? Artisan không cung cấp máy chủ của riêng mình sao?

Những người đã chơi đùa một chút với mã PHP có thể đã sử dụng Artisan. phục vụ làm máy chủ. Tuy nhiên, nó chỉ là một máy chủ phát triển và nó không được khuyến nghị trong môi trường sản xuất. Nó hữu ích cho lưu lượng truy cập tối thiểu và không cung cấp các tùy chọn cấu hình ngoài máy chủ và cổng. Nếu cần chuyển hướng hoặc truy cập cấu hình đầu, artisan. phục vụ sẽ không thể thực hiện được.

Tuy nhiên, một vấn đề khác mà máy chủ tích hợp có thể xuất hiện là cùng một dịch vụ siêu nhỏ sẽ nhận và xử lý các yêu cầu HTTP, diễn giải mã PHP và đưa ra câu trả lời. Nó không phải là một cấu trúc đặc biệt hiệu quả

Những điểm này và thực tế là chúng tôi hướng đến việc tạo ra một dự án dễ dàng chuyển sang môi trường hiệu quả, chúng tôi chọn phân biệt giữa máy chủ và ứng dụng

Vậy…còn Apache thì sao?

Chúng tôi thực sự có thể sử dụng bất kỳ máy chủ nào khác cho dự án. Tuy nhiên, NginX là một bổ sung tuyệt vời cho PHP

NginX là một máy chủ hiệu suất cao, tiêu tốn ít bộ nhớ, dễ cấu hình, đó là lý do tại sao tác giả ưu tiên nó hơn nhiều máy chủ khác trong bài viết này

Dù bằng cách nào, cấu trúc microservice cho phép chúng tôi hoán đổi bất kỳ máy chủ nào chúng tôi ưu tiên cho NginX nếu chúng tôi chọn

Hãy Dockerize

Đã nêu phần trước, hãy bắt đầu với phần thú vị. cập bến ứng dụng

Dockerization sẽ sử dụng bản dựng nhiều giai đoạn. Trong giai đoạn đầu tiên, các gói phụ thuộc sẽ được tạo và trong giai đoạn thứ hai, chúng tôi sẽ sao chép kết quả của gói trước và cài đặt các thành phần khác

Giai đoạn 1. nhà soạn nhạc

Nhà soạn nhạc sử dụng nhà soạn nhạc. lock làm hướng dẫn cài đặt gói nào. Các gói được cài đặt trên thư mục vendor , đây là thư mục chúng ta nên sao chép trong bước tiếp theo.

Phiên bản trình soạn thảo sẽ phụ thuộc vào phiên bản PHP của ứng dụng của chúng tôi. Trong trường hợp cụ thể này, đó là nhà soạn nhạc 2. 1. 5

Để bắt đầu, chỉ có nhà soạn nhạc. json là cần thiết, nhưng các tệp khác có thể được yêu cầu cho các phần phụ thuộc khác nhau. Để tiếp tục với ví dụ của chúng tôi, chúng tôi cũng nên sao chép thư mục cơ sở dữ liệu vì một sơ đồ lớp. cơ sở dữ liệu được định nghĩa trên composer. tệp json .

Sau đó, quá trình cài đặt nhà soạn nhạc được thực hiện

nhà soạn nhạc. khóa vs nhà soạn nhạc. json. Sự hiện diện của cả hai tệp này có thể gây nhầm lẫn. Cân nhắc. nhà soạn nhạc. json là tệp mà nhà soạn nhạc sẽ đọc để cài đặt các phụ thuộc. Nó hoạt động như một hướng dẫn "chung", các ký tự đại diện có thể được đưa vào khi đến lúc xác định các phiên bản của gói. Vì vậy, tệp này cho biết gói nào PHẢI được cài đặt, không phải gói nào ĐÃ thực sự được cài đặt. Mặt khác, nhà soạn nhạc. lock được tạo bởi nhà soạn nhạc sau khi thực hiện cài đặt. Tệp này làm rõ những gói nào đã được cài đặt, cũng như các phiên bản của nó. Nó có thể được đưa vào dockerfile hoặc không, nhưng chúng tôi khuyên bạn nên đưa nó vào để đảm bảo các phiên bản của các phụ thuộc đã cài đặt

FROM composer:2.1.5 as vendor

WORKDIR /builder

# In the .jason composer there is a "classmap: database". So, copy data base folder:
COPY database/ database/
COPY composer.json ./

# Install dependencies definied in composer.json
# --no-interaction: It doesn't suposse interaction with the user
# --no-dev: It ignores the requiere-dev defined packages installment.
RUN composer install \
    --ignore-platform-reqs \
    --no-interaction \
    --no-plugins \
    --no-scripts \
    --prefer-dist

Lỗi trong giai đoạn này có thể phát sinh do các tùy chọn cài đặt mà ứng dụng yêu cầu. Ở đây có một số tùy chọn chung, nhưng chúng có thể thay đổi tùy theo trường hợp. Có thể tìm thấy các tùy chọn được nhà soạn nhạc thừa nhận trong liên kết này

giai đoạn 2. ấu trùng

Sử dụng hình ảnh PHP với alpine linux , chúng tôi sẽ cài đặt các phụ thuộc cần thiết và sao chép các gói được cài đặt bởi nhà soạn nhạc trong giai đoạn trước. Chúng tôi cũng sẽ sao chép tệp cấu hình php [nếu có] và mã ứng dụng.

FROM php:7.2-fpm-alpine3.12

WORKDIR /var/www

# Copy composer dependences installed in the previous stage
COPY --from=vendor /builder/vendor/ ./vendor/
# Install the system's dependencies.It depends on the apps'type
# We will install just the necessary for the blog case and to connect to MySQL.
# --no-cache: Once the installment is over, APK deletes unnecessary cache.
RUN apk update && apk add --no-cache \
    libpng \
    libpng-dev \
    libzip-dev && \
    docker-php-ext-install pdo_mysql exif pcntl bcmath gd zip 

# If there is a PHP config file in the directory,
# docker-config/php/config, copy it.
COPY docker-config/php/config/ $PHP_INI_DIR/conf.d/
# Copy the app code
COPY . .

docker-php-ext-cài đặt. tập lệnh đơn giản hóa cài đặt tiện ích mở rộng PHP. Thêm thông tin tại đây

Tại thời điểm này, chúng ta phải định cấu hình chính xác khoảng trống. Chúng tôi sẽ tạo một người dùng mới, sẽ có các tệp cần thiết để nâng cấp dịch vụ

# Create system's user
RUN adduser --disabled-password -u 1000 -h /home/php php \
    && addgroup php www-data \
    && addgroup php root


RUN chown -R php:www-data public/ storage/ bootstrap/cache/ && \
    chmod -R 0777  storage/ bootstrap/cache/ public/

Thay thế

Các ứng dụng có thể có nhiều tệp và kích thước của hình ảnh có thể tăng lên đáng kể nếu chúng tôi sao chép ở các lớp khác nhau hoặc sửa đổi giấy phép. Trong trường hợp này, chúng tôi có thể sao chép và sửa đổi khoảng trống trong một lệnh duy nhất [tạo một lớp duy nhất]. Điều này có thể đạt được với cờ —chown trong hướng dẫn COPY .

Phần sau đây nên được thay thế

COPY . .

RUN chown -R php:www-data public/ storage/ bootstrap/cache/ && \
    chmod -R 0777  storage/ bootstrap/cache/ public/

Trong trường hợp đầu tiên, chúng tôi đã sửa đổi khoảng trống cho một nhóm tệp cụ thể, trong trường hợp thứ hai, thành MỌI tệp được sao chép

Cuối cùng, cổng 9000 bị lộ và lệnh php-fpm được thực thi ngay sau khi vùng chứa được nâng lên.

# Expose the defult PHP-FPM port, for the sake of documentation 
EXPOSE 9000

# Start the PHP-FPM process. //linux.die.net/man/8/php-fpm
# -F: forces to stay in the forefront ignoring the background option
# if it were present in the config file
#  
CMD ["php-fpm", "-F", "-R"]

docker soạn

Đã xây dựng hình ảnh, đã đến lúc kiểm tra nó. Chúng ta nên tạo docker-compose của dự án

Để đơn giản hóa, trước tiên hãy kết nối ứng dụng và NginX .

services:
  example-api-1:
    image: "example-api-1:latest"
    build:
      context: ./
    container_name: example-api-1
    command: sh -c "php-fpm -F -R"
    env_file:
      - .env
    networks:
      - example-api-1-network

nginx-example-api-1:
    image: nginx:1.21.1-alpine
    container_name: nginx-example-api-1
    restart: unless-stopped
    ports:
      - "8080:80"
    networks:
      - example-api-1-network
    depends_on:
      - example-api-1

Để xây dựng dự án

docker-compose up --build

Sau đó, chúng tôi truy cập trang web localhost sau. 8080 để tìm thông báo chào mừng của Laravel

Thật tuyệt vời. Tại thời điểm này, chúng tôi có thể thực hiện các điều chỉnh cụ thể cho ứng dụng của mình và kết nối cơ sở dữ liệu

Trước đây, chúng tôi đã lướt qua. tập tin env. Bây giờ là lúc chúng ta bắt đầu hoàn thành nó

Đầu tiên chúng ta sẽ điền vào các khoảng trống dành riêng cho Laravel

  • APP_ENV. Được sử dụng để chỉ ra môi trường chúng ta đang ở, để kích hoạt một số cấu hình nhất định. Trong mã ứng dụng, bạn có thể yêu cầu giá trị của biến để nhanh chóng định cấu hình môi trường của ứng dụng của chúng tôi. Chúng tôi thường sử dụng cục bộ để biểu thị môi trường phát triển và sản xuất , cho
  • APP_DEBUG. Nó kiểm soát nếu thông tin làm sạch sẽ được hiển thị. Nó liên quan đến biến APP_ENV. Nếu đó là môi trường phát triển, APP_DEBUG có thể true , trong khi ở môi trường sản xuất thì nó PHẢI falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse
  • APP_KEY. Đó là một chuỗi 32 ký tự được sử dụng để mã hóa và giải mã các cookie đã gửi và nhận từ trình duyệt của khách hàng. Tính năng bảo mật này ngăn người dùng nhân cách hóa người dùng khác. Nếu chúng tôi không có giá trị của biến này, chúng tôi có thể lấy nó từ vùng chứa ứng dụng của chúng tôi
________số 8

Khi đó, chúng tôi thực hiện

php artisan key:generate
  • APP_URL. Nó xác định URL của ứng dụng của chúng tôi. Đó là một cách tốt để kiểm tra giá trị tương ứng của nó, vì một số gói bên ngoài đọc biến này trong quá trình cấu hình. Ví dụ: nếu chúng tôi dự định triển khai ứng dụng này trong một cụm kubernetes, thì đây là giá trị cần thiết. máy chủ cục bộ. 9000

Phần đầu tiên của chúng tôi. env, sẽ trông như thế này

FROM composer:2.1.5 as vendor

WORKDIR /builder

# In the .jason composer there is a "classmap: database". So, copy data base folder:
COPY database/ database/
COPY composer.json ./

# Install dependencies definied in composer.json
# --no-interaction: It doesn't suposse interaction with the user
# --no-dev: It ignores the requiere-dev defined packages installment.
RUN composer install \
    --ignore-platform-reqs \
    --no-interaction \
    --no-plugins \
    --no-scripts \
    --prefer-dist
0

Để đảm bảo mọi thứ đều ổn, đây là giai đoạn tốt để xây dựng lại hình ảnh và khởi động ứng dụng

Kết nối BD

Nếu chúng ta nhớ lại sơ đồ kiến ​​trúc, kết nối BD được thực hiện thông qua một mạng bên ngoài được chia sẻ với tất cả các dịch vụ. Vì vậy cần phải tạo mạng trước

Chúng ta phải thực thi lệnh docker, sau đó

FROM composer:2.1.5 as vendor

WORKDIR /builder

# In the .jason composer there is a "classmap: database". So, copy data base folder:
COPY database/ database/
COPY composer.json ./

# Install dependencies definied in composer.json
# --no-interaction: It doesn't suposse interaction with the user
# --no-dev: It ignores the requiere-dev defined packages installment.
RUN composer install \
    --ignore-platform-reqs \
    --no-interaction \
    --no-plugins \
    --no-scripts \
    --prefer-dist
1

Khi mạng này được tạo, chúng ta phải thêm nó vào danh sách mạng trong docker-compose. yaml và đặt từng dịch vụ để kết nối với nó

FROM composer:2.1.5 as vendor

WORKDIR /builder

# In the .jason composer there is a "classmap: database". So, copy data base folder:
COPY database/ database/
COPY composer.json ./

# Install dependencies definied in composer.json
# --no-interaction: It doesn't suposse interaction with the user
# --no-dev: It ignores the requiere-dev defined packages installment.
RUN composer install \
    --ignore-platform-reqs \
    --no-interaction \
    --no-plugins \
    --no-scripts \
    --prefer-dist
2

Bây giờ chúng tôi có thể kết nối với một phiên bản MySQL

Đầu tiên, chỉnh sửa docker-compose. yaml để xây dựng dịch vụ

FROM composer:2.1.5 as vendor

WORKDIR /builder

# In the .jason composer there is a "classmap: database". So, copy data base folder:
COPY database/ database/
COPY composer.json ./

# Install dependencies definied in composer.json
# --no-interaction: It doesn't suposse interaction with the user
# --no-dev: It ignores the requiere-dev defined packages installment.
RUN composer install \
    --ignore-platform-reqs \
    --no-interaction \
    --no-plugins \
    --no-scripts \
    --prefer-dist
3

Chúng tôi lấy thông tin đăng nhập và tên BD làm biến môi trường. Các giá trị đó phải khớp với các trường tương ứng trong. tập tin biến env. Sau đó hoàn thành

FROM composer:2.1.5 as vendor

WORKDIR /builder

# In the .jason composer there is a "classmap: database". So, copy data base folder:
COPY database/ database/
COPY composer.json ./

# Install dependencies definied in composer.json
# --no-interaction: It doesn't suposse interaction with the user
# --no-dev: It ignores the requiere-dev defined packages installment.
RUN composer install \
    --ignore-platform-reqs \
    --no-interaction \
    --no-plugins \
    --no-scripts \
    --prefer-dist
4

Trong cùng một tệp, sửa đổi lệnh được thực thi bởi example-api-1 để chạy di chuyển trong cơ sở dữ liệu. Bằng cách này, chúng tôi xác nhận kết nối là chính xác

Chúng tôi cũng phải chỉ định dịch vụ cơ sở dữ liệu là một phần phụ thuộc của dịch vụ API của chúng tôi

FROM composer:2.1.5 as vendor

WORKDIR /builder

# In the .jason composer there is a "classmap: database". So, copy data base folder:
COPY database/ database/
COPY composer.json ./

# Install dependencies definied in composer.json
# --no-interaction: It doesn't suposse interaction with the user
# --no-dev: It ignores the requiere-dev defined packages installment.
RUN composer install \
    --ignore-platform-reqs \
    --no-interaction \
    --no-plugins \
    --no-scripts \
    --prefer-dist
5

Lệnh di chuyển được thực thi mỗi khi nâng cấp dự án. Nếu không có di chuyển, nghệ nhân sẽ thông báo cho chúng tôi và bỏ qua nó

QUAN TRỌNG. Chạy di chuyển mỗi khi dự án được nâng cấp KHÔNG phải là ý tưởng hay trong môi trường hiệu quả. Chúng tôi định cấu hình theo cách này ngay bây giờ chỉ vì chúng tôi đang thực hành trong môi trường phát triển, để liên tục kiểm tra kết nối BD. Trong sản xuất, dự án nên được điều chỉnh cho từng trường hợp cụ thể. Ví dụ: chạy di chuyển theo cách thủ công

Chúng tôi cũng đã thêm độ trễ 10 phút trước khi chạy quá trình di chuyển để cung cấp thời gian cho dịch vụ BD hoàn toàn trực tuyến

Kết nối với Redis

Đối với giai đoạn này, chúng tôi bắt đầu bằng cách sửa đổi. tập tin env

FROM composer:2.1.5 as vendor

WORKDIR /builder

# In the .jason composer there is a "classmap: database". So, copy data base folder:
COPY database/ database/
COPY composer.json ./

# Install dependencies definied in composer.json
# --no-interaction: It doesn't suposse interaction with the user
# --no-dev: It ignores the requiere-dev defined packages installment.
RUN composer install \
    --ignore-platform-reqs \
    --no-interaction \
    --no-plugins \
    --no-scripts \
    --prefer-dist
6

Sau đó, phần sau được thêm vào docker-compose. yml. Lưu ý rằng chúng tôi đang xem xét một mật khẩu trống và đã triển khai kiểm tra sức khỏe .

FROM composer:2.1.5 as vendor

WORKDIR /builder

# In the .jason composer there is a "classmap: database". So, copy data base folder:
COPY database/ database/
COPY composer.json ./

# Install dependencies definied in composer.json
# --no-interaction: It doesn't suposse interaction with the user
# --no-dev: It ignores the requiere-dev defined packages installment.
RUN composer install \
    --ignore-platform-reqs \
    --no-interaction \
    --no-plugins \
    --no-scripts \
    --prefer-dist
7

Cuối cùng, điều cơ bản là cài đặt trình kết nối PHP cho Redis. Sau đó, chúng tôi sửa đổi dockerfile của mình.

FROM composer:2.1.5 as vendor

WORKDIR /builder

# In the .jason composer there is a "classmap: database". So, copy data base folder:
COPY database/ database/
COPY composer.json ./

# Install dependencies definied in composer.json
# --no-interaction: It doesn't suposse interaction with the user
# --no-dev: It ignores the requiere-dev defined packages installment.
RUN composer install \
    --ignore-platform-reqs \
    --no-interaction \
    --no-plugins \
    --no-scripts \
    --prefer-dist
8

Sẳn sàng. Bây giờ chúng ta có một phiên bản Redis

Hãy xem xét thực tế rằng việc cài đặt trình kết nối redis php KHÔNG cung cấp CLI redis trong bộ chứa php. Để kiểm tra kết nối, cần phải thực hiện ở cấp mã

Đi sâu vào kết quả

Tôi không muốn kết thúc mục blog này mà không đề cập đến việc lặn. Nó là một công cụ rất hữu ích khi nói đến dockerizing. Nó cho phép chúng tôi phân tích các thay đổi của hình ảnh theo từng lớp, giúp chúng tôi hình dung những lớp nào chịu trách nhiệm tăng không gian mà hình ảnh sử dụng. Nó cũng cung cấp điểm “hiệu quả hình ảnh”, dựa trên số liệu xem xét không gian bị lãng phí tiềm năng dựa trên các tệp đã được sửa đổi trên nhiều lớp

Chỉ cần chia sẻ tên của hình ảnh chúng tôi muốn phân tích

FROM composer:2.1.5 as vendor

WORKDIR /builder

# In the .jason composer there is a "classmap: database". So, copy data base folder:
COPY database/ database/
COPY composer.json ./

# Install dependencies definied in composer.json
# --no-interaction: It doesn't suposse interaction with the user
# --no-dev: It ignores the requiere-dev defined packages installment.
RUN composer install \
    --ignore-platform-reqs \
    --no-interaction \
    --no-plugins \
    --no-scripts \
    --prefer-dist
9

Thực hiện cú bổ nhào. Đáng chú ý là các tệp không cần thiết đã được sao chép như dockerfile, tệp git, v.v.

dockerignore

Bạn nên thêm . dockerignore để tránh gửi daemon các tệp không cần thiết để xây dựng hình ảnh. Quá trình và cú pháp của nó rất giống với . gitignore một. Chúng tôi chỉ cần liệt kê các tệp và thư mục mà chúng tôi muốn bỏ qua. Trong trường hợp cụ thể này, chúng tôi có thể bao gồm thư mục node_modules, các thư mục có bài kiểm tra BD, v.v.

FROM php:7.2-fpm-alpine3.12

WORKDIR /var/www

# Copy composer dependences installed in the previous stage
COPY --from=vendor /builder/vendor/ ./vendor/
# Install the system's dependencies.It depends on the apps'type
# We will install just the necessary for the blog case and to connect to MySQL.
# --no-cache: Once the installment is over, APK deletes unnecessary cache.
RUN apk update && apk add --no-cache \
    libpng \
    libpng-dev \
    libzip-dev && \
    docker-php-ext-install pdo_mysql exif pcntl bcmath gd zip 

# If there is a PHP config file in the directory,
# docker-config/php/config, copy it.
COPY docker-config/php/config/ $PHP_INI_DIR/conf.d/
# Copy the app code
COPY . .
0

Phần kết luận

Trong suốt mục này, chúng ta đã xem xét cấu trúc của một dự án Laravel điển hình, đây là bước cần thiết đầu tiên để dockerize. tìm hiểu dự án . Sau đó, chúng tôi đã thiết lập một kiến ​​trúc microservices để sử dụng trên môi trường hiệu quả. Chúng tôi cũng đã tạo một docker-compose để giúp chúng tôi kiểm tra và cuối cùng, chúng tôi đã tạo một dockerfile bằng cách sử dụng bản dựng nhiều tầng.

Ngay cả bài viết khó được gọi là hướng dẫn cuối cùng , sự thật là mọi dự án đều khác nhau và các thay đổi nên được thực hiện để thích ứng với từng bối cảnh. Mục đích không phải là cung cấp một mẫu để sao chép-dán một cách mù quáng mà là để thu thập kinh nghiệm và chia sẻ chúng để bạn có thể cập bến một cách thú vị vào lần sau.

Nếu bạn đã từng chơi WarCraft, mục blog này sẽ là hướng dẫn giúp tăng trạng thái Devops của bạn +1

Tệp Docker cuối cùng

Dockerfile

FROM php:7.2-fpm-alpine3.12

WORKDIR /var/www

# Copy composer dependences installed in the previous stage
COPY --from=vendor /builder/vendor/ ./vendor/
# Install the system's dependencies.It depends on the apps'type
# We will install just the necessary for the blog case and to connect to MySQL.
# --no-cache: Once the installment is over, APK deletes unnecessary cache.
RUN apk update && apk add --no-cache \
    libpng \
    libpng-dev \
    libzip-dev && \
    docker-php-ext-install pdo_mysql exif pcntl bcmath gd zip 

# If there is a PHP config file in the directory,
# docker-config/php/config, copy it.
COPY docker-config/php/config/ $PHP_INI_DIR/conf.d/
# Copy the app code
COPY . .
1

soạn thảo docker. khoai mỡ

FROM php:7.2-fpm-alpine3.12

WORKDIR /var/www

# Copy composer dependences installed in the previous stage
COPY --from=vendor /builder/vendor/ ./vendor/
# Install the system's dependencies.It depends on the apps'type
# We will install just the necessary for the blog case and to connect to MySQL.
# --no-cache: Once the installment is over, APK deletes unnecessary cache.
RUN apk update && apk add --no-cache \
    libpng \
    libpng-dev \
    libzip-dev && \
    docker-php-ext-install pdo_mysql exif pcntl bcmath gd zip 

# If there is a PHP config file in the directory,
# docker-config/php/config, copy it.
COPY docker-config/php/config/ $PHP_INI_DIR/conf.d/
# Copy the app code
COPY . .
2

Xử lý sự cố

Lý tưởng nhất là mọi thứ diễn ra tốt đẹp. Tuy nhiên, một cái gì đó có thể đi sai. Đó là lý do tại sao có một danh sách một số lỗi [không phải tất cả] bạn có thể gặp thường xuyên

  1. “SQLSTATE[HY000] [1045] Quyền truy cập bị từ chối đối với người dùng”. Docker soạn phần tạo volumen cho dữ liệu BD. Trong các thử nghiệm của chúng tôi, chúng tôi có thể đã tạo âm lượng với dữ liệu sai. Dung dịch. loại bỏ thư mục âm lượng, xem lại cấu hình BD và xây dựng lại dự án
  2. “SQLSTATE[HY000] [2002] Kết nối bị từ chối”. Xác minh xem có xảy ra lỗi trong khi dịch vụ BD đang được xây dựng không. Nếu đúng như vậy, hãy thử tăng thời gian ngủ của dịch vụ PHP
  3. RuntimeException Các mật mã được hỗ trợ duy nhất là AES-128-CBC và AES-256-CBC với độ dài khóa chính xác. Xem lại khóa ứng dụng, thực thi từ bộ chứa PHP. khóa thủ công php. tạo , dán vào. env và xây dựng lại.
  4. https. //github. com/docker-library/docs/tree/master/php#e-package-php-xxx-has-no-installation-candidate ←Đọc trong trường hợp bạn sử dụng hình ảnh dựa trên Debian thay vì Alpine
  5. https. //github. com/docker-library/php/issues/1134 ← Phiên bản lỗi 3. 13 núi cao. Theo kinh nghiệm của tôi, địa phương của tôi đã không báo cáo lỗi, nhưng khi được đưa vào đường dẫn CI/CD, lỗi đã xuất hiện

Người giới thiệu

  • https. //www. hướng dẫn. com/laravel/laravel_application_structure. htm
  • https. // lập trình viên nhấp chuột. com/article/4189123222/
  • https. // tài liệu. Vương quốc Anh. đồng. uk/hệ điều hành/linux/php-fpm/phpfpmsetup. html
  • https. // ban ngày. com/the-composer-lock-file
  • https. //Blog. gougousis. net/file-permissions-the-painful-side-of-docker/

Craftech là gì?

Craftech là một nhóm phát triển cơ sở hạ tầng đáng tin cậy, nhanh nhẹn và giàu kinh nghiệm. Nhóm của chúng tôi chỉ bao gồm các kỹ sư, nhà thiết kế và quản lý cấp cao nhất. Craftech dựa vào việc sử dụng các phương pháp, công cụ, công nghệ và quy trình phát triển tăng tốc mới nhất để mang lại sự xuất sắc trong các giải pháp, giao tiếp và trải nghiệm khách hàng của chúng tôi

Nếu bạn có bất kỳ câu hỏi/vấn đề nào ở đây, vui lòng tham gia cùng chúng tôi trên cộng đồng Crafttech Slack và hỏi xung quanh

Chủ Đề